Skip to content
This repository was archived by the owner on Feb 2, 2021. It is now read-only.

Commit eb0d709

Browse files
author
Dimitar Kerezov
committed
Add unit tests for messages service
Covering all the basic scenarios.
1 parent cffd5de commit eb0d709

File tree

1 file changed

+121
-0
lines changed

1 file changed

+121
-0
lines changed
Lines changed: 121 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,121 @@
1+
///<reference path="../.d.ts"/>
2+
"use strict";
3+
4+
import {Yok} from "../../yok";
5+
import {format} from "util";
6+
import {join} from "path";
7+
import {MessagesService} from "../../services/messages-service";
8+
import {existsSync} from "fs";
9+
import {assert} from "chai";
10+
import Future = require("fibers/future");
11+
12+
function createTestInjector(jsonContents: any, options?: {useRealFsExists: boolean}): IInjector {
13+
let testInjector = new Yok();
14+
testInjector.register("fs", {
15+
exists: (path: string): IFuture<boolean> => Future.fromResult(options && options.useRealFsExists ? existsSync(path) : true),
16+
readJson: (filename: string, encoding?: string): IFuture<any> => Future.fromResult(jsonContents)
17+
});
18+
testInjector.register("messagesService", MessagesService);
19+
20+
return testInjector;
21+
}
22+
describe("messages-service", () => {
23+
let service: IMessagesService;
24+
25+
describe("pathsToMessageJsonFiles property", () => {
26+
it("initializes with the default json file", () => {
27+
let injector = createTestInjector({});
28+
service = injector.resolve("$messagesService");
29+
30+
assert.deepEqual(1, service.pathsToMessageJsonFiles.length, "Messages service should initialize with a default json file.");
31+
});
32+
33+
it("appends the default json file when setting pathsToMessageJsonFiles", () => {
34+
let injector = createTestInjector({}, {useRealFsExists: false});
35+
service = injector.resolve("$messagesService");
36+
service.pathsToMessageJsonFiles = ["someHackyJsonFile.json"];
37+
38+
assert.deepEqual(2, service.pathsToMessageJsonFiles.length, "Messages service should append the default json file.");
39+
});
40+
41+
it("should throw if non-existent json file is provided", () => {
42+
let injector = createTestInjector({}, {useRealFsExists: true});
43+
service = injector.resolve("$messagesService");
44+
assert.throws(() => { service.pathsToMessageJsonFiles = ["someJsonFile.json"]; }, "someJsonFile.json does not exist");
45+
});
46+
});
47+
48+
describe("getMessage", () => {
49+
it("returns the given message if not found as key in any json file", () => {
50+
let injector = createTestInjector({});
51+
service = injector.resolve("$messagesService");
52+
let stringMessage = "Some message",
53+
resultMessage = service.getMessage(stringMessage);
54+
assert.deepEqual(stringMessage, resultMessage, "Messages service should return the given message if not found as key in any json file in `pathsToMessageJsonFiles` property.");
55+
});
56+
57+
it("util.formats the given message if not found as key in any json file and contains special symbol (%s,%d, etc.)", () => {
58+
let injector = createTestInjector({});
59+
service = injector.resolve("$messagesService");
60+
let messageFormat = "Some %s message.",
61+
formatArg = "formatted",
62+
expectedMessage = format(messageFormat, formatArg),
63+
resultMessage = service.getMessage(messageFormat, formatArg);
64+
65+
assert.deepEqual(expectedMessage, resultMessage, "Messages service should apply util.format.");
66+
});
67+
68+
it("should return correct value from json file if found in json message files", () => {
69+
let jsonContents = {KEY: "Value"},
70+
injector = createTestInjector(jsonContents);
71+
service = injector.resolve("$messagesService");
72+
73+
assert.deepEqual(jsonContents.KEY, service.getMessage("KEY"), "Messages service should return correct value from json file by given key.");
74+
});
75+
76+
it("should util.format value from json file if found in json message files and contains special symbol (%s,%d, etc.)", () => {
77+
let jsonContents = {KEY: "%s value"},
78+
injector = createTestInjector(jsonContents);
79+
service = injector.resolve("$messagesService");
80+
81+
let formatArg = "Formatted",
82+
expectedMessage = format(jsonContents.KEY, formatArg),
83+
actualMessage = service.getMessage(jsonContents.KEY, formatArg);
84+
85+
assert.deepEqual(expectedMessage, actualMessage, "Messages service should util.format value from json file by given key when value is format.");
86+
});
87+
88+
it("should return correct value from json file if found in json message files with complex key", () => {
89+
let jsonContents = {
90+
KEY: {
91+
NESTED_KEY: "Value"
92+
}
93+
},
94+
injector = createTestInjector(jsonContents);
95+
service = injector.resolve("$messagesService");
96+
97+
assert.deepEqual(jsonContents.KEY.NESTED_KEY, service.getMessage("KEY.NESTED_KEY"), "Messages service should return correct value from json file by given complex key.");
98+
});
99+
100+
it("should return correct value from json file if found in client json before common json", () => {
101+
let commonJsonContents = {
102+
KEY: "Value"
103+
},
104+
clientJsonContents = {
105+
KEY: "Overriden value"
106+
},
107+
pathToDefaultMessageJson = join(__dirname, "..", "..", "resources", "messages", "errorMessages.json"),
108+
injector = createTestInjector({});
109+
110+
injector.register("fs", {
111+
exists: (path: string): IFuture<boolean> => Future.fromResult(true),
112+
readJson: (filename: string, encoding?: string): IFuture<any> => Future.fromResult(filename === pathToDefaultMessageJson ? commonJsonContents : clientJsonContents)
113+
});
114+
service = injector.resolve("$messagesService");
115+
service.pathsToMessageJsonFiles = ["clientJsonFile.json"];
116+
117+
assert.notDeepEqual(commonJsonContents.KEY, service.getMessage("KEY"), "Messages service should return correct value from json file when value is overriden by client.");
118+
assert.deepEqual(clientJsonContents.KEY, service.getMessage("KEY"), "Messages service should return correct value from json file when value is overriden by client.");
119+
});
120+
});
121+
});

0 commit comments

Comments
 (0)