Skip to content

Commit dd4d1a9

Browse files
committed
add more tests
1 parent 98ee642 commit dd4d1a9

11 files changed

+478
-92
lines changed

.github/workflows/ci.yml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,9 @@ name: CI
22

33
on:
44
push:
5+
paths:
6+
- '!**.md'
7+
- '!*.md'
58
branches:
69
- '**'
710
tags-ignore:

src/repositories/Schema.ts

Lines changed: 21 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import {
77
find as findServiceSchemaVersion,
88
findLatestServiceSchemaVersion,
99
} from './SchemaVersion'
10+
import { SchemaResponseModel } from '../types'
1011

1112
// cloudflare global kv binding
1213
declare const SERVICES: KV.Namespace
@@ -43,13 +44,15 @@ export function findByTypeDefs(serviceName: string, typeDefs: string) {
4344

4445
export async function findByServiceVersions(
4546
services: ServiceSchemaVersionMatch[],
46-
) {
47+
): Promise<{ schemas: SchemaResponseModel[]; error: Error | null }> {
4748
const schemas = []
49+
let error: Error | null = null
4850
for await (const service of services) {
4951
const serviceItem = await findService(service.name)
5052

5153
if (!serviceItem) {
52-
throw new Error(`Service "${service.name}" does not exist`)
54+
error = new Error(`Service "${service.name}" does not exist`)
55+
break
5356
}
5457

5558
if (!serviceItem.is_active) {
@@ -59,7 +62,8 @@ export async function findByServiceVersions(
5962
const links = await listSchemaVersionLinks(service.name)
6063

6164
if (links.length === 0) {
62-
throw new Error(`Service "${service.name}" has no versions registered`)
65+
error = new Error(`Service "${service.name}" has no versions registered`)
66+
break
6367
}
6468

6569
if (service.version) {
@@ -73,47 +77,53 @@ export async function findByServiceVersions(
7377
)
7478

7579
if (!schemaVersion) {
76-
throw new Error(
80+
error = new Error(
7781
`Service "${service.name}" has no schema in version "${service.version}" registered`,
7882
)
83+
break
7984
}
8085

8186
const schema = await find(service.name, schemaVersion.schema_id)
8287

8388
if (!schema) {
84-
throw new Error(
89+
error = new Error(
8590
`Service "${service.name}" has no schema with id "${schemaVersion.schema_id}" registered`,
8691
)
92+
break
8793
}
8894

8995
if (!schema.is_active) {
90-
throw new Error(
96+
error = new Error(
9197
`Schema with id "${schemaVersion.schema_id}" is not active`,
9298
)
99+
break
93100
}
94101

95102
schemas.push({
96103
...schema,
97104
version: schemaVersion.version,
98105
})
99106
} else {
100-
throw new Error(
107+
error = new Error(
101108
`Service "${service.name}" in version "${service.version}" is not registered`,
102109
)
110+
break
103111
}
104112
} else {
105113
const schemaVersion = await findLatestServiceSchemaVersion(service.name)
106-
114+
107115
if (!schemaVersion) {
108-
throw new Error(`Service "${service.name}" has no schema registered`)
116+
error = new Error(`Service "${service.name}" has no schema registered`)
117+
break
109118
}
110119

111120
const schema = await find(service.name, schemaVersion.schema_id)
112121

113122
if (!schema) {
114-
throw new Error(
123+
error = new Error(
115124
`Service "${service.name}" has no schema with id "${schemaVersion.schema_id}" registered`,
116125
)
126+
break
117127
}
118128

119129
schemas.push({
@@ -123,7 +133,7 @@ export async function findByServiceVersions(
123133
}
124134
}
125135

126-
return schemas
136+
return { error, schemas }
127137
}
128138

129139
export function save(serviceName: string, item: Schema) {
Lines changed: 146 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,146 @@
1+
import test from 'ava'
2+
import { assert, literal, number, object, size, string } from 'superstruct'
3+
import { NewNamespace, Request, Response } from '../test-utils'
4+
import { SuccessResponse, SchemaResponseModel, ErrorResponse } from '../types'
5+
import { getComposedSchemaByVersions } from './get-composed-schema-versions'
6+
import { registerSchema } from './register-schema'
7+
8+
test.serial('Should return a specific schema version', async (t) => {
9+
NewNamespace({
10+
name: 'SERVICES',
11+
})
12+
13+
let req = Request('POST', '', {
14+
type_defs: 'type Query { hello: String }',
15+
version: '1',
16+
name: 'foo',
17+
})
18+
let res = Response()
19+
await registerSchema(req, res)
20+
21+
t.is(res.statusCode, 200)
22+
23+
req = Request('POST', '', {
24+
type_defs: 'type Query2 { hello: String }',
25+
version: '2',
26+
name: 'bar',
27+
})
28+
res = Response()
29+
await registerSchema(req, res)
30+
31+
t.is(res.statusCode, 200)
32+
33+
req = Request('POST', '', {
34+
type_defs: 'type Query3 { hello: String }',
35+
version: '3',
36+
name: 'baz',
37+
})
38+
res = Response()
39+
await registerSchema(req, res)
40+
41+
t.is(res.statusCode, 200)
42+
43+
req = Request('POST', '', {
44+
services: [
45+
{
46+
name: 'bar',
47+
version: '2',
48+
},
49+
],
50+
})
51+
res = Response()
52+
await getComposedSchemaByVersions(req, res)
53+
54+
t.is(res.statusCode, 200)
55+
56+
const result = (res.body as any) as SuccessResponse<SchemaResponseModel[]>
57+
58+
t.true(result.success)
59+
t.is(result.data.length, 1)
60+
61+
assert(
62+
result.data[0],
63+
object({
64+
uid: size(string(), 4, 11),
65+
is_active: literal(true),
66+
service_id: literal('bar'),
67+
type_defs: literal('type Query2 { hello: String }'),
68+
created_at: number(),
69+
updated_at: literal(null),
70+
version: literal('2'),
71+
}),
72+
)
73+
})
74+
75+
test.serial(
76+
'Should return 404 when schema in version could not be found',
77+
async (t) => {
78+
NewNamespace({
79+
name: 'SERVICES',
80+
})
81+
82+
let req = Request('POST', '', {
83+
type_defs: 'type Query { hello: String }',
84+
version: '1',
85+
name: 'foo',
86+
})
87+
let res = Response()
88+
await registerSchema(req, res)
89+
90+
t.is(res.statusCode, 200)
91+
92+
req = Request('POST', '', {
93+
services: [
94+
{
95+
name: 'foo',
96+
version: '2',
97+
},
98+
],
99+
})
100+
res = Response()
101+
await getComposedSchemaByVersions(req, res)
102+
103+
t.is(res.statusCode, 400)
104+
105+
const result = (res.body as any) as ErrorResponse
106+
107+
t.false(result.success)
108+
t.is(result.error, 'Service "foo" in version "2" is not registered')
109+
},
110+
)
111+
112+
test.serial('Should return 400 when no version was specified', async (t) => {
113+
NewNamespace({
114+
name: 'SERVICES',
115+
})
116+
117+
let req = Request('POST', '', {
118+
type_defs: 'type Query { hello: String }',
119+
version: '1',
120+
name: 'foo',
121+
})
122+
let res = Response()
123+
await registerSchema(req, res)
124+
125+
t.is(res.statusCode, 200)
126+
127+
req = Request('POST', '', {
128+
services: [
129+
{
130+
name: 'foo',
131+
},
132+
],
133+
})
134+
res = Response()
135+
await getComposedSchemaByVersions(req, res)
136+
137+
t.is(res.statusCode, 400)
138+
139+
const result = (res.body as any) as ErrorResponse
140+
141+
t.false(result.success)
142+
t.is(
143+
result.error,
144+
'At path: services.0.version -- Expected a string, but received: undefined',
145+
)
146+
})

src/routes/get-composed-schema-versions.ts

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -44,11 +44,18 @@ export const getComposedSchemaByVersions: Handler = async function (req, res) {
4444
version: s.version,
4545
}))
4646

47-
const result: SchemaResponseModel[] = await findSchemasByServiceVersions(
47+
const { schemas, error: findError } = await findSchemasByServiceVersions(
4848
allServiceVersions,
4949
)
5050

51-
const serviceSchemas = result.map((s) => ({
51+
if (findError) {
52+
return res.send(400, {
53+
success: false,
54+
error: findError?.message,
55+
})
56+
}
57+
58+
const serviceSchemas = schemas.map((s) => ({
5259
name: s.service_id,
5360
typeDefs: s.type_defs,
5461
}))
@@ -64,7 +71,7 @@ export const getComposedSchemaByVersions: Handler = async function (req, res) {
6471

6572
const responseBody: SuccessResponse<SchemaResponseModel[]> = {
6673
success: true,
67-
data: result,
74+
data: schemas,
6875
}
6976

7077
res.send(200, responseBody)

0 commit comments

Comments
 (0)