/
globalTeardown.ts
92 lines (82 loc) · 2.69 KB
/
globalTeardown.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
import {rm} from 'fs/promises'
import {cleanupDangling} from './cleanupDangling'
import {
baseTestPath,
cliUserToken,
getTestRunArgs,
hasBuiltCli,
studioVersions,
testClient,
} from './environment'
export default async function globalTeardown(): Promise<void> {
if (!cliUserToken || !hasBuiltCli) {
return
}
for (const version of studioVersions) {
const args = getTestRunArgs(version)
await deleteCorsOrigins(args.corsOrigin)
await deleteAliases(args.alias)
await deleteGraphQLAPIs(args.graphqlDataset)
await deleteDatasets(args)
}
await rm(baseTestPath, {recursive: true, force: true})
// Very hacky, but good enough for now:
// Force a cleanup of dangling entities left over from previous test runs every once in a while
if (Math.random() < 0.7) {
await cleanupDangling()
}
}
function getErrorWarner(entity: string, id: string) {
return (err: unknown) => {
if (err instanceof Error) {
console.warn(`WARN: ${entity} "${id}" cleanup failed: ${err.message}`)
} else {
console.warn(`WARN: ${entity} "${id}" cleanup failed: ${err}`)
}
}
}
async function deleteAliases(baseAlias: string) {
const aliases = await testClient.request<{name: string}[]>({url: '/aliases'})
const created = aliases.filter(({name}) => name.startsWith(baseAlias))
await Promise.all(
created.map((alias) =>
testClient
.request({method: 'DELETE', uri: `/aliases/${alias.name}`})
.catch(getErrorWarner('dataset alias', alias.name))
)
)
}
async function deleteGraphQLAPIs(graphqlDataset: string) {
const apis = await testClient.request<{dataset: string; tag: string}[]>({url: '/apis/graphql'})
const created = apis.filter(({dataset}) => dataset === graphqlDataset)
await Promise.all(
created.map(({dataset, tag}) =>
testClient
.request({url: `/apis/graphql/${dataset}/${tag}`, method: 'DELETE'})
.catch(getErrorWarner('graphql api', `${dataset}/${tag}`))
)
)
}
async function deleteCorsOrigins(baseOrigin: string) {
const origins = await testClient.request<{id: number; origin: string}[]>({url: '/cors'})
const created = origins.filter(({origin}) => origin.startsWith(baseOrigin))
await Promise.all(
created.map((origin) =>
testClient
.request({method: 'DELETE', uri: `/cors/${origin.id}`})
.catch(getErrorWarner('cors origin', origin.origin))
)
)
}
async function deleteDatasets(args: ReturnType<typeof getTestRunArgs>) {
const datasets = [
args.dataset,
args.datasetCopy,
args.documentsDataset,
args.graphqlDataset,
args.aclDataset,
]
await Promise.all(
datasets.map((ds) => testClient.datasets.delete(ds).catch(getErrorWarner('dataset', ds)))
)
}