locale.service.spec.ts 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319
  1. /**
  2. * @file Tests for the locale service.
  3. * @author Inigo Valentin
  4. * @since 4.0.0
  5. */
  6. // This fixes some encoding errors with Jest
  7. require('../../node_modules/mysql2/node_modules/iconv-lite/lib').encodingExists('foo');
  8. const httpMocks = require('node-mocks-http');
  9. const dotenv = require('dotenv');
  10. dotenv.config({path: './env/test.env'});
  11. const Lang = require("../models").langs;
  12. const Text = require("../models").texts;
  13. const LocaleService = require("./locale.service.js");
  14. test('Select language - empty request, english exists', async () => {
  15. const req = {query: {}, body: {}};
  16. var testLangs = []
  17. testLangs.push(Lang.build({'code': 'en', 'name': 'English', 'priority': 1, 'active': true}));
  18. testLangs.push(Lang.build({'code': 'es', 'name': 'Espanol', 'priority': 2, 'active': true}));
  19. jest.spyOn(Lang, 'findAll').mockImplementation(() => testLangs);
  20. const localeService = new LocaleService();
  21. await new Promise((r) => setTimeout(r, 30));
  22. const lang = localeService.selectLanguage(req);
  23. expect(lang).toBe("en");
  24. });
  25. test('Select language - empty request, english doesn\'t exists', async () => {
  26. const req = {query: {}, body: {}};
  27. var testLangs = []
  28. testLangs.push(Lang.build({'code': 'eu', 'name': 'Euskara', 'priority': 1, 'active': true}));
  29. testLangs.push(Lang.build({'code': 'es', 'name': 'Espanol', 'priority': 2, 'active': true}));
  30. jest.spyOn(Lang, 'findAll').mockImplementation(() => testLangs);
  31. const localeService = new LocaleService();
  32. await new Promise((r) => setTimeout(r, 30));
  33. const lang = localeService.selectLanguage(req);
  34. expect(lang).toBe("eu");
  35. });
  36. test('Select language - empty request, no languages defined', async () => {
  37. const req = {query: {}, body: {}};
  38. var testLangs = []
  39. jest.spyOn(Lang, 'findAll').mockImplementation(() => testLangs);
  40. const localeService = new LocaleService();
  41. await new Promise((r) => setTimeout(r, 30));
  42. const lang = localeService.selectLanguage(req);
  43. expect(lang).toBe("en");
  44. });
  45. test('Select language - existing language in query', async () => {
  46. const req = {query: {lang: "es"}, body: {}};
  47. var testLangs = []
  48. testLangs.push(Lang.build({'code': 'en', 'name': 'English', 'priority': 1, 'active': true}));
  49. testLangs.push(Lang.build({'code': 'es', 'name': 'Espanol', 'priority': 2, 'active': true}));
  50. jest.spyOn(Lang, 'findAll').mockImplementation(() => testLangs);
  51. const localeService = new LocaleService();
  52. await new Promise((r) => setTimeout(r, 30));
  53. const lang = localeService.selectLanguage(req);
  54. expect(lang).toBe("es");
  55. });
  56. test('Select language - existing language in body', async () => {
  57. const req = {query: {}, body: {lang: "es"}};
  58. var testLangs = []
  59. testLangs.push(Lang.build({'code': 'en', 'name': 'English', 'priority': 1, 'active': true}));
  60. testLangs.push(Lang.build({'code': 'es', 'name': 'Espanol', 'priority': 2, 'active': true}));
  61. jest.spyOn(Lang, 'findAll').mockImplementation(() => testLangs);
  62. const localeService = new LocaleService();
  63. await new Promise((r) => setTimeout(r, 30));
  64. const lang = localeService.selectLanguage(req);
  65. expect(lang).toBe("es");
  66. });
  67. test('Select language - non-existing language in query', async () => {
  68. const req = {query: {lang: "eu"}, body: {}};
  69. var testLangs = []
  70. testLangs.push(Lang.build({'code': 'en', 'name': 'English', 'priority': 1, 'active': true}));
  71. testLangs.push(Lang.build({'code': 'es', 'name': 'Espanol', 'priority': 2, 'active': true}));
  72. jest.spyOn(Lang, 'findAll').mockImplementation(() => testLangs);
  73. const localeService = new LocaleService();
  74. await new Promise((r) => setTimeout(r, 30));
  75. const lang = localeService.selectLanguage(req);
  76. expect(lang).toBe("en");
  77. });
  78. test('Select language - existing language in body', async () => {
  79. const req = {query: {}, body: {lang: "eu"}};
  80. var testLangs = []
  81. testLangs.push(Lang.build({'code': 'en', 'name': 'English', 'priority': 1, 'active': true}));
  82. testLangs.push(Lang.build({'code': 'es', 'name': 'Espanol', 'priority': 2, 'active': true}));
  83. jest.spyOn(Lang, 'findAll').mockImplementation(() => testLangs);
  84. const localeService = new LocaleService();
  85. await new Promise((r) => setTimeout(r, 30));
  86. const lang = localeService.selectLanguage(req);
  87. expect(lang).toBe("en");
  88. });
  89. test('Select language - existing but conflicting languages in in query and body', async () => {
  90. const req = {query: {lang: "es"}, body: {lang: "eu"}};
  91. var testLangs = []
  92. testLangs.push(Lang.build({'code': 'en', 'name': 'English', 'priority': 1, 'active': true}));
  93. testLangs.push(Lang.build({'code': 'es', 'name': 'Espanol', 'priority': 2, 'active': true}));
  94. testLangs.push(Lang.build({'code': 'eu', 'name': 'Euskara', 'priority': 3, 'active': true}));
  95. jest.spyOn(Lang, 'findAll').mockImplementation(() => testLangs);
  96. const localeService = new LocaleService();
  97. await new Promise((r) => setTimeout(r, 30));
  98. const lang = localeService.selectLanguage(req);
  99. expect(lang).toBe("eu");
  100. });
  101. test('Select language - non existing and conflicting languages in in query and body', async () => {
  102. const req = {query: {lang: "ru"}, body: {lang: "ja"}};
  103. var testLangs = []
  104. testLangs.push(Lang.build({'code': 'en', 'name': 'English', 'priority': 1, 'active': true}));
  105. testLangs.push(Lang.build({'code': 'es', 'name': 'Espanol', 'priority': 2, 'active': true}));
  106. testLangs.push(Lang.build({'code': 'eu', 'name': 'Euskara', 'priority': 3, 'active': true}));
  107. jest.spyOn(Lang, 'findAll').mockImplementation(() => testLangs);
  108. const localeService = new LocaleService();
  109. await new Promise((r) => setTimeout(r, 30));
  110. const lang = localeService.selectLanguage(req);
  111. expect(lang).toBe("en");
  112. });
  113. test('Select language - existing language in query, non existing language in body', async () => {
  114. const req = {query: {lang: "es"}, body: {lang: "ru"}};
  115. var testLangs = []
  116. testLangs.push(Lang.build({'code': 'en', 'name': 'English', 'priority': 1, 'active': true}));
  117. testLangs.push(Lang.build({'code': 'es', 'name': 'Espanol', 'priority': 2, 'active': true}));
  118. testLangs.push(Lang.build({'code': 'eu', 'name': 'Euskara', 'priority': 3, 'active': true}));
  119. jest.spyOn(Lang, 'findAll').mockImplementation(() => testLangs);
  120. const localeService = new LocaleService();
  121. await new Promise((r) => setTimeout(r, 30));
  122. const lang = localeService.selectLanguage(req);
  123. expect(lang).toBe("es");
  124. });
  125. test('Select language - non-existing language in query, existing language in body', async () => {
  126. const req = {query: {lang: "ru"}, body: {lang: "es"}};
  127. var testLangs = []
  128. testLangs.push(Lang.build({'code': 'en', 'name': 'English', 'priority': 1, 'active': true}));
  129. testLangs.push(Lang.build({'code': 'es', 'name': 'Espanol', 'priority': 2, 'active': true}));
  130. testLangs.push(Lang.build({'code': 'eu', 'name': 'Euskara', 'priority': 3, 'active': true}));
  131. jest.spyOn(Lang, 'findAll').mockImplementation(() => testLangs);
  132. const localeService = new LocaleService();
  133. await new Promise((r) => setTimeout(r, 30));
  134. const lang = localeService.selectLanguage(req);
  135. expect(lang).toBe("es");
  136. });
  137. test('Generate localized object - all available languages included', async () => {
  138. var testLangs = []
  139. testLangs.push(Lang.build({'code': 'en', 'name': 'English', 'priority': 1, 'active': true}));
  140. testLangs.push(Lang.build({'code': 'es', 'name': 'Espanol', 'priority': 2, 'active': true}));
  141. testLangs.push(Lang.build({'code': 'eu', 'name': 'Euskara', 'priority': 3, 'active': true}));
  142. jest.spyOn(Lang, 'findAll').mockImplementation(() => testLangs);
  143. const localeService = new LocaleService();
  144. await new Promise((r) => setTimeout(r, 30));
  145. const obj = localeService.generateLocalizedObject('{"es": "testes", "en": "testen", "eu": "testeu"}', "key", "section");
  146. expect(obj.valid).toBe(true);
  147. expect(obj.key).toBe("key");
  148. expect(obj.section).toBe("section");
  149. expect(Reflect.ownKeys(obj.texts).length).toBe(3);
  150. expect(obj.texts.es).toBe("testes");
  151. expect(obj.texts.en).toBe("testen");
  152. expect(obj.texts.eu).toBe("testeu");
  153. });
  154. test('Generate localized object - some available languages included', async () => {
  155. var testLangs = []
  156. testLangs.push(Lang.build({'code': 'en', 'name': 'English', 'priority': 1, 'active': true}));
  157. testLangs.push(Lang.build({'code': 'es', 'name': 'Espanol', 'priority': 2, 'active': true}));
  158. testLangs.push(Lang.build({'code': 'eu', 'name': 'Euskara', 'priority': 3, 'active': true}));
  159. jest.spyOn(Lang, 'findAll').mockImplementation(() => testLangs);
  160. const localeService = new LocaleService();
  161. await new Promise((r) => setTimeout(r, 30));
  162. const obj = localeService.generateLocalizedObject('{"es": "testes", "en": "testen"}', "key", "section");
  163. expect(obj.valid).toBe(true);
  164. expect(obj.key).toBe("key");
  165. expect(obj.section).toBe("section");
  166. expect(Reflect.ownKeys(obj.texts).length).toBe(2);
  167. expect(obj.texts.es).toBe("testes");
  168. expect(obj.texts.en).toBe("testen");
  169. expect(obj.texts.eu).toBe(undefined);
  170. });
  171. test('Generate localized object - available and unavailablelanguages included', async () => {
  172. var testLangs = []
  173. testLangs.push(Lang.build({'code': 'en', 'name': 'English', 'priority': 1, 'active': true}));
  174. testLangs.push(Lang.build({'code': 'es', 'name': 'Espanol', 'priority': 2, 'active': true}));
  175. testLangs.push(Lang.build({'code': 'eu', 'name': 'Euskara', 'priority': 3, 'active': true}));
  176. jest.spyOn(Lang, 'findAll').mockImplementation(() => testLangs);
  177. const localeService = new LocaleService();
  178. await new Promise((r) => setTimeout(r, 30));
  179. const obj = localeService.generateLocalizedObject('{"es": "testes", "en": "testen", "ru": "testru"}', "key", "section");
  180. expect(obj.valid).toBe(true);
  181. expect(obj.key).toBe("key");
  182. expect(obj.section).toBe("section");
  183. expect(Reflect.ownKeys(obj.texts).length).toBe(2);
  184. expect(obj.texts.es).toBe("testes");
  185. expect(obj.texts.en).toBe("testen");
  186. expect(obj.texts.eu).toBe(undefined);
  187. expect(obj.texts.ru).toBe(undefined);
  188. });
  189. test('Generate localized object - no available languages included', async () => {
  190. var testLangs = []
  191. testLangs.push(Lang.build({'code': 'en', 'name': 'English', 'priority': 1, 'active': true}));
  192. testLangs.push(Lang.build({'code': 'es', 'name': 'Espanol', 'priority': 2, 'active': true}));
  193. testLangs.push(Lang.build({'code': 'eu', 'name': 'Euskara', 'priority': 3, 'active': true}));
  194. jest.spyOn(Lang, 'findAll').mockImplementation(() => testLangs);
  195. const localeService = new LocaleService();
  196. await new Promise((r) => setTimeout(r, 30));
  197. const obj = localeService.generateLocalizedObject('{"ru": "testru", "ja": "testja"}', "key", "section");
  198. expect(obj.valid).toBe(false);
  199. });
  200. test('Generate localized object - available languages included, duplicated, both the same', async () => {
  201. var testLangs = []
  202. testLangs.push(Lang.build({'code': 'en', 'name': 'English', 'priority': 1, 'active': true}));
  203. testLangs.push(Lang.build({'code': 'es', 'name': 'Espanol', 'priority': 2, 'active': true}));
  204. testLangs.push(Lang.build({'code': 'eu', 'name': 'Euskara', 'priority': 3, 'active': true}));
  205. jest.spyOn(Lang, 'findAll').mockImplementation(() => testLangs);
  206. const localeService = new LocaleService();
  207. await new Promise((r) => setTimeout(r, 30));
  208. const obj = localeService.generateLocalizedObject('{"es": "testes", "es": "testes"}', "key", "section");
  209. expect(obj.valid).toBe(true);
  210. expect(obj.key).toBe("key");
  211. expect(obj.section).toBe("section");
  212. expect(Reflect.ownKeys(obj.texts).length).toBe(1);
  213. expect(obj.texts.es).toBe("testes");
  214. expect(obj.texts.en).toBe(undefined);
  215. expect(obj.texts.eu).toBe(undefined);
  216. });
  217. test('Generate localized object - available languages included, duplicated, both different', async () => {
  218. var testLangs = []
  219. testLangs.push(Lang.build({'code': 'en', 'name': 'English', 'priority': 1, 'active': true}));
  220. testLangs.push(Lang.build({'code': 'es', 'name': 'Espanol', 'priority': 2, 'active': true}));
  221. testLangs.push(Lang.build({'code': 'eu', 'name': 'Euskara', 'priority': 3, 'active': true}));
  222. jest.spyOn(Lang, 'findAll').mockImplementation(() => testLangs);
  223. const localeService = new LocaleService();
  224. await new Promise((r) => setTimeout(r, 30));
  225. const obj = localeService.generateLocalizedObject('{"es": "testes1", "es": "testes2"}', "key", "section");
  226. expect(obj.valid).toBe(true);
  227. expect(obj.key).toBe("key");
  228. expect(obj.section).toBe("section");
  229. expect(Reflect.ownKeys(obj.texts).length).toBe(1);
  230. expect(obj.texts.es).toBe("testes2");
  231. expect(obj.texts.en).toBe(undefined);
  232. expect(obj.texts.eu).toBe(undefined);
  233. });
  234. test('Generate localized object - valid object, no key', async () => {
  235. var testLangs = []
  236. testLangs.push(Lang.build({'code': 'en', 'name': 'English', 'priority': 1, 'active': true}));
  237. testLangs.push(Lang.build({'code': 'es', 'name': 'Espanol', 'priority': 2, 'active': true}));
  238. testLangs.push(Lang.build({'code': 'eu', 'name': 'Euskara', 'priority': 3, 'active': true}));
  239. jest.spyOn(Lang, 'findAll').mockImplementation(() => testLangs);
  240. const localeService = new LocaleService();
  241. await new Promise((r) => setTimeout(r, 30));
  242. const obj = localeService.generateLocalizedObject('{"es": "testes", "en": "testen", "eu": "testeu"}', null, "section");
  243. expect(obj.valid).toBe(false);
  244. });
  245. test('Generate localized object - valid object, no section', async () => {
  246. var testLangs = []
  247. testLangs.push(Lang.build({'code': 'en', 'name': 'English', 'priority': 1, 'active': true}));
  248. testLangs.push(Lang.build({'code': 'es', 'name': 'Espanol', 'priority': 2, 'active': true}));
  249. testLangs.push(Lang.build({'code': 'eu', 'name': 'Euskara', 'priority': 3, 'active': true}));
  250. jest.spyOn(Lang, 'findAll').mockImplementation(() => testLangs);
  251. const localeService = new LocaleService();
  252. await new Promise((r) => setTimeout(r, 30));
  253. const obj = localeService.generateLocalizedObject('{"es": "testes", "en": "testen", "eu": "testeu"}', "key", null);
  254. expect(obj.valid).toBe(false);
  255. });
  256. test('Generate localized object - bad object', async () => {
  257. var testLangs = []
  258. testLangs.push(Lang.build({'code': 'en', 'name': 'English', 'priority': 1, 'active': true}));
  259. testLangs.push(Lang.build({'code': 'es', 'name': 'Espanol', 'priority': 2, 'active': true}));
  260. testLangs.push(Lang.build({'code': 'eu', 'name': 'Euskara', 'priority': 3, 'active': true}));
  261. jest.spyOn(Lang, 'findAll').mockImplementation(() => testLangs);
  262. const localeService = new LocaleService();
  263. await new Promise((r) => setTimeout(r, 30));
  264. const obj = localeService.generateLocalizedObject("bad", "key", "section");
  265. expect(obj.valid).toBe(false);
  266. });
  267. test('Save localized object - valid object', async () => {
  268. var testLangs = []
  269. testLangs.push(Lang.build({'code': 'en', 'name': 'English', 'priority': 1, 'active': true}));
  270. testLangs.push(Lang.build({'code': 'es', 'name': 'Espanol', 'priority': 2, 'active': true}));
  271. testLangs.push(Lang.build({'code': 'eu', 'name': 'Euskara', 'priority': 3, 'active': true}));
  272. jest.spyOn(Lang, 'findAll').mockImplementation(() => testLangs);
  273. jest.spyOn(Text, 'create').mockImplementation((options) => Promise.resolve(true));
  274. const localeService = new LocaleService();
  275. await new Promise((r) => setTimeout(r, 30));
  276. const obj = localeService.generateLocalizedObject('{"es": "testes", "en": "testen", "eu": "testeu"}', "key", "section");
  277. expect(await localeService.saveLocalizedObject(obj)).toBe(true);
  278. });
  279. test('Save localized object - invalid object', async () => {
  280. var testLangs = []
  281. testLangs.push(Lang.build({'code': 'en', 'name': 'English', 'priority': 1, 'active': true}));
  282. testLangs.push(Lang.build({'code': 'es', 'name': 'Espanol', 'priority': 2, 'active': true}));
  283. testLangs.push(Lang.build({'code': 'eu', 'name': 'Euskara', 'priority': 3, 'active': true}));
  284. jest.spyOn(Lang, 'findAll').mockImplementation(() => testLangs);
  285. jest.spyOn(Text, 'create').mockImplementation((options) => Promise.resolve(true));
  286. const localeService = new LocaleService();
  287. await new Promise((r) => setTimeout(r, 30));
  288. const obj = localeService.generateLocalizedObject('{"es": "testes", "en": "testen", "eu": "testeu"}', "key", null);
  289. expect(await localeService.saveLocalizedObject(obj)).toBe(false);
  290. });
  291. // TODO: Implement test for localization functions once they are complete