-
-
Notifications
You must be signed in to change notification settings - Fork 263
Expand file tree
/
Copy pathdefault-cloud-artifact-provider.test.ts
More file actions
126 lines (111 loc) · 4.3 KB
/
Copy pathdefault-cloud-artifact-provider.test.ts
File metadata and controls
126 lines (111 loc) · 4.3 KB
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
import assert from 'node:assert/strict';
import http, { type IncomingMessage, type ServerResponse } from 'node:http';
import { afterEach, test } from 'vitest';
import { createDefaultCloudArtifactProvider } from '../default-cloud-artifact-provider.ts';
import { withCommandExecutorOverride } from '../utils/exec.ts';
let activeServer: http.Server | undefined;
afterEach(async () => {
if (!activeServer) return;
await new Promise<void>((resolve, reject) => {
activeServer?.close((error) => (error ? reject(error) : resolve()));
});
activeServer = undefined;
});
test('default cloud artifact provider maps BrowserStack historical sessions from env credentials', async () => {
const server = await startSessionDetailsServer();
const provider = createDefaultCloudArtifactProvider({
BROWSERSTACK_USERNAME: 'user',
BROWSERSTACK_ACCESS_KEY: 'key',
BROWSERSTACK_SESSION_DETAILS_ENDPOINT: `${server.url}/sessions`,
});
const result = await provider.listCloudArtifacts?.({
provider: 'browserstack',
providerSessionId: 'wd-1',
});
assert.equal(result?.status, 'ready');
assert.deepEqual(
result?.cloudArtifacts.map((artifact) => artifact.kind),
['video', 'appium-log', 'device-log', 'provider-session', 'provider-session'],
);
});
test('default cloud artifact provider maps AWS Device Farm historical sessions via aws cli', async () => {
const calls: string[][] = [];
const provider = createDefaultCloudArtifactProvider({});
await withCommandExecutorOverride(
async (cmd, args) => {
calls.push([cmd, ...args]);
return {
stdout: JSON.stringify({
artifacts: [
{
name: args.includes('LOG') ? 'Appium Server Output' : 'Video',
type: args.includes('LOG') ? 'APPIUM_SERVER_OUTPUT' : 'VIDEO',
extension: args.includes('LOG') ? 'log' : 'mp4',
url: 'https://aws.example/artifact',
},
],
}),
stderr: '',
exitCode: 0,
};
},
async () => {
const result = await provider.listCloudArtifacts?.({
provider: 'aws-device-farm',
providerSessionId: 'arn:aws:devicefarm:us-west-2:123:session/project/session/00000',
});
assert.equal(result?.status, 'ready');
assert.deepEqual(
result?.cloudArtifacts.map((artifact) => artifact.kind),
['video', 'appium-log'],
);
},
);
assert.equal(calls[0]?.includes('us-west-2'), true);
assert.equal(calls[1]?.includes('LOG'), true);
});
test('default cloud artifact provider ignores lookups without a provider session id', async () => {
const provider = createDefaultCloudArtifactProvider({});
const result = await provider.listCloudArtifacts?.({
provider: 'browserstack',
});
assert.equal(result, undefined);
});
test('default cloud artifact provider does not treat broad aws as a provider name', async () => {
const provider = createDefaultCloudArtifactProvider({});
const result = await provider.listCloudArtifacts?.({
provider: 'aws',
providerSessionId: 'arn:aws:devicefarm:us-west-2:123:session/project/session/00000',
});
assert.equal(result, undefined);
});
async function startSessionDetailsServer(): Promise<{ url: string }> {
const server = http.createServer((req, res) => respond(req, res));
await new Promise<void>((resolve, reject) => {
server.once('error', reject);
server.listen(0, '127.0.0.1', resolve);
});
activeServer = server;
const address = server.address();
assert.ok(address && typeof address === 'object');
return { url: `http://127.0.0.1:${address.port}` };
}
function respond(req: IncomingMessage, res: ServerResponse): void {
if (req.method === 'GET' && req.url === '/sessions/wd-1.json') {
res.writeHead(200, { 'Content-Type': 'application/json' });
res.end(
JSON.stringify({
automation_session: {
video_url: 'https://browserstack.example/video.mp4',
appium_logs_url: 'https://browserstack.example/appium.log',
device_logs_url: 'https://browserstack.example/device.log',
browser_url: 'https://browserstack.example/dashboard',
public_url: 'https://browserstack.example/public',
},
}),
);
return;
}
res.writeHead(404, { 'Content-Type': 'application/json' });
res.end(JSON.stringify({ error: 'not found' }));
}