|
1 |
| -const test = require('node:test'); |
| 1 | + const test = require('node:test'); |
2 | 2 | const assert = require('assert');
|
3 |
| - |
4 |
| -const fs = require('fs'); |
5 |
| -const util = require('util'); |
6 |
| -const writeFile = util.promisify(fs.writeFile); |
7 | 3 | const { Application, MailSystem } = require('./main');
|
8 |
| -const path = require('node:path'); |
9 |
| - |
10 |
| -// Mock fs.unlinkSync |
11 |
| -const originalUnlinkSync = fs.unlinkSync; |
12 |
| -fs.unlinkSync = (path) => { |
13 |
| - console.log(`Mocked unlinkSync called with path: ${path}`); |
14 |
| -}; |
15 | 4 |
|
16 |
| -// Mock fs.readFileSync |
17 |
| -const originalReadFileSync = fs.readFileSync; |
18 |
| -fs.readFileSync = (path, encoding) => { |
19 |
| - console.log(`Mocked readFileSync called with path: ${path} and encoding: ${encoding}`); |
20 |
| - return "JJ\nEE\nRR\nYY"; |
21 |
| -}; |
22 |
| - |
23 |
| -test("Test MailSystem's write", () => { |
24 |
| - const ms = new MailSystem(); |
25 |
| - const context = ms.write("Jerry"); |
26 |
| - assert.strictEqual(context, "Congrats, Jerry!"); |
| 5 | +// TODO: write your tests here |
| 6 | +// Remember to use Stub, Mock, and Spy when necessary |
| 7 | +test.mock.method(fs, 'readFile', (file, options, callback) => { |
| 8 | + callback(null, 'Guan\nChen\nGala'); |
27 | 9 | });
|
28 | 10 |
|
29 |
| -test("Test MailSystem's send", () => { |
30 |
| - const ms = new MailSystem(); |
31 |
| - const originalMathRandom = Math.random; |
32 |
| - |
33 |
| - Math.random = () => 0.4; |
34 |
| - let context = ms.send("Jerry", "Test Message"); |
35 |
| - assert.strictEqual(context, false); |
| 11 | +test("MailSystem write", () => { |
| 12 | + const mailSystem = new MailSystem(); |
| 13 | + assert.strictEqual(mailSystem.write("Guan"), "Congrats, Guan!"); |
| 14 | +}); |
36 | 15 |
|
| 16 | +test("MailSystem send", () => { |
| 17 | + const mailSystem = new MailSystem(); |
37 | 18 | Math.random = () => 0.6;
|
38 |
| - context = ms.send("Jerry", "Test Message"); |
39 |
| - assert.strictEqual(context, true); |
40 |
| - |
41 |
| - Math.random = originalMathRandom; |
| 19 | + const context = mailSystem.write("Guan"); |
| 20 | + assert.strictEqual(mailSystem.send("Guan", context), true); |
| 21 | + Math.random = () => 0.5; |
| 22 | + assert.strictEqual(mailSystem.send("Chen", context), false); |
42 | 23 | });
|
43 | 24 |
|
44 |
| -test("Test Application's getNames", async () => { |
45 |
| - const fn_ = path.join(process.cwd(), 'name_list.txt'); |
46 |
| - const data_ = "JJ\nEE\nRR\nYY"; |
47 |
| - await writeFile(fn_, data_, "utf-8"); |
48 |
| - |
49 |
| - const app = new Application(); |
50 |
| - |
51 |
| - let ctx = await app.getNames(); |
52 |
| - assert.deepStrictEqual(ctx[0], ["JJ", "EE", "RR", "YY"]); |
53 |
| - assert.deepStrictEqual(ctx[1], []); |
54 |
| - |
55 |
| - originalUnlinkSync(fn_); |
| 25 | +test("Application getNames", async () => { |
| 26 | + const application = new Application(); |
| 27 | + const [people, selected] = await application.getNames(); |
| 28 | + assert.deepStrictEqual(people, ["Guan", "Chen", "Gala"]); |
| 29 | + assert.deepStrictEqual(selected, []); |
56 | 30 | });
|
57 | 31 |
|
58 |
| -test("Test Application's getRandomPerson", async () => { |
59 |
| - const fn_ = path.join(process.cwd(), 'name_list.txt'); |
60 |
| - const data_ = "JJ\nEE"; |
61 |
| - await writeFile(fn_, data_, "utf-8"); |
62 |
| - |
63 |
| - const app = new Application(); |
64 |
| - |
65 |
| - let ctx = await app.getNames(); |
66 |
| - assert.deepStrictEqual(ctx[0], ["JJ", "EE"]); |
67 |
| - assert.deepStrictEqual(ctx[1], []); |
68 |
| - |
69 |
| - let rdmPeople = await app.getRandomPerson(); |
70 |
| - assert.ok(app.people.includes(rdmPeople)); |
71 |
| - |
72 |
| - rdmPeople = await app.getRandomPerson(); |
73 |
| - assert.ok(app.people.includes(rdmPeople)); |
74 |
| - |
75 |
| - originalUnlinkSync(fn_); |
| 32 | +test("Application getRandomPerson", () => { |
| 33 | + const application = new Application(); |
| 34 | + application.people = ["Guan", "Chen", "Gala"]; |
| 35 | + Math.random = () => 0; |
| 36 | + assert.deepStrictEqual(application.getRandomPerson(), "Guan"); |
| 37 | + Math.random = () => 0.6; |
| 38 | + assert.deepStrictEqual(application.getRandomPerson(), "Chen"); |
| 39 | + Math.random = () => 0.9; |
| 40 | + assert.deepStrictEqual(application.getRandomPerson(), "Gala"); |
76 | 41 | });
|
77 | 42 |
|
78 |
| -test("Test Application's selectNextPerson", async () => { |
79 |
| - const fn_ = path.join(process.cwd(), 'name_list.txt'); |
80 |
| - const data_ = "JJ\nEE"; |
81 |
| - await writeFile(fn_, data_, "utf-8"); |
82 |
| - |
83 |
| - const app = new Application(); |
84 |
| - let ctx = await app.getNames(); |
85 |
| - assert.deepStrictEqual(ctx[0], ["JJ", "EE"]); |
86 |
| - assert.deepStrictEqual(ctx[1], []); |
87 |
| - |
88 |
| - const orgsnp = app.getRandomPerson; |
89 |
| - app.getRandomPerson = () => "JJ"; |
90 |
| - let rdperson = app.selectNextPerson(); |
91 |
| - assert.strictEqual(rdperson, "JJ"); |
92 |
| - assert.ok(app.people.includes(rdperson)); |
93 |
| - assert.ok(app.selected.includes(rdperson)); |
94 |
| - assert.deepStrictEqual(app.selected, ["JJ"]); |
95 |
| - assert.strictEqual(app.selected.length, 1); |
96 |
| - |
97 |
| - app.getRandomPerson = () => "EE"; |
98 |
| - rdperson = app.selectNextPerson(); |
99 |
| - assert.strictEqual(rdperson, "EE"); |
100 |
| - assert.ok(app.people.includes(rdperson)); |
101 |
| - assert.ok(app.selected.includes(rdperson)); |
102 |
| - assert.deepStrictEqual(app.selected, ["JJ","EE"]); |
103 |
| - assert.strictEqual(app.selected.length, 2); |
104 |
| - |
105 |
| - app.getRandomPerson = orgsnp; |
106 |
| - rdperson = app.selectNextPerson(); |
107 |
| - assert.strictEqual(rdperson, null); |
108 |
| - assert.strictEqual(app.selected.length, 2); |
109 |
| - |
110 |
| - let cnt = 0; |
111 |
| - app.getRandomPerson = () => { |
112 |
| - if (cnt++ % 2 === 0) { |
113 |
| - return 'JJ'; |
114 |
| - } else { |
115 |
| - return 'EE'; |
| 43 | +test("Application selectNextPerson", async () => { |
| 44 | + const application = new Application(); |
| 45 | + await application.getNames(); |
| 46 | + application.selected = ["Guan"]; |
| 47 | + let count = 0; |
| 48 | + test.mock.method(application, 'getRandomPerson', () => { |
| 49 | + const name_list = application.people; |
| 50 | + if (count <= name_list.length) { |
| 51 | + return name_list[count++]; |
116 | 52 | }
|
117 |
| - } |
118 |
| - app.selected = ['JJ']; |
119 |
| - rdperson = app.selectNextPerson(); |
120 |
| - assert.strictEqual(rdperson, 'EE'); |
121 |
| - assert.deepStrictEqual(app.selected, ['JJ', 'EE']); |
122 |
| - originalUnlinkSync(fn_); |
| 53 | + }); |
| 54 | + assert.strictEqual(application.selectNextPerson(), "Chen"); |
| 55 | + assert.strictEqual(application.selectNextPerson(), "Gala"); |
| 56 | + assert.strictEqual(application.selectNextPerson(), null); |
123 | 57 | });
|
124 | 58 |
|
125 |
| -test("Test Application's notifySelected", async () => { |
126 |
| - const fn_ = 'name_list.txt'; |
127 |
| - const data_ = "JJ\nEE"; |
128 |
| - await writeFile(fn_, data_, "utf-8"); |
129 |
| - |
130 |
| - const app = new Application(); |
131 |
| - let ctx = await app.getNames(); |
132 |
| - assert.deepStrictEqual(ctx[0], ["JJ", "EE"]); |
133 |
| - assert.deepStrictEqual(ctx[1], []); |
134 |
| - |
135 |
| - app.getRandomPerson = () => "JJ"; |
136 |
| - let person = app.selectNextPerson(); |
137 |
| - assert.strictEqual(person, "JJ"); |
138 |
| - assert.deepStrictEqual(app.selected, ["JJ"]); |
139 |
| - |
140 |
| - app.getRandomPerson = () => "EE"; |
141 |
| - person = app.selectNextPerson(); |
142 |
| - assert.strictEqual(person, "EE"); |
143 |
| - assert.deepStrictEqual(app.selected, ["JJ", "EE"]); |
144 |
| - |
145 |
| - test.mock.method(app.mailSystem, 'write', (name) => "Congrats, " + name + "!"); |
146 |
| - test.mock.method(app.mailSystem, 'send', () => true); |
147 |
| - |
148 |
| - app.notifySelected(); |
149 |
| - |
150 |
| - assert.strictEqual(app.mailSystem.write.mock.calls.length, 2); |
151 |
| - assert.strictEqual(app.mailSystem.send.mock.calls.length, 2); |
152 |
| - |
153 |
| - let call = app.mailSystem.write.mock.calls[0]; |
154 |
| - assert.deepStrictEqual(call.arguments, ["JJ"]); |
155 |
| - assert.deepStrictEqual(call.result, "Congrats, JJ!"); |
156 |
| - assert.deepStrictEqual(call.error, undefined); |
157 |
| - |
158 |
| - call = app.mailSystem.write.mock.calls[1]; |
159 |
| - assert.deepStrictEqual(call.arguments, ["EE"]); |
160 |
| - assert.deepStrictEqual(call.result, "Congrats, EE!"); |
161 |
| - assert.deepStrictEqual(call.error, undefined); |
162 |
| - originalUnlinkSync(fn_); |
| 59 | +test("Application notifySelected", () => { |
| 60 | + const application = new Application(); |
| 61 | + application.people = ["Guan", "Chen", "Gala"]; |
| 62 | + application.selected = ["Guan", "Chen", "Gala"]; |
| 63 | + application.mailSystem.write = test.mock.fn(application.mailSystem.write); |
| 64 | + application.mailSystem.send = test.mock.fn(application.mailSystem.send); |
| 65 | + application.notifySelected(); |
| 66 | + assert.strictEqual(application.mailSystem.send.mock.calls.length, application.people.length); |
| 67 | + assert.strictEqual(application.mailSystem.write.mock.calls.length, application.people.length); |
163 | 68 | });
|
0 commit comments