DomainLockNodeTemplate.spec.ts 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374
  1. import 'reflect-metadata';
  2. import format from 'string-template';
  3. import { assert } from 'chai';
  4. import { ServiceIdentifiers } from '../../../../src/container/ServiceIdentifiers';
  5. import { ICryptUtils } from '../../../../src/interfaces/utils/ICryptUtils';
  6. import { IInversifyContainerFacade } from '../../../../src/interfaces/container/IInversifyContainerFacade';
  7. import { DomainLockNodeTemplate } from '../../../../src/templates/domain-lock-nodes/domain-lock-node/DomainLockNodeTemplate';
  8. import { GlobalVariableTemplate1 } from '../../../../src/templates/GlobalVariableTemplate1';
  9. import { InversifyContainerFacade } from '../../../../src/container/InversifyContainerFacade';
  10. /**
  11. * @param templateData
  12. * @param callsControllerFunctionName
  13. * @param currentDomain
  14. * @returns {Function}
  15. */
  16. function getFunctionFromTemplate (templateData: any, callsControllerFunctionName: string, currentDomain: string, hostname = false) {
  17. const domainLockTemplate: string = format(DomainLockNodeTemplate(), templateData);
  18. return Function(`
  19. document = {
  20. ${ !hostname ?
  21. `domain: '${currentDomain}'` :
  22. `location: { hostname: '${currentDomain}' }` }
  23. };
  24. var ${callsControllerFunctionName} = (function(){
  25. return function (context, fn){
  26. return function () {
  27. return fn.apply(context, arguments);
  28. };
  29. }
  30. })();
  31. ${domainLockTemplate}
  32. `)();
  33. }
  34. describe('DomainLockNodeTemplate', () => {
  35. const singleNodeCallControllerFunctionName: string = 'callsController';
  36. let cryptUtils: ICryptUtils;
  37. before(() => {
  38. const inversifyContainerFacade: IInversifyContainerFacade = new InversifyContainerFacade();
  39. inversifyContainerFacade.load('', {});
  40. cryptUtils = inversifyContainerFacade.get<ICryptUtils>(ServiceIdentifiers.ICryptUtils);
  41. });
  42. describe('Variant #1: current domain matches with `domainsString`', () => {
  43. const domainsString: string = ['www.example.com'].join(';');
  44. const currentDomain: string = 'www.example.com';
  45. let testFunc: () => void;
  46. before(() => {
  47. const [
  48. hiddenDomainsString,
  49. diff
  50. ] = cryptUtils.hideString(domainsString, domainsString.length * 3);
  51. testFunc = () => getFunctionFromTemplate({
  52. domainLockFunctionName: 'domainLockFunction',
  53. diff: diff,
  54. domains: hiddenDomainsString,
  55. globalVariableTemplate: GlobalVariableTemplate1(),
  56. singleNodeCallControllerFunctionName
  57. }, singleNodeCallControllerFunctionName, currentDomain);
  58. });
  59. it('should correctly run code inside template', () => {
  60. assert.doesNotThrow(testFunc);
  61. });
  62. });
  63. describe('Variant #2: current domain matches with base domain of `domainsString`', () => {
  64. const domainsString: string = ['.example.com'].join(';');
  65. const currentDomain: string = 'www.example.com';
  66. let testFunc: () => void;
  67. before(() => {
  68. const [
  69. hiddenDomainsString,
  70. diff
  71. ] = cryptUtils.hideString(domainsString, domainsString.length * 3);
  72. testFunc = () => getFunctionFromTemplate({
  73. domainLockFunctionName: 'domainLockFunction',
  74. diff: diff,
  75. domains: hiddenDomainsString,
  76. globalVariableTemplate: GlobalVariableTemplate1(),
  77. singleNodeCallControllerFunctionName
  78. }, singleNodeCallControllerFunctionName, currentDomain);
  79. });
  80. it('should correctly run code inside template', () => {
  81. assert.doesNotThrow(testFunc);
  82. });
  83. });
  84. describe('Variant #3: current domain matches with all domains of `domainsString`', () => {
  85. describe('Variant #1', () => {
  86. const domainsString: string = ['example.com', '.example.com'].join(';');
  87. const currentDomain: string = 'example.com';
  88. let testFunc: () => void;
  89. before(() => {
  90. const [
  91. hiddenDomainsString,
  92. diff
  93. ] = cryptUtils.hideString(domainsString, domainsString.length * 3);
  94. testFunc = () => getFunctionFromTemplate({
  95. domainLockFunctionName: 'domainLockFunction',
  96. diff: diff,
  97. domains: hiddenDomainsString,
  98. globalVariableTemplate: GlobalVariableTemplate1(),
  99. singleNodeCallControllerFunctionName
  100. }, singleNodeCallControllerFunctionName, currentDomain);
  101. });
  102. it('should correctly run code inside template', () => {
  103. assert.doesNotThrow(testFunc);
  104. });
  105. });
  106. describe('Variant #2', () => {
  107. const domainsString: string = ['example.com', '.example.com'].join(';');
  108. const currentDomain: string = 'subdomain.example.com';
  109. let testFunc: () => void;
  110. before(() => {
  111. const [
  112. hiddenDomainsString,
  113. diff
  114. ] = cryptUtils.hideString(domainsString, domainsString.length * 3);
  115. testFunc = () => getFunctionFromTemplate({
  116. domainLockFunctionName: 'domainLockFunction',
  117. diff: diff,
  118. domains: hiddenDomainsString,
  119. globalVariableTemplate: GlobalVariableTemplate1(),
  120. singleNodeCallControllerFunctionName
  121. }, singleNodeCallControllerFunctionName, currentDomain);
  122. });
  123. it('should correctly run code inside template', () => {
  124. assert.doesNotThrow(testFunc);
  125. });
  126. });
  127. describe('Variant #3', () => {
  128. const domainsString: string = ['.example.com', 'example.com'].join(';');
  129. const currentDomain: string = 'subdomain.example.com';
  130. let testFunc: () => void;
  131. before(() => {
  132. const [
  133. hiddenDomainsString,
  134. diff
  135. ] = cryptUtils.hideString(domainsString, domainsString.length * 3);
  136. testFunc = () => getFunctionFromTemplate({
  137. domainLockFunctionName: 'domainLockFunction',
  138. diff: diff,
  139. domains: hiddenDomainsString,
  140. globalVariableTemplate: GlobalVariableTemplate1(),
  141. singleNodeCallControllerFunctionName
  142. }, singleNodeCallControllerFunctionName, currentDomain);
  143. });
  144. it('should correctly run code inside template', () => {
  145. assert.doesNotThrow(testFunc);
  146. });
  147. });
  148. describe('Variant #4', () => {
  149. const domainsString: string = ['sub1.example.com', 'sub2.example.com'].join(';');
  150. const currentDomain: string = 'sub1.example.com';
  151. let testFunc: () => void;
  152. before(() => {
  153. const [
  154. hiddenDomainsString,
  155. diff
  156. ] = cryptUtils.hideString(domainsString, domainsString.length * 3);
  157. testFunc = () => getFunctionFromTemplate({
  158. domainLockFunctionName: 'domainLockFunction',
  159. diff: diff,
  160. domains: hiddenDomainsString,
  161. globalVariableTemplate: GlobalVariableTemplate1(),
  162. singleNodeCallControllerFunctionName
  163. }, singleNodeCallControllerFunctionName, currentDomain);
  164. });
  165. it('should correctly run code inside template', () => {
  166. assert.doesNotThrow(testFunc);
  167. });
  168. });
  169. });
  170. describe('Variant #4: current domain matches with base domain of `domainsString` item', () => {
  171. const domainsString: string = ['www.test.com', '.example.com'].join(';');
  172. const currentDomain: string = 'subdomain.example.com';
  173. let testFunc: () => void;
  174. before(() => {
  175. const [
  176. hiddenDomainsString,
  177. diff
  178. ] = cryptUtils.hideString(domainsString, domainsString.length * 3);
  179. testFunc = () => getFunctionFromTemplate({
  180. domainLockFunctionName: 'domainLockFunction',
  181. diff: diff,
  182. domains: hiddenDomainsString,
  183. globalVariableTemplate: GlobalVariableTemplate1(),
  184. singleNodeCallControllerFunctionName
  185. }, singleNodeCallControllerFunctionName, currentDomain);
  186. });
  187. it('should correctly run code inside template', () => {
  188. assert.doesNotThrow(testFunc);
  189. });
  190. });
  191. describe('Variant #5: current domain doesn\'t match with `domainsString`', () => {
  192. describe('Variant #1', () => {
  193. const domainsString: string = ['www.example.com'].join(';');
  194. const currentDomain: string = 'www.test.com';
  195. let testFunc: () => void;
  196. before(() => {
  197. const [
  198. hiddenDomainsString,
  199. diff
  200. ] = cryptUtils.hideString(domainsString, domainsString.length * 3);
  201. testFunc = () => getFunctionFromTemplate({
  202. domainLockFunctionName: 'domainLockFunction',
  203. diff: diff,
  204. domains: hiddenDomainsString,
  205. globalVariableTemplate: GlobalVariableTemplate1(),
  206. singleNodeCallControllerFunctionName
  207. }, singleNodeCallControllerFunctionName, currentDomain);
  208. });
  209. it('should throw an error', () => {
  210. assert.throws(testFunc);
  211. });
  212. });
  213. describe('Variant #2', () => {
  214. const domainsString: string = ['sub1.test.com', 'sub2.test.com'].join(';');
  215. const currentDomain: string = 'sub3.test.com';
  216. let testFunc: () => void;
  217. before(() => {
  218. const [
  219. hiddenDomainsString,
  220. diff
  221. ] = cryptUtils.hideString(domainsString, domainsString.length * 3);
  222. testFunc = () => getFunctionFromTemplate({
  223. domainLockFunctionName: 'domainLockFunction',
  224. diff: diff,
  225. domains: hiddenDomainsString,
  226. globalVariableTemplate: GlobalVariableTemplate1(),
  227. singleNodeCallControllerFunctionName
  228. }, singleNodeCallControllerFunctionName, currentDomain);
  229. });
  230. it('should throw an error', () => {
  231. assert.throws(testFunc);
  232. });
  233. });
  234. describe('Variant #3', () => {
  235. const domainsString: string = ['www.example.com', '.example.com', 'sub.test.com'].join(';');
  236. const currentDomain: string = 'www.test.com';
  237. let testFunc: () => void;
  238. before(() => {
  239. const [
  240. hiddenDomainsString,
  241. diff
  242. ] = cryptUtils.hideString(domainsString, domainsString.length * 3);
  243. testFunc = () => getFunctionFromTemplate({
  244. domainLockFunctionName: 'domainLockFunction',
  245. diff: diff,
  246. domains: hiddenDomainsString,
  247. globalVariableTemplate: GlobalVariableTemplate1(),
  248. singleNodeCallControllerFunctionName
  249. }, singleNodeCallControllerFunctionName, currentDomain);
  250. });
  251. it('should throw an error', () => {
  252. assert.throws(testFunc);
  253. });
  254. });
  255. });
  256. describe('Variant #6: current hostname matches with `domainsString`', () => {
  257. const domainsString: string = ['www.example.com'].join(';');
  258. const currentDomain: string = 'www.example.com';
  259. let testFunc: () => void;
  260. before(() => {
  261. const [
  262. hiddenDomainsString,
  263. diff
  264. ] = cryptUtils.hideString(domainsString, domainsString.length * 3);
  265. testFunc = () => getFunctionFromTemplate({
  266. domainLockFunctionName: 'domainLockFunction',
  267. diff: diff,
  268. domains: hiddenDomainsString,
  269. globalVariableTemplate: GlobalVariableTemplate1(),
  270. singleNodeCallControllerFunctionName
  271. }, singleNodeCallControllerFunctionName, currentDomain, true);
  272. });
  273. it('should correctly run code inside template', () => {
  274. assert.doesNotThrow(testFunc);
  275. });
  276. });
  277. describe('Variant #5: current hostname doesn\'t match with `domainsString`', () => {
  278. describe('Variant #1', () => {
  279. const domainsString: string = ['www.example.com'].join(';');
  280. const currentDomain: string = 'www.test.com';
  281. let testFunc: () => void;
  282. before(() => {
  283. const [
  284. hiddenDomainsString,
  285. diff
  286. ] = cryptUtils.hideString(domainsString, domainsString.length * 3);
  287. testFunc = () => getFunctionFromTemplate({
  288. domainLockFunctionName: 'domainLockFunction',
  289. diff: diff,
  290. domains: hiddenDomainsString,
  291. globalVariableTemplate: GlobalVariableTemplate1(),
  292. singleNodeCallControllerFunctionName
  293. }, singleNodeCallControllerFunctionName, currentDomain, true);
  294. });
  295. it('should throw an error', () => {
  296. assert.throws(testFunc);
  297. });
  298. });
  299. });
  300. });