property-transformer-registry.spec.js 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  1. import {expect} from 'chai';
  2. import {format} from '@e22m4u/js-format';
  3. import {trimTransformer} from './builtin/index.js';
  4. import {toUpperCaseTransformer} from './builtin/index.js';
  5. import {toLowerCaseTransformer} from './builtin/index.js';
  6. import {toTitleCaseTransformer} from './builtin/index.js';
  7. import {PropertyTransformerRegistry} from './property-transformer-registry.js';
  8. describe('PropertyTransformerRegistry', function () {
  9. describe('addTransformer', function () {
  10. it('has builtin transformers', function () {
  11. const ptr = new PropertyTransformerRegistry();
  12. expect(ptr['_transformers']).to.be.eql({
  13. trim: trimTransformer,
  14. toUpperCase: toUpperCaseTransformer,
  15. toLowerCase: toLowerCaseTransformer,
  16. toTitleCase: toTitleCaseTransformer,
  17. });
  18. });
  19. it('adds a given transformer with the name', function () {
  20. const ptr = new PropertyTransformerRegistry();
  21. const myTransformer = () => undefined;
  22. const res = ptr.addTransformer('myTransformer', myTransformer);
  23. expect(res).to.be.eq(ptr);
  24. expect(ptr['_transformers']['myTransformer']).to.be.eq(myTransformer);
  25. });
  26. it('requires the given name to be a non-empty string', function () {
  27. const ptr = new PropertyTransformerRegistry();
  28. const throwable = v => () => ptr.addTransformer(v, () => undefined);
  29. const error = v =>
  30. format(
  31. 'A name of the property transformer must ' +
  32. 'be a non-empty String, but %s given.',
  33. v,
  34. );
  35. expect(throwable('')).to.throw(error('""'));
  36. expect(throwable(10)).to.throw(error('10'));
  37. expect(throwable(0)).to.throw(error('0'));
  38. expect(throwable(false)).to.throw(error('false'));
  39. expect(throwable(undefined)).to.throw(error('undefined'));
  40. expect(throwable(null)).to.throw(error('null'));
  41. expect(throwable({})).to.throw(error('Object'));
  42. expect(throwable([])).to.throw(error('Array'));
  43. expect(throwable(() => undefined)).to.throw(error('Function'));
  44. throwable('str')();
  45. });
  46. it('throws an error if the given name already exists', function () {
  47. const ptr = new PropertyTransformerRegistry();
  48. ptr.addTransformer('test', () => undefined);
  49. const throwable = () => ptr.addTransformer('test', () => undefined);
  50. expect(throwable).to.throw(
  51. 'The property transformer "test" is already defined.',
  52. );
  53. });
  54. it('requires the given transformer to be a function', function () {
  55. const ptr = new PropertyTransformerRegistry();
  56. const throwable = v => () => ptr.addTransformer('test', v);
  57. const error = v =>
  58. format(
  59. 'The property transformer "test" must be a Function, but %s given.',
  60. v,
  61. );
  62. expect(throwable('str')).to.throw(error('"str"'));
  63. expect(throwable('')).to.throw(error('""'));
  64. expect(throwable(10)).to.throw(error('10'));
  65. expect(throwable(0)).to.throw(error('0'));
  66. expect(throwable(false)).to.throw(error('false'));
  67. expect(throwable(undefined)).to.throw(error('undefined'));
  68. expect(throwable(null)).to.throw(error('null'));
  69. expect(throwable({})).to.throw(error('Object'));
  70. expect(throwable([])).to.throw(error('Array'));
  71. throwable(() => undefined)();
  72. });
  73. });
  74. describe('hasTransformer', function () {
  75. it('returns false for a not existing name', function () {
  76. const ptr = new PropertyTransformerRegistry();
  77. expect(ptr.hasTransformer('str')).to.be.false;
  78. expect(ptr.hasTransformer('')).to.be.false;
  79. expect(ptr.hasTransformer(10)).to.be.false;
  80. expect(ptr.hasTransformer(0)).to.be.false;
  81. expect(ptr.hasTransformer(true)).to.be.false;
  82. expect(ptr.hasTransformer(false)).to.be.false;
  83. expect(ptr.hasTransformer(null)).to.be.false;
  84. expect(ptr.hasTransformer(undefined)).to.be.false;
  85. expect(ptr.hasTransformer({})).to.be.false;
  86. expect(ptr.hasTransformer([])).to.be.false;
  87. expect(ptr.hasTransformer(() => undefined)).to.be.false;
  88. });
  89. it('returns true for an existing name', function () {
  90. const ptr = new PropertyTransformerRegistry();
  91. expect(ptr.hasTransformer('test')).to.be.false;
  92. ptr.addTransformer('test', () => undefined);
  93. expect(ptr.hasTransformer('test')).to.be.true;
  94. });
  95. });
  96. describe('getTransformer', function () {
  97. it('returns transformer by its name', function () {
  98. const ptr = new PropertyTransformerRegistry();
  99. const myTransformer1 = () => undefined;
  100. const myTransformer2 = () => undefined;
  101. ptr.addTransformer('foo', myTransformer1);
  102. ptr.addTransformer('bar', myTransformer2);
  103. const res1 = ptr.getTransformer('foo');
  104. const res2 = ptr.getTransformer('bar');
  105. expect(res1).to.be.eq(myTransformer1);
  106. expect(res2).to.be.eq(myTransformer2);
  107. });
  108. it('throws an error for a not existed name', function () {
  109. const ptr = new PropertyTransformerRegistry();
  110. const throwable = v => () => ptr.getTransformer(v);
  111. const error = v =>
  112. format('The property transformer %s is not defined.', v);
  113. expect(throwable('str')).to.throw(error('"str"'));
  114. expect(throwable('')).to.throw(error('""'));
  115. expect(throwable(10)).to.throw(error('10'));
  116. expect(throwable(0)).to.throw(error('0'));
  117. expect(throwable(true)).to.throw(error('true'));
  118. expect(throwable(false)).to.throw(error('false'));
  119. expect(throwable(null)).to.throw(error('null'));
  120. expect(throwable(undefined)).to.throw(error('undefined'));
  121. expect(throwable({})).to.throw(error('Object'));
  122. expect(throwable([])).to.throw(error('Array'));
  123. expect(throwable(() => undefined)).to.throw(error('Function'));
  124. });
  125. });
  126. });