Skip to content

Commit 3c6b2c7

Browse files
committed
feat: lab4
1 parent 76fa110 commit 3c6b2c7

File tree

7 files changed

+1278
-75
lines changed

7 files changed

+1278
-75
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
node_modules/

lab2/main_test.js

Lines changed: 2 additions & 75 deletions
Original file line numberDiff line numberDiff line change
@@ -1,79 +1,6 @@
11
const test = require('node:test');
22
const assert = require('assert');
3-
const fs = require('fs');
4-
5-
// 模擬文件讀取操作
6-
test.mock.method(fs, 'readFile', (file, options, callback) => {
7-
callback(null, 'martin\njohn\ntom');
8-
});
9-
10-
// 導入需要測試的類
113
const { Application, MailSystem } = require('./main');
124

13-
// 測試 MailSystem 類的 write 方法
14-
test('MailSystem_write()', () => {
15-
const mailSystem = new MailSystem();
16-
assert.strictEqual(mailSystem.write('martin'), 'Congrats, martin!');
17-
assert.strictEqual(mailSystem.write(null), 'Congrats, null!');
18-
assert.strictEqual(mailSystem.write(48763), 'Congrats, 48763!');
19-
});
20-
21-
// 測試 MailSystem 類的 send 方法
22-
test('MailSystem_send()', () => {
23-
const mailSystem = new MailSystem();
24-
const name = 'martin';
25-
test.mock.method(Math, 'random', () => 0.6);
26-
assert.strictEqual(mailSystem.send(name, 'success'), true);
27-
test.mock.method(Math, 'random', () => 0.4);
28-
assert.strictEqual(mailSystem.send(name, 'fail'), false);
29-
});
30-
31-
// 測試 Application 類的 getNames 方法
32-
test('Application_getNames()', async () => {
33-
const app = new Application();
34-
const nameList = ['martin', 'john', 'tom'];
35-
const names = await app.getNames();
36-
assert.deepStrictEqual(names, [nameList, []]);
37-
});
38-
39-
// 測試 Application 類的 getRandomPerson 方法
40-
test('Application_getRandomPerson()', async () => {
41-
const app = new Application();
42-
const names = await app.getNames();
43-
test.mock.method(Math, 'random', () => 0);
44-
assert.strictEqual(app.getRandomPerson(), 'martin');
45-
test.mock.method(Math, 'random', () => 0.4);
46-
assert.strictEqual(app.getRandomPerson(), 'john');
47-
test.mock.method(Math, 'random', () => 0.7);
48-
assert.strictEqual(app.getRandomPerson(), 'tom');
49-
});
50-
51-
// 測試 Application 類的 selectNextPerson 方法
52-
test('Application_selectNextPerson()', async () => {
53-
const app = new Application();
54-
const names = await app.getNames();
55-
app.selected = ['martin'];
56-
let count = 0;
57-
test.mock.method(app, 'getRandomPerson', () => {
58-
if (count <= names.length) {
59-
return names[0][count++];
60-
}
61-
});
62-
assert.strictEqual(app.selectNextPerson(), 'john');
63-
assert.deepStrictEqual(app.selected, ['martin', 'john']);
64-
assert.strictEqual(app.selectNextPerson(), 'tom');
65-
assert.deepStrictEqual(app.selected, ['martin', 'john', 'tom']);
66-
assert.strictEqual(app.selectNextPerson(), null);
67-
});
68-
69-
// 測試 Application 類的 notifySelected 方法
70-
test('Application_notifySelected()', async () => {
71-
const app = new Application();
72-
app.people = ['martin', 'john', 'tom'];
73-
app.selected = ['martin', 'john', 'tom'];
74-
app.mailSystem.send = test.mock.fn(app.mailSystem.send);
75-
app.mailSystem.write = test.mock.fn(app.mailSystem.write);
76-
app.notifySelected();
77-
assert.strictEqual(app.mailSystem.send.mock.calls.length, 3);
78-
assert.strictEqual(app.mailSystem.write.mock.calls.length, 3);
79-
});
5+
// TODO: write your tests here
6+
// Remember to use Stub, Mock, and Spy when necessary

lab4/README.md

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
# Lab4
2+
3+
## Introduction
4+
5+
In this lab, you will write tests in `main_test.js`. You can learn how to use [Puppeteer](https://pptr.dev/) to tests a web UI.
6+
7+
## Preparation (Important!!!)
8+
9+
1. Sync fork your branch (e.g., `SQLab:311XXXXXX`)
10+
2. `git checkout -b lab4` (**NOT** your student ID !!!)
11+
12+
## Requirement
13+
14+
1. (100%) Goto https://pptr.dev/, type `chipi chipi chapa chapa` into the search box, click on **1st** result in the **Docs** section, and print the title.
15+
16+
For the detailed steps and hints, please check the slide of this lab.
17+
18+
You can run `validate.sh` in your local to test if you satisfy the requirements.
19+
20+
Please note that you must not alter files other than `main_test.js`. You will get 0 points if
21+
22+
1. you modify other files to achieve requirements.
23+
2. you can't pass all CI on your PR.
24+
25+
## Submission
26+
27+
You need to open a pull request to your branch (e.g. 311XXXXXX, your student number) and contain the code that satisfies the abovementioned requirements.
28+
29+
Moreover, please submit the URL of your PR to E3. Your submission will only be accepted when you present at both places.

lab4/main_test.js

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
const puppeteer = require('puppeteer');
2+
3+
(async () => {
4+
// Launch the browser and open a new blank page
5+
const browser = await puppeteer.launch();
6+
const page = await browser.newPage();
7+
8+
// Navigate the page to a URL
9+
await page.goto('https://pptr.dev/');
10+
11+
// Hints:
12+
// Click search button
13+
// Type into search box
14+
// Wait for search result
15+
// Get the `Docs` result section
16+
// Click on first result in `Docs` section
17+
// Locate the title
18+
// Print the title
19+
20+
// Close the browser
21+
await browser.close();
22+
})();

0 commit comments

Comments
 (0)