test(wip): apps.resolver
This commit is contained in:
parent
86d51a6293
commit
c5b4a95abb
10 changed files with 990 additions and 21 deletions
4
.husky/commit-msg
Executable file
4
.husky/commit-msg
Executable file
|
@ -0,0 +1,4 @@
|
||||||
|
#!/bin/sh
|
||||||
|
. "$(dirname "$0")/_/husky.sh"
|
||||||
|
|
||||||
|
npx --no -- commitlint --edit $1
|
3
commitlint.config.js
Normal file
3
commitlint.config.js
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
module.exports = {
|
||||||
|
extends: ["@commitlint/config-conventional"],
|
||||||
|
};
|
14
package.json
14
package.json
|
@ -5,6 +5,7 @@
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"test": "jest",
|
"test": "jest",
|
||||||
"prepare": "husky install",
|
"prepare": "husky install",
|
||||||
|
"commit": "git-cz",
|
||||||
"act:test-install": "act --container-architecture linux/amd64 -j test-install",
|
"act:test-install": "act --container-architecture linux/amd64 -j test-install",
|
||||||
"act:docker": "act --container-architecture linux/amd64 --secret-file github.secrets -j build-images",
|
"act:docker": "act --container-architecture linux/amd64 --secret-file github.secrets -j build-images",
|
||||||
"start:dev": "docker-compose -f docker-compose.dev.yml --env-file .env.dev up --build",
|
"start:dev": "docker-compose -f docker-compose.dev.yml --env-file .env.dev up --build",
|
||||||
|
@ -22,7 +23,11 @@
|
||||||
"jest": "^28.1.0",
|
"jest": "^28.1.0",
|
||||||
"js-yaml": "^4.1.0",
|
"js-yaml": "^4.1.0",
|
||||||
"ts-jest": "^28.0.2",
|
"ts-jest": "^28.0.2",
|
||||||
"typescript": "4.6.4"
|
"typescript": "4.6.4",
|
||||||
|
"@commitlint/cli": "^17.0.3",
|
||||||
|
"@commitlint/config-conventional": "^17.0.3",
|
||||||
|
"@commitlint/cz-commitlint": "^17.0.3",
|
||||||
|
"commitizen": "^4.2.4"
|
||||||
},
|
},
|
||||||
"repository": {
|
"repository": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
|
@ -34,5 +39,10 @@
|
||||||
"url": "https://github.com/meienberger/runtipi/issues"
|
"url": "https://github.com/meienberger/runtipi/issues"
|
||||||
},
|
},
|
||||||
"homepage": "https://github.com/meienberger/runtipi#readme",
|
"homepage": "https://github.com/meienberger/runtipi#readme",
|
||||||
"dependencies": {}
|
"dependencies": {},
|
||||||
|
"config": {
|
||||||
|
"commitizen": {
|
||||||
|
"path": "@commitlint/cz-commitlint"
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -8,4 +8,7 @@ module.exports = {
|
||||||
collectCoverage: true,
|
collectCoverage: true,
|
||||||
collectCoverageFrom: ['src/**/*.{ts,tsx}'],
|
collectCoverageFrom: ['src/**/*.{ts,tsx}'],
|
||||||
passWithNoTests: true,
|
passWithNoTests: true,
|
||||||
|
transform: {
|
||||||
|
'^.+\\.graphql$': 'graphql-import-node/jest',
|
||||||
|
},
|
||||||
};
|
};
|
||||||
|
|
|
@ -79,6 +79,7 @@
|
||||||
"eslint-config-prettier": "^8.5.0",
|
"eslint-config-prettier": "^8.5.0",
|
||||||
"eslint-plugin-import": "^2.26.0",
|
"eslint-plugin-import": "^2.26.0",
|
||||||
"eslint-plugin-prettier": "^4.0.0",
|
"eslint-plugin-prettier": "^4.0.0",
|
||||||
|
"graphql-import-node": "^0.0.5",
|
||||||
"jest": "^28.1.0",
|
"jest": "^28.1.0",
|
||||||
"nodemon": "^2.0.15",
|
"nodemon": "^2.0.15",
|
||||||
"prettier": "2.6.2",
|
"prettier": "2.6.2",
|
||||||
|
|
|
@ -0,0 +1,54 @@
|
||||||
|
import { DataSource } from 'typeorm';
|
||||||
|
import { setupConnection, teardownConnection } from '../../../test/connection';
|
||||||
|
import fs from 'fs';
|
||||||
|
import { gcall } from '../../../test/gcall';
|
||||||
|
import App from '../app.entity';
|
||||||
|
import { listAppInfosQuery } from '../../../test/queries';
|
||||||
|
import { createApp } from './apps.factory';
|
||||||
|
import { AppInfo, ListAppsResonse } from '../apps.types';
|
||||||
|
|
||||||
|
jest.mock('fs');
|
||||||
|
|
||||||
|
let db: DataSource | null = null;
|
||||||
|
const TEST_SUITE = 'appsresolver';
|
||||||
|
|
||||||
|
beforeAll(async () => {
|
||||||
|
db = await setupConnection(TEST_SUITE);
|
||||||
|
});
|
||||||
|
|
||||||
|
afterAll(async () => {
|
||||||
|
await db?.destroy();
|
||||||
|
await teardownConnection(TEST_SUITE);
|
||||||
|
});
|
||||||
|
|
||||||
|
beforeEach(async () => {
|
||||||
|
jest.resetModules();
|
||||||
|
jest.resetAllMocks();
|
||||||
|
jest.restoreAllMocks();
|
||||||
|
await App.clear();
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('ListAppsInfos', () => {
|
||||||
|
let app1: AppInfo;
|
||||||
|
|
||||||
|
beforeEach(async () => {
|
||||||
|
const { MockFiles, appInfo } = await createApp();
|
||||||
|
app1 = appInfo;
|
||||||
|
// @ts-ignore
|
||||||
|
fs.__createMockFiles(MockFiles);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('Can list apps', async () => {
|
||||||
|
const { data } = await gcall<{ listAppsInfo: ListAppsResonse }>({ source: listAppInfosQuery });
|
||||||
|
|
||||||
|
expect(data?.listAppsInfo.apps.length).toBe(1);
|
||||||
|
expect(data?.listAppsInfo.total).toBe(1);
|
||||||
|
|
||||||
|
const app = data?.listAppsInfo.apps[0];
|
||||||
|
|
||||||
|
expect(app?.id).toBe(app1.id);
|
||||||
|
expect(app?.author).toBe(app1.author);
|
||||||
|
expect(app?.name).toBe(app1.name);
|
||||||
|
expect(app?.available).toBe(app1.available);
|
||||||
|
});
|
||||||
|
});
|
26
packages/system-api/src/test/gcall.ts
Normal file
26
packages/system-api/src/test/gcall.ts
Normal file
|
@ -0,0 +1,26 @@
|
||||||
|
import { ExecutionResult, graphql, GraphQLSchema } from 'graphql';
|
||||||
|
import { Maybe } from 'type-graphql';
|
||||||
|
import { createSchema } from '../schema';
|
||||||
|
|
||||||
|
interface Options {
|
||||||
|
source: string;
|
||||||
|
variableValues?: Maybe<{
|
||||||
|
[key: string]: any;
|
||||||
|
}>;
|
||||||
|
userId?: number;
|
||||||
|
}
|
||||||
|
|
||||||
|
let schema: GraphQLSchema | null = null;
|
||||||
|
|
||||||
|
export const gcall = async <T>({ source, variableValues, userId }: Options): Promise<ExecutionResult<T, { [key: string]: any }>> => {
|
||||||
|
if (!schema) {
|
||||||
|
schema = await createSchema();
|
||||||
|
}
|
||||||
|
|
||||||
|
return graphql({
|
||||||
|
schema,
|
||||||
|
source,
|
||||||
|
variableValues,
|
||||||
|
contextValue: { req: { session: { userId } } },
|
||||||
|
}) as any;
|
||||||
|
};
|
7
packages/system-api/src/test/queries/index.ts
Normal file
7
packages/system-api/src/test/queries/index.ts
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
/* eslint-disable import/no-extraneous-dependencies */
|
||||||
|
import 'graphql-import-node';
|
||||||
|
import { print } from 'graphql/language/printer';
|
||||||
|
|
||||||
|
import * as listAppInfos from './listAppInfos.graphql';
|
||||||
|
|
||||||
|
export const listAppInfosQuery = print(listAppInfos);
|
24
packages/system-api/src/test/queries/listAppInfos.graphql
Normal file
24
packages/system-api/src/test/queries/listAppInfos.graphql
Normal file
|
@ -0,0 +1,24 @@
|
||||||
|
query {
|
||||||
|
listAppsInfo {
|
||||||
|
apps {
|
||||||
|
id
|
||||||
|
available
|
||||||
|
port
|
||||||
|
name
|
||||||
|
description
|
||||||
|
version
|
||||||
|
author
|
||||||
|
source
|
||||||
|
categories
|
||||||
|
url_suffix
|
||||||
|
form_fields {
|
||||||
|
max
|
||||||
|
min
|
||||||
|
required
|
||||||
|
env_variable
|
||||||
|
}
|
||||||
|
requirements
|
||||||
|
}
|
||||||
|
total
|
||||||
|
}
|
||||||
|
}
|
875
pnpm-lock.yaml
875
pnpm-lock.yaml
File diff suppressed because it is too large
Load diff
Loading…
Reference in a new issue