Skip to content

Commit 7d6e5bc

Browse files
author
Felix Franzén
committed
tests
1 parent cc904c2 commit 7d6e5bc

File tree

6 files changed

+276
-32
lines changed

6 files changed

+276
-32
lines changed

.github/workflows/pr.yml

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
name: Pull request
2+
3+
on:
4+
pull_request:
5+
branches: [master]
6+
7+
jobs:
8+
publish:
9+
runs-on: ubuntu-latest
10+
steps:
11+
- uses: actions/checkout@v1
12+
- uses: actions/setup-node@v1
13+
with:
14+
node-version: 10
15+
- run: npm install
16+
- run: npm test
17+
- run: npm run build

.github/workflows/push-master.yml

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,8 @@
1-
on: push
1+
name: Push master
2+
3+
on:
4+
push:
5+
branches: [master]
26

37
jobs:
48
publish:
@@ -9,6 +13,7 @@ jobs:
913
with:
1014
node-version: 10
1115
- run: npm install
16+
- run: npm test
1217
- run: npm run build
1318
- id: publish
1419
uses: JS-DevTools/npm-publish@v1

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
"bin": "./dist/cli.js",
77
"prepublish": "tsc -p ./tsconfig.json",
88
"scripts": {
9-
"test": "jest ./src --passWithNoTests",
9+
"test": "docker-compose up -d && sleep 5 && jest ./src --passWithNoTests && docker-compose down",
1010
"start:dev": "ts-node ./src/cli.ts",
1111
"build": "tsc -p ./tsconfig.json"
1212
},

src/format.ts

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import {
22
ColumnDescription,
33
Schema,
44
TableDescription,
5-
CompositeType,
5+
CompositeTypeDescription,
66
} from './get-schema'
77
import { CustomType } from './repository'
88
import json2md from 'json2md'
@@ -51,7 +51,7 @@ const generateViewsSection = (
5151

5252
const generateTypesSection = (
5353
customTypes: CustomType[],
54-
compositeTypes: CompositeType[],
54+
compositeTypes: CompositeTypeDescription[],
5555
typeNames: string[]
5656
) => {
5757
if (customTypes.length === 0 && compositeTypes.length === 0) {
@@ -71,7 +71,7 @@ const generateTablesMarkdown = (
7171

7272
const generateTypesMarkdown = (
7373
customTypes: CustomType[],
74-
compositeTypes: CompositeType[],
74+
compositeTypes: CompositeTypeDescription[],
7575
typeNames: string[]
7676
) =>
7777
[
@@ -100,7 +100,7 @@ const generateCustomTypeMarkdown = (
100100
}
101101

102102
const generateCompositeTypesMarkdown = (
103-
compositeTypes: CompositeType[],
103+
compositeTypes: CompositeTypeDescription[],
104104
customTypeNames: string[]
105105
) => {
106106
return compositeTypes
@@ -111,7 +111,7 @@ const generateCompositeTypesMarkdown = (
111111
}
112112

113113
const generateCompositeTypeMarkdown = (
114-
composite: CompositeType,
114+
composite: CompositeTypeDescription,
115115
customTypeNames: string[]
116116
) => {
117117
const headers = ['column name', 'type', 'position', 'required?']

src/get-schema.spec.ts

Lines changed: 217 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,219 @@
1+
import { CompositeTypeDescription, getSchema } from './get-schema'
2+
import {
3+
Column,
4+
CompositeType,
5+
CustomType,
6+
ForeignKey,
7+
PrimaryKey,
8+
Repository,
9+
Table,
10+
} from './repository'
11+
12+
const emptyRepository = {
13+
selectTables: jest.fn().mockResolvedValue([]),
14+
selectColumns: jest.fn().mockResolvedValue([]),
15+
selectViews: jest.fn().mockResolvedValue([]),
16+
selectForeignKeys: jest.fn().mockResolvedValue([]),
17+
selectPrimaryKeys: jest.fn().mockResolvedValue([]),
18+
selectCustomTypes: jest.fn().mockResolvedValue([]),
19+
selectCompositeTypes: jest.fn().mockResolvedValue([]),
20+
}
21+
122
describe('Get schema', () => {
2-
it('does something', () => {})
23+
it('returns empty results if no tables are available', async () => {
24+
const repository: Repository = {
25+
...emptyRepository,
26+
}
27+
28+
const schema = await getSchema(repository)
29+
expect(schema.tables.length).toBe(0)
30+
expect(schema.customTypes.length).toBe(0)
31+
expect(schema.compositeTypes.length).toBe(0)
32+
expect(schema.views.length).toBe(0)
33+
})
34+
35+
it('returns columns grouped by table', async () => {
36+
const mockTableName = 'table'
37+
const mockTables: Table[] = [
38+
{
39+
name: mockTableName,
40+
},
41+
]
42+
43+
const mockColumns: Column[] = [
44+
{
45+
table: mockTableName,
46+
name: 'column_1',
47+
isNullable: true,
48+
dataType: 'int',
49+
},
50+
{
51+
table: mockTableName,
52+
name: 'column_2',
53+
isNullable: true,
54+
dataType: 'int',
55+
},
56+
]
57+
const repository: Repository = {
58+
...emptyRepository,
59+
selectTables: jest.fn().mockResolvedValue(mockTables),
60+
selectColumns: jest.fn().mockResolvedValue(mockColumns),
61+
}
62+
63+
const schema = await getSchema(repository)
64+
expect(schema.tables.length).toBe(1)
65+
const schemaTable = schema.tables[0]
66+
67+
expect(schemaTable.name).toBe(mockTableName)
68+
expect(schemaTable.columns.length).toBe(mockColumns.length)
69+
70+
schemaTable.columns.forEach((c, index) => {
71+
expect(c.name).toBe(mockColumns[index].name)
72+
})
73+
})
74+
75+
it('sets foreign keys and primary keys by table and column name', async () => {
76+
const mockTableName = 'table'
77+
const mockForeignTableName = 'foreign_table'
78+
const mockSourceColumn = 'column'
79+
const mockForeignColumn = 'foreign_column'
80+
81+
const mockTables: Table[] = [
82+
{
83+
name: mockTableName,
84+
},
85+
{ name: mockForeignTableName },
86+
]
87+
88+
const mockColumns: Column[] = [
89+
{
90+
table: mockTableName,
91+
name: mockSourceColumn,
92+
isNullable: true,
93+
dataType: 'int',
94+
},
95+
{
96+
table: mockForeignTableName,
97+
name: mockForeignColumn,
98+
isNullable: true,
99+
dataType: 'int',
100+
},
101+
]
102+
103+
const mockFKs: ForeignKey[] = [
104+
{
105+
constraintName: '',
106+
sourceTable: mockTableName,
107+
sourceColumn: mockSourceColumn,
108+
foreignTable: mockForeignTableName,
109+
foreignColumn: mockForeignColumn,
110+
},
111+
]
112+
113+
const mockPKs: PrimaryKey[] = [
114+
{
115+
constraintName: '',
116+
table: mockForeignTableName,
117+
column: mockForeignColumn,
118+
},
119+
]
120+
const repository: Repository = {
121+
...emptyRepository,
122+
selectTables: jest.fn().mockResolvedValue(mockTables),
123+
selectColumns: jest.fn().mockResolvedValue(mockColumns),
124+
selectForeignKeys: jest.fn().mockResolvedValue(mockFKs),
125+
selectPrimaryKeys: jest.fn().mockResolvedValue(mockPKs),
126+
}
127+
128+
const schema = await getSchema(repository)
129+
expect(schema.tables.length).toBe(2)
130+
const sourceTable = schema.tables[0]
131+
const foreignTable = schema.tables[1]
132+
133+
expect(sourceTable.columns[0].foreignKey).toBe(
134+
`${mockForeignTableName}.foreign_column`
135+
)
136+
expect(foreignTable.columns[0].isPrimaryKey).toBe(true)
137+
})
138+
139+
it('sets custom types', async () => {
140+
const mockCustomTypes: CustomType[] = [
141+
{ name: 'custom', internalName: '_custom', elements: ['el'] },
142+
]
143+
const repository: Repository = {
144+
...emptyRepository,
145+
selectCustomTypes: jest.fn().mockResolvedValue(mockCustomTypes),
146+
}
147+
148+
const schema = await getSchema(repository)
149+
schema.customTypes.forEach((type, index) => {
150+
expect(type).toBe(mockCustomTypes[index])
151+
})
152+
})
153+
154+
it('ignores custom types without elements', async () => {
155+
const mockCustomTypes: CustomType[] = [
156+
{ name: 'custom', internalName: '_custom', elements: [] },
157+
]
158+
const repository: Repository = {
159+
...emptyRepository,
160+
selectCustomTypes: jest.fn().mockResolvedValue(mockCustomTypes),
161+
}
162+
163+
const schema = await getSchema(repository)
164+
expect(schema.customTypes.length).toBe(0)
165+
})
166+
167+
it('groups composite types', async () => {
168+
const mockCompositeTypeName = 'custom'
169+
const mockFirstCompositeType = {
170+
name: mockCompositeTypeName,
171+
columnName: 'column_1',
172+
dataType: 'int',
173+
position: 1,
174+
isRequired: true,
175+
}
176+
177+
const mockSecondCompositeType = {
178+
name: mockCompositeTypeName,
179+
columnName: 'column_2',
180+
dataType: 'int',
181+
position: 2,
182+
isRequired: true,
183+
}
184+
185+
const mockCompositeTypes: CompositeType[] = [
186+
mockFirstCompositeType,
187+
mockSecondCompositeType,
188+
]
189+
const repository: Repository = {
190+
...emptyRepository,
191+
selectCompositeTypes: jest.fn().mockResolvedValue(mockCompositeTypes),
192+
}
193+
194+
const schema = await getSchema(repository)
195+
expect(schema.compositeTypes.length).toBe(1)
196+
197+
const expectedStructure: CompositeTypeDescription[] = [
198+
{
199+
name: mockCompositeTypeName,
200+
fields: [
201+
{
202+
name: mockFirstCompositeType.columnName,
203+
dataType: mockFirstCompositeType.dataType,
204+
position: mockFirstCompositeType.position,
205+
isRequired: mockFirstCompositeType.isRequired,
206+
},
207+
{
208+
name: mockSecondCompositeType.columnName,
209+
dataType: mockSecondCompositeType.dataType,
210+
position: mockSecondCompositeType.position,
211+
isRequired: mockSecondCompositeType.isRequired,
212+
},
213+
],
214+
},
215+
]
216+
217+
expect(schema.compositeTypes).toEqual(expectedStructure)
218+
})
3219
})

0 commit comments

Comments
 (0)