Skip to content

Commit ad42185

Browse files
authored
Fix invalid UUIDs in the mocks, add safety test (#3077)
fix invalid UUIDs in the mocks, add safety test
1 parent f122d7f commit ad42185

File tree

7 files changed

+40
-20
lines changed

7 files changed

+40
-20
lines changed

app/api/__tests__/safety.spec.ts

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,3 +81,23 @@ it('e2e tests are only in test/e2e or test/visual', () => {
8181
expect(file).toMatch(/^test\/(e2e|visual)/)
8282
}
8383
})
84+
85+
// 8-4-4-4-12 hex digits
86+
const UUID_RE = '[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}'
87+
88+
// RFC 4122: version nibble (3rd group, 1st char) is 1-5,
89+
// variant nibble (4th group, 1st char) is 8, 9, a, or b
90+
const VALID_UUID_RE =
91+
/^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i
92+
93+
it('all UUIDs in mock-api files are valid RFC 4122', () => {
94+
const output = execSync(`git grep -n -oP '${UUID_RE}' -- 'mock-api/'`).toString().trim()
95+
const invalid = output.split('\n').filter((line) => {
96+
const uuid = line.split(':').slice(2).join(':')
97+
return !VALID_UUID_RE.test(uuid)
98+
})
99+
expect(
100+
invalid,
101+
`Invalid UUIDs found:\n${invalid.join('\n')}\n\nUse a reliable generator (e.g., uuidgen) to create valid v4 UUIDs.`
102+
).toEqual([])
103+
})

mock-api/disk.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -229,7 +229,7 @@ export const disks: Json<Disk>[] = [
229229
read_only: false,
230230
},
231231
{
232-
id: 'a1b2c3d4-e5f6-7890-abcd-ef1234567890',
232+
id: 'a1b2c3d4-e5f6-4890-abcd-ef1234567890',
233233
name: 'read-only-disk',
234234
description: 'A read-only disk created from a snapshot',
235235
project_id: project.id,

mock-api/floating-ip.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ export const floatingIp2: Json<FloatingIp> = {
4444

4545
// An IPv6 floating IP for testing IP version filtering (from ip-pool-2)
4646
export const floatingIp3: Json<FloatingIp> = {
47-
id: 'b1c2d3e4-5f6a-7b8c-9d0e-1f2a3b4c5d6e',
47+
id: 'b1c2d3e4-5f6a-4b8c-9d0e-1f2a3b4c5d6e',
4848
name: 'ipv6-float',
4949
description: 'An IPv6 address.',
5050
instance_id: undefined,

mock-api/project.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ export const projectNoVpcs: DbProject = {
5656

5757
// Projects for test silos (different IP pool configurations)
5858
export const projectKosman: DbProject = {
59-
id: 'a1b2c3d4-e5f6-7890-abcd-ef1234567890',
59+
id: 'a1b2c3d4-e5f6-4890-abcd-ef1234567890',
6060
name: 'kosman-project',
6161
description: 'project in myriad silo (v4-only default pool)',
6262
time_created: new Date(2024, 0, 5).toISOString(),
@@ -65,7 +65,7 @@ export const projectKosman: DbProject = {
6565
}
6666

6767
export const projectAnscombe: DbProject = {
68-
id: 'b2c3d4e5-f6a7-8901-bcde-f12345678901',
68+
id: 'b2c3d4e5-f6a7-4901-bcde-f12345678901',
6969
name: 'anscombe-project',
7070
description: 'project in thrax silo (v6-only default pool)',
7171
time_created: new Date(2024, 0, 7).toISOString(),
@@ -74,7 +74,7 @@ export const projectAnscombe: DbProject = {
7474
}
7575

7676
export const projectAdorno: DbProject = {
77-
id: 'c3d4e5f6-a7b8-9012-cdef-123456789012',
77+
id: '738c46df-35b1-44a2-ae1f-31005a0cbfee',
7878
name: 'adorno-project',
7979
description: 'project in pelerines silo (no default pools)',
8080
time_created: new Date(2024, 0, 9).toISOString(),

mock-api/silo.ts

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ export const silos: Json<Silo[]> = [
4545
},
4646
// Test silos for IP pool configuration scenarios
4747
{
48-
id: '7a1b2c3d-4e5f-6a7b-8c9d-0e1f2a3b4c5d',
48+
id: '7a1b2c3d-4e5f-4a7b-8c9d-0e1f2a3b4c5d',
4949
name: 'thrax',
5050
description: 'silo with v6-only default pool',
5151
time_created: new Date(2024, 0, 1).toISOString(),
@@ -55,7 +55,7 @@ export const silos: Json<Silo[]> = [
5555
mapped_fleet_roles: {},
5656
},
5757
{
58-
id: '8b2c3d4e-5f6a-7b8c-9d0e-1f2a3b4c5d6e',
58+
id: '8b2c3d4e-5f6a-4b8c-9d0e-1f2a3b4c5d6e',
5959
name: 'pelerines',
6060
description: 'silo with no default pools',
6161
time_created: new Date(2024, 0, 3).toISOString(),
@@ -65,7 +65,7 @@ export const silos: Json<Silo[]> = [
6565
mapped_fleet_roles: {},
6666
},
6767
{
68-
id: '9c3d4e5f-6a7b-7c9d-8e1f-2a3b4c5d6e7f',
68+
id: '9c3d4e5f-6a7b-4c9d-8e1f-2a3b4c5d6e7f',
6969
name: 'no-pools',
7070
description: 'silo with no IP pools',
7171
time_created: new Date(2024, 0, 11).toISOString(),
@@ -218,13 +218,13 @@ type DbScimToken = Json<ScimClientBearerToken> & { siloId: string }
218218

219219
export const scimTokens: DbScimToken[] = [
220220
{
221-
id: 'a1b2c3d4-e5f6-7890-abcd-ef1234567890',
221+
id: 'a1b2c3d4-e5f6-4890-abcd-ef1234567890',
222222
time_created: new Date(2025, 8, 15).toISOString(),
223223
time_expires: null,
224224
siloId: defaultSilo.id,
225225
},
226226
{
227-
id: 'b2c3d4e5-f6a7-8901-bcde-f12345678901',
227+
id: 'b2c3d4e5-f6a7-4901-bcde-f12345678901',
228228
time_created: new Date(2025, 8, 20).toISOString(),
229229
time_expires: null,
230230
siloId: defaultSilo.id,

mock-api/user.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -48,25 +48,25 @@ export const user6: Json<User> = {
4848

4949
// Users for test silos (different IP pool configurations)
5050
export const userKosman: Json<User> = {
51-
id: '9a8b7c6d-5e4f-3a2b-1c0d-9e8f7a6b5c4d',
51+
id: '9a8b7c6d-5e4f-4a2b-9c0d-9e8f7a6b5c4d',
5252
display_name: 'Aryeh Kosman',
5353
silo_id: myriadSilo.id,
5454
}
5555

5656
export const userAnscombe: Json<User> = {
57-
id: 'a9b8c7d6-e5f4-a3b2-c1d0-e9f8a7b6c5d4',
57+
id: 'a9b8c7d6-e5f4-43b2-81d0-e9f8a7b6c5d4',
5858
display_name: 'Elizabeth Anscombe',
5959
silo_id: thraxSilo.id,
6060
}
6161

6262
export const userAdorno: Json<User> = {
63-
id: 'b0c9d8e7-f6a5-b4c3-d2e1-f0a9b8c7d6e5',
63+
id: 'b0c9d8e7-f6a5-44c3-92e1-f0a9b8c7d6e5',
6464
display_name: 'Theodor Adorno',
6565
silo_id: pelerinesSilo.id,
6666
}
6767

6868
export const userNoPools: Json<User> = {
69-
id: 'c1d0e9f8-a7b6-c5d4-e3f2-a1b0c9d8e7f6',
69+
id: 'c1d0e9f8-a7b6-45d4-a3f2-a1b0c9d8e7f6',
7070
display_name: 'Antonio Gramsci',
7171
silo_id: noPoolsSilo.id,
7272
}

mock-api/vpc.ts

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ export const vpc2: Json<Vpc> = {
4545

4646
// VPCs for test silos (IP pool configuration testing)
4747
export const vpcKosman: Json<Vpc> = {
48-
id: 'd1e2f3a4-b5c6-7890-abcd-ef1234567890',
48+
id: 'd1e2f3a4-b5c6-4890-abcd-ef1234567890',
4949
name: 'kosman-vpc',
5050
description: 'VPC in myriad silo',
5151
dns_name: 'kosman-vpc',
@@ -57,7 +57,7 @@ export const vpcKosman: Json<Vpc> = {
5757
}
5858

5959
export const vpcAnscombe: Json<Vpc> = {
60-
id: 'e2f3a4b5-c6d7-8901-bcde-f12345678901',
60+
id: 'e2f3a4b5-c6d7-4901-bcde-f12345678901',
6161
name: 'anscombe-vpc',
6262
description: 'VPC in thrax silo',
6363
dns_name: 'anscombe-vpc',
@@ -69,7 +69,7 @@ export const vpcAnscombe: Json<Vpc> = {
6969
}
7070

7171
export const vpcAdorno: Json<Vpc> = {
72-
id: 'f3a4b5c6-d7e8-9012-cdef-123456789012',
72+
id: 'f3a4b5c6-d7e8-4012-8def-123456789012',
7373
name: 'adorno-vpc',
7474
description: 'VPC in pelerines silo',
7575
dns_name: 'adorno-vpc',
@@ -213,7 +213,7 @@ export const vpcSubnet2: Json<VpcSubnet> = {
213213

214214
// Subnets for test silos
215215
export const subnetKosman: Json<VpcSubnet> = {
216-
id: 'a1b2c3d4-e5f6-7890-1234-567890abcdef',
216+
id: 'a1b2c3d4-e5f6-4890-9234-567890abcdef',
217217
name: 'kosman-subnet',
218218
description: 'subnet in myriad silo',
219219
time_created,
@@ -224,7 +224,7 @@ export const subnetKosman: Json<VpcSubnet> = {
224224
}
225225

226226
export const subnetAnscombe: Json<VpcSubnet> = {
227-
id: 'b2c3d4e5-f6a7-8901-2345-67890abcdef1',
227+
id: 'b2c3d4e5-f6a7-4901-a345-67890abcdef1',
228228
name: 'anscombe-subnet',
229229
description: 'subnet in thrax silo',
230230
time_created,
@@ -235,7 +235,7 @@ export const subnetAnscombe: Json<VpcSubnet> = {
235235
}
236236

237237
export const subnetAdorno: Json<VpcSubnet> = {
238-
id: 'c3d4e5f6-a7b8-9012-3456-7890abcdef12',
238+
id: 'c3d4e5f6-a7b8-4012-b456-7890abcdef12',
239239
name: 'adorno-subnet',
240240
description: 'subnet in pelerines silo',
241241
time_created,

0 commit comments

Comments
 (0)