-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathtest-ex-1-5.js
162 lines (148 loc) · 4.43 KB
/
test-ex-1-5.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
const test = require('ava');
const axios = require('axios');
const {
runInDocker,
startServerAndWaitUntilRunning
} = require('./runInDocker');
// prevent axios from throwing exceptions for non-200 http responses
axios.interceptors.response.use(
response => response,
error => Promise.resolve(error.response)
);
axios.defaults.timeout = 1000;
let serverStarted = false;
test.before('Lecture du code source fourni', async t => {
t.context.serverFiles = await runInDocker('ls -a');
t.context.packageSource = await runInDocker('cat package.json');
t.context.readmeSource = await runInDocker('cat README.md');
t.context.serverFile = await runInDocker(
`[ -f server.js ] && echo "server.js" || node -e "console.log(require('./package.json').main)"`
);
t.context.serverSource = await runInDocker(`cat ${t.context.serverFile}`);
t.log(t.context.serverSource);
});
// Exigences structurelles
test.serial('le dépot ne contient pas node_modules', t => {
const lines = t.context.serverFiles.split('\n');
t.false(lines.includes('node_modules'));
});
test.serial('package.json mentionne express comme dépendence', t => {
const { packageSource } = t.context;
t.truthy(packageSource.match(/"express"/));
});
test.serial('README.md mentionne npm install et tests avec curl', t => {
const { readmeSource } = t.context;
t.regex(readmeSource, /npm i/);
t.regex(readmeSource, /curl/);
});
test.serial('server.js fait moins de 50 lignes', t => {
const lines = t.context.serverSource.trim().split('\n');
t.assert(lines.length <= 50);
});
test.serial('server.js utilise express .post() .send() et .listen()', t => {
const { serverSource } = t.context;
t.regex(serverSource, /express\(\)/);
t.regex(serverSource, /\.post\(/);
t.regex(serverSource, /\.send\(/);
t.regex(serverSource, /\.listen\(/);
});
// Exigences fonctionnelles
const suite = [
// points d'entrée des exercices précédents
{
req: ['GET', '/'],
exp: /Hello World/
},
{
req: ['GET', '/hello'],
exp: /Quel est votre nom \?/
},
{
req: ['GET', '/hello?nom=Sasha'],
exp: /Bonjour, Sasha/
},
{
req: ['GET', '/hello?nom=Patrick'],
exp: /Bonjour, Patrick/
},
{
req: ['GET', '/hello?nom=Michel%20Blanc'],
exp: /Bonjour, Michel Blanc/
},
// points d'entrée de l'exercice 1-4 (POST)
{
req: ['POST', '/chat', { msg: 'ville' }],
exp: /Nous sommes à Paris/
},
{
req: ['POST', '/chat', { msg: 'météo' }],
exp: /Il fait beau/
},
// points d'entrée de l'exercice 1-5 (avec mémoire)
{
req: ['POST', '/chat', { msg: 'demain' }],
exp: /Je ne connais pas demain/
},
{
req: ['POST', '/chat', { msg: 'demain = Mercredi' }],
exp: /Merci pour cette information !/
},
{
req: ['POST', '/chat', { msg: 'demain' }],
exp: /demain: Mercredi/
},
// autre valeur pour "demain"
{
req: ['POST', '/chat', { msg: 'demain = Jeudi' }],
exp: /Merci pour cette information !/
},
{
req: ['POST', '/chat', { msg: 'demain' }],
exp: /demain: Jeudi/
},
// autre clé que "demain"
{
req: ['POST', '/chat', { msg: 'pays = Bengladesh' }],
exp: /Merci pour cette information !/
},
{
req: ['POST', '/chat', { msg: 'pays' }],
exp: /pays: Bengladesh/
}
];
for (const { req, exp } of suite) {
const [method, path, body] = req;
const port = 3000; // TODO: get from PORT env var, if possible
test.serial(
`${method} ${path} ${JSON.stringify(body || {})} -> ${exp.toString()}`,
async t => {
if (!serverStarted) {
try {
await runInDocker(`npm install --no-audit express`, t.log);
} catch (err) {
console.error(err);
}
await startServerAndWaitUntilRunning(3000, {
// TODO: import value from PORT env var, if possible
log: t.log // will display logs printed in standard output only if the test fails
});
}
serverStarted = true;
const url = `http://localhost:${port}${path}`;
const { data } = await axios[method.toLowerCase()](url, body);
t.regex(data, exp);
}
);
}
// Vérification de la persistance
test.serial(
'réponses.json contient les dernières valeurs enregistrées',
async t => {
const reponses = await runInDocker('cat réponses.json');
t.assert(reponses, '😩 fichier réponses.json non trouvé');
t.regex(reponses, /demain/);
t.regex(reponses, /Jeudi/);
t.regex(reponses, /pays/);
t.regex(reponses, /Bengladesh/);
}
);