forked from storybookjs/storybook
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathevent-log-checker.ts
105 lines (87 loc) · 3.41 KB
/
event-log-checker.ts
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
/* eslint-disable jest/no-export, jest/expect-expect, no-console */
import chalk from 'chalk';
import assert from 'assert';
import fetch from 'node-fetch';
import { esMain } from './utils/esmain';
import { allTemplates } from '../code/lib/cli/src/sandbox-templates';
import versions from '../code/lib/core-common/src/versions';
import { oneWayHash } from '../code/lib/telemetry/src/one-way-hash';
const PORT = process.env.PORT || 6007;
const eventTypeExpectations = {
build: {},
};
async function run() {
const [eventType, templateName] = process.argv.slice(2);
let testMessage = '';
// very simple jest-like test fn for better error readability
const test = (message: string, fn: () => void) => {
testMessage = message;
fn();
};
try {
if (!eventType || !templateName) {
throw new Error(
`Need eventType and templateName; call with ./event-log-checker <eventType> <templateName>`
);
}
const expectation = eventTypeExpectations[eventType as keyof typeof eventTypeExpectations];
if (!expectation) throw new Error(`Unexpected eventType '${eventType}'`);
const template = allTemplates[templateName as keyof typeof allTemplates];
if (!template) throw new Error(`Unexpected template '${templateName}'`);
const events = await (await fetch(`http://localhost:${PORT}/event-log`)).json();
test('Should log 2 events', () => {
assert.equal(
events.length,
2,
`Expected 2 events but received ${
events.length
} instead. The following events were logged: ${JSON.stringify(events)}`
);
});
const [bootEvent, mainEvent] = events;
test(`both events should have cliVersion in context`, () => {
const cliVersion = versions.storybook;
assert.equal(bootEvent.context.cliVersion, cliVersion);
assert.equal(mainEvent.context.cliVersion, cliVersion);
});
test(`Should log a boot event with a payload of type ${eventType}`, () => {
assert.equal(bootEvent.eventType, 'boot');
assert.equal(bootEvent.payload?.eventType, eventType);
});
test(`main event should be ${eventType} and contain correct id and session id`, () => {
assert.equal(mainEvent.eventType, eventType);
assert.notEqual(mainEvent.eventId, bootEvent.eventId);
assert.equal(mainEvent.sessionId, bootEvent.sessionId);
});
test(`main event should contain anonymousId properly hashed`, () => {
const templateDir = `sandbox/${templateName.replace('/', '-')}`;
const unhashedId = `github.com/storybookjs/storybook.git${templateDir}`;
assert.equal(mainEvent.context.anonymousId, oneWayHash(unhashedId));
});
const {
expected: { renderer, builder, framework },
} = template;
test(`main event should contain correct packages from template's "expected" field`, () => {
assert.equal(mainEvent.metadata.renderer, renderer);
assert.equal(mainEvent.metadata.builder, builder);
assert.equal(mainEvent.metadata.framework.name, framework);
});
} catch (err) {
if (err instanceof assert.AssertionError) {
console.log(`Assertions failed for ${chalk.bold(templateName)}\n`);
console.log(chalk.bold(chalk.red`✕ ${testMessage}:`));
console.log(err);
process.exit(1);
}
throw err;
}
}
export {};
if (esMain(import.meta.url)) {
run()
.then(() => process.exit(0))
.catch((err) => {
console.log(err);
process.exit(1);
});
}