Skip to content

Commit f0bcaef

Browse files
committed
feat: lab4
1 parent e4d54c8 commit f0bcaef

File tree

7 files changed

+1278
-86
lines changed

7 files changed

+1278
-86
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 & 86 deletions
Original file line numberDiff line numberDiff line change
@@ -1,90 +1,6 @@
11
const test = require('node:test');
22
const assert = require('assert');
3-
const fs = require('fs');
4-
5-
// 模擬 fs.readFile 方法,返回假數據
6-
test.mock.method(fs, 'readFile', (file, options, callback) => {
7-
callback(null, 'aaa\nbbb\nccc');
8-
});
9-
10-
// 從 main.js 導入 Application 和 MailSystem
113
const { Application, MailSystem } = require('./main');
124

13-
// 測試 MailSystem_write() 方法
14-
test('MailSystem_write()', () => {
15-
const ms = new MailSystem();
16-
assert.strictEqual(ms.write('aaa'), 'Congrats, aaa!'); // 確認寫入郵件的功能
17-
assert.strictEqual(ms.write(511558018), 'Congrats, 511558018!'); // 確認處理數字名稱的功能
18-
assert.strictEqual(ms.write(null), 'Congrats, null!'); // 確認處理空值的功能
19-
});
20-
21-
// 測試 MailSystem_send() 方法
22-
test('MailSystem_send()', () => {
23-
const ms = new MailSystem();
24-
const name = 'aaa';
25-
test.mock.method(Math, 'random', () => 0.6); // 假設 Math.random() 始終返回 0.6
26-
assert.strictEqual(ms.send(name, 'success'), true); // 確認發送成功郵件的功能
27-
test.mock.method(Math, 'random', () => 0.4); // 假設 Math.random() 始終返回 0.4
28-
assert.strictEqual(ms.send(name, 'fail'), false); // 確認發送失敗郵件的功能
29-
});
30-
31-
// 測試 Application_getNames() 方法
32-
test('Application_getNames()', async () => {
33-
const app = new Application();
34-
const name_list = ['aaa', 'bbb', 'ccc'];
35-
const names = await app.getNames();
36-
assert.deepStrictEqual(names, [name_list, []]); // 確認獲取名字列表的功能
37-
});
38-
39-
// 測試 Application_getRandomPerson() 方法
40-
test('Application_getRandomPerson()', async () => {
41-
const app = new Application();
42-
const [names] = await app.getNames(); // 等待獲取名字列表
43-
const randomPerson = app.getRandomPerson();
44-
assert.ok(names.includes(randomPerson)); // 確認隨機獲取的人員在名字列表中
45-
});
46-
47-
// 測試 Application_selectNextPerson() 方法
48-
test('Application_selectNextPerson()', async () => {
49-
const app = new Application();
50-
const [names] = await app.getNames();
51-
app.selected = ['aaa'];
52-
let cnt = 0;
53-
test.mock.method(app, 'getRandomPerson', () => {
54-
if (cnt <= names.length) {
55-
return names[cnt++];
56-
}
57-
});
58-
assert.strictEqual(app.selectNextPerson(), 'bbb'); // 確認選擇下一個人員的功能
59-
assert.deepStrictEqual(app.selected, ['aaa', 'bbb']); // 確認已選擇的人員列表
60-
assert.strictEqual(app.selectNextPerson(), 'ccc'); // 確認選擇下一個人員的功能
61-
assert.deepStrictEqual(app.selected, ['aaa', 'bbb', 'ccc']); // 確認已選擇的人員列表
62-
assert.strictEqual(app.selectNextPerson(), null); // 確認已無可選擇的人員
63-
});
64-
65-
// 測試 Application_notifySelected() 方法
66-
test('Application_notifySelected()', async () => {
67-
const app = new Application();
68-
const [people] = await app.getNames();
69-
app.selected = [...people];
70-
app.mailSystem.send = test.mock.fn(app.mailSystem.send);
71-
app.mailSystem.write = test.mock.fn(app.mailSystem.write);
72-
app.notifySelected();
73-
assert.strictEqual(app.mailSystem.send.mock.calls.length, people.length); // 確認發送郵件的次數
74-
assert.strictEqual(app.mailSystem.write.mock.calls.length, people.length); // 確認編寫郵件的次數
75-
});
76-
77-
// 測試 Dummy Object - MailSystem
78-
test('Dummy Object - MailSystem', () => {
79-
class DummyMailSystem extends MailSystem {
80-
send(name, status) {
81-
}
82-
write(name) {
83-
}
84-
}
85-
86-
const dummyMailSystem = new DummyMailSystem();
87-
88-
assert.strictEqual(dummyMailSystem.write('aaa'), undefined); // 測試編寫郵件的功能
89-
assert.strictEqual(dummyMailSystem.send('aaa', 'success'), undefined); // 測試發送成功郵件的功能
90-
});
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)