@into-cps-association/libms 0.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.env +9 -0
- package/.eslintignore +6 -0
- package/.eslintrc +53 -0
- package/.madgerc +18 -0
- package/.prettierrc +4 -0
- package/API.md +211 -0
- package/DEVELOPER.md +60 -0
- package/LICENSE.md +301 -0
- package/README.md +119 -0
- package/dist/src/app.module.d.ts +2 -0
- package/dist/src/app.module.js +36 -0
- package/dist/src/app.module.js.map +1 -0
- package/dist/src/bootstrap.d.ts +6 -0
- package/dist/src/bootstrap.js +27 -0
- package/dist/src/bootstrap.js.map +1 -0
- package/dist/src/files/files.module.d.ts +2 -0
- package/dist/src/files/files.module.js +27 -0
- package/dist/src/files/files.module.js.map +1 -0
- package/dist/src/files/interfaces/files.service.interface.d.ts +5 -0
- package/dist/src/files/interfaces/files.service.interface.js +3 -0
- package/dist/src/files/interfaces/files.service.interface.js.map +1 -0
- package/dist/src/files/queries.d.ts +2 -0
- package/dist/src/files/queries.js +47 -0
- package/dist/src/files/queries.js.map +1 -0
- package/dist/src/files/resolvers/files.resolver.d.ts +8 -0
- package/dist/src/files/resolvers/files.resolver.js +49 -0
- package/dist/src/files/resolvers/files.resolver.js.map +1 -0
- package/dist/src/files/services/files-service.factory.d.ts +11 -0
- package/dist/src/files/services/files-service.factory.js +48 -0
- package/dist/src/files/services/files-service.factory.js.map +1 -0
- package/dist/src/files/services/gitlab-files.service.d.ts +12 -0
- package/dist/src/files/services/gitlab-files.service.js +65 -0
- package/dist/src/files/services/gitlab-files.service.js.map +1 -0
- package/dist/src/files/services/local-files.service.d.ts +11 -0
- package/dist/src/files/services/local-files.service.js +77 -0
- package/dist/src/files/services/local-files.service.js.map +1 -0
- package/dist/src/main.d.ts +2 -0
- package/dist/src/main.js +20 -0
- package/dist/src/main.js.map +1 -0
- package/dist/src/types.d.ts +43 -0
- package/dist/src/types.js +181 -0
- package/dist/src/types.js.map +1 -0
- package/dist/test/e2e/app.e2e.spec.d.ts +1 -0
- package/dist/test/e2e/app.e2e.spec.js +36 -0
- package/dist/test/e2e/app.e2e.spec.js.map +1 -0
- package/dist/test/integration/files.service.integration.spec.d.ts +1 -0
- package/dist/test/integration/files.service.integration.spec.js +53 -0
- package/dist/test/integration/files.service.integration.spec.js.map +1 -0
- package/dist/test/testUtil.d.ts +88 -0
- package/dist/test/testUtil.js +182 -0
- package/dist/test/testUtil.js.map +1 -0
- package/dist/test/unit/files-service.factory.unit.spec.d.ts +1 -0
- package/dist/test/unit/files-service.factory.unit.spec.js +40 -0
- package/dist/test/unit/files-service.factory.unit.spec.js.map +1 -0
- package/dist/test/unit/files.resolver.unit.spec.d.ts +1 -0
- package/dist/test/unit/files.resolver.unit.spec.js +56 -0
- package/dist/test/unit/files.resolver.unit.spec.js.map +1 -0
- package/dist/test/unit/gitlab-files.service.unit.spec.d.ts +1 -0
- package/dist/test/unit/gitlab-files.service.unit.spec.js +37 -0
- package/dist/test/unit/gitlab-files.service.unit.spec.js.map +1 -0
- package/dist/test/unit/local-files.service.unit.spec.d.ts +1 -0
- package/dist/test/unit/local-files.service.unit.spec.js +84 -0
- package/dist/test/unit/local-files.service.unit.spec.js.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -0
- package/jest.config.json +30 -0
- package/nest-cli.json +8 -0
- package/package.json +71 -0
- package/src/app.module.ts +24 -0
- package/src/bootstrap.ts +29 -0
- package/src/files/files.module.ts +15 -0
- package/src/files/interfaces/files.service.interface.ts +7 -0
- package/src/files/queries.ts +42 -0
- package/src/files/resolvers/files.resolver.ts +23 -0
- package/src/files/services/files-service.factory.ts +27 -0
- package/src/files/services/gitlab-files.service.ts +65 -0
- package/src/files/services/local-files.service.ts +76 -0
- package/src/main.ts +27 -0
- package/src/schema.gql +58 -0
- package/src/types.ts +92 -0
- package/test/README.md +33 -0
- package/test/coverage/clover.xml +40 -0
- package/test/coverage/coverage-final.json +2 -0
- package/test/coverage/lcov-report/base.css +224 -0
- package/test/coverage/lcov-report/block-navigation.js +87 -0
- package/test/coverage/lcov-report/favicon.png +0 -0
- package/test/coverage/lcov-report/index.html +116 -0
- package/test/coverage/lcov-report/prettify.css +1 -0
- package/test/coverage/lcov-report/prettify.js +2 -0
- package/test/coverage/lcov-report/sort-arrow-sprite.png +0 -0
- package/test/coverage/lcov-report/sorter.js +196 -0
- package/test/coverage/lcov-report/testUtil.ts.html +655 -0
- package/test/coverage/lcov.info +52 -0
- package/test/data/user2/data/.gitkeep +0 -0
- package/test/data/user2/digital_twins/.gitkeep +0 -0
- package/test/data/user2/functions/.gitkeep +0 -0
- package/test/data/user2/models/.gitkeep +0 -0
- package/test/data/user2/tools/.gitkeep +0 -0
- package/test/data/user2/tools/README.md +1 -0
- package/test/e2e/app.e2e.spec.ts +79 -0
- package/test/integration/files.service.integration.spec.ts +67 -0
- package/test/jest-e2e.json +9 -0
- package/test/starttraefik.bash +11 -0
- package/test/stoptraefik.bash +9 -0
- package/test/testUtil.ts +190 -0
- package/test/unit/files-service.factory.unit.spec.ts +46 -0
- package/test/unit/files.resolver.unit.spec.ts +70 -0
- package/test/unit/gitlab-files.service.unit.spec.ts +46 -0
- package/test/unit/local-files.service.unit.spec.ts +108 -0
- package/tsconfig.json +31 -0
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
TN:
|
|
2
|
+
SF:test/testUtil.ts
|
|
3
|
+
FN:51,sleep
|
|
4
|
+
FN:58,(anonymous_1)
|
|
5
|
+
FNF:2
|
|
6
|
+
FNH:0
|
|
7
|
+
FNDA:0,sleep
|
|
8
|
+
FNDA:0,(anonymous_1)
|
|
9
|
+
DA:1,1
|
|
10
|
+
DA:2,1
|
|
11
|
+
DA:4,1
|
|
12
|
+
DA:7,1
|
|
13
|
+
DA:9,1
|
|
14
|
+
DA:11,1
|
|
15
|
+
DA:27,1
|
|
16
|
+
DA:28,1
|
|
17
|
+
DA:29,1
|
|
18
|
+
DA:30,1
|
|
19
|
+
DA:37,1
|
|
20
|
+
DA:51,1
|
|
21
|
+
DA:52,0
|
|
22
|
+
DA:53,0
|
|
23
|
+
DA:56,1
|
|
24
|
+
DA:59,0
|
|
25
|
+
DA:61,0
|
|
26
|
+
DA:63,0
|
|
27
|
+
DA:65,0
|
|
28
|
+
DA:67,0
|
|
29
|
+
DA:69,0
|
|
30
|
+
DA:70,0
|
|
31
|
+
DA:72,0
|
|
32
|
+
DA:73,0
|
|
33
|
+
DA:75,0
|
|
34
|
+
DA:78,0
|
|
35
|
+
DA:83,1
|
|
36
|
+
DA:102,1
|
|
37
|
+
DA:142,1
|
|
38
|
+
DA:160,1
|
|
39
|
+
DA:178,1
|
|
40
|
+
LF:31
|
|
41
|
+
LH:18
|
|
42
|
+
BRDA:59,0,0,0
|
|
43
|
+
BRDA:59,0,1,0
|
|
44
|
+
BRDA:59,0,2,0
|
|
45
|
+
BRDA:59,0,3,0
|
|
46
|
+
BRDA:59,0,4,0
|
|
47
|
+
BRDA:59,0,5,0
|
|
48
|
+
BRDA:69,1,0,0
|
|
49
|
+
BRDA:72,2,0,0
|
|
50
|
+
BRF:8
|
|
51
|
+
BRH:0
|
|
52
|
+
end_of_record
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
content123
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import { Test, TestingModule } from '@nestjs/testing';
|
|
2
|
+
import { INestApplication } from '@nestjs/common';
|
|
3
|
+
import * as request from 'supertest';
|
|
4
|
+
// import { execSync } from "child_process";
|
|
5
|
+
import AppModule from '../../src/app.module';
|
|
6
|
+
import {
|
|
7
|
+
e2eReadFile,
|
|
8
|
+
e2elistDirectory,
|
|
9
|
+
expectedFileContentResponse,
|
|
10
|
+
expectedListDirectoryResponse,
|
|
11
|
+
} from '../testUtil';
|
|
12
|
+
|
|
13
|
+
describe('End to End test for the application', () => {
|
|
14
|
+
let app: INestApplication;
|
|
15
|
+
|
|
16
|
+
beforeAll(async () => {
|
|
17
|
+
// execSync("test/starttraefik.bash");
|
|
18
|
+
|
|
19
|
+
const moduleFixture: TestingModule = await Test.createTestingModule({
|
|
20
|
+
imports: [AppModule],
|
|
21
|
+
}).compile();
|
|
22
|
+
app = moduleFixture.createNestApplication();
|
|
23
|
+
await app.init(); // Initialize the application
|
|
24
|
+
await app.listen(process.env.PORT);
|
|
25
|
+
|
|
26
|
+
// eslint-disable-next-line no-promise-executor-return
|
|
27
|
+
await new Promise((resolve) => setTimeout(resolve, 4000));
|
|
28
|
+
}, 10000);
|
|
29
|
+
|
|
30
|
+
afterAll(async () => {
|
|
31
|
+
// execSync("test/stoptraefik.bash");
|
|
32
|
+
await app.close();
|
|
33
|
+
}, 10000);
|
|
34
|
+
|
|
35
|
+
it('should return the filename corresponding to the directory given in the query', async () => {
|
|
36
|
+
const query = e2elistDirectory;
|
|
37
|
+
|
|
38
|
+
const response = await request('http://localhost:4001')
|
|
39
|
+
.post(process.env.APOLLO_PATH)
|
|
40
|
+
.send({ query });
|
|
41
|
+
expect(response.body).toEqual(expectedListDirectoryResponse);
|
|
42
|
+
}, 10000);
|
|
43
|
+
|
|
44
|
+
it('should return the content of a file given in the query ', async () => {
|
|
45
|
+
const query = e2eReadFile;
|
|
46
|
+
|
|
47
|
+
const response = await request('http://localhost:4001')
|
|
48
|
+
.post(process.env.APOLLO_PATH)
|
|
49
|
+
.send({ query });
|
|
50
|
+
expect(response.body).toEqual(expectedFileContentResponse);
|
|
51
|
+
}, 10000);
|
|
52
|
+
});
|
|
53
|
+
|
|
54
|
+
/*
|
|
55
|
+
describe("End to End test for the application", () => {
|
|
56
|
+
it("should return the filename corresponding to the directory given in the query through the Traefik gateway", async () => {
|
|
57
|
+
const query = e2elistDirectory;
|
|
58
|
+
|
|
59
|
+
const response = await request("http://localhost")
|
|
60
|
+
.post("/lib")
|
|
61
|
+
.send({ query });
|
|
62
|
+
|
|
63
|
+
response;
|
|
64
|
+
expect(response.body).toEqual(expectedListDirectoryResponse);
|
|
65
|
+
}, 10000);
|
|
66
|
+
|
|
67
|
+
it("should return the content of a file given in the query through the Traefik gateway", async () => {
|
|
68
|
+
const query = e2eReadFile;
|
|
69
|
+
|
|
70
|
+
const response = await request("http://localhost")
|
|
71
|
+
.post("/lib")
|
|
72
|
+
.send({ query });
|
|
73
|
+
|
|
74
|
+
response;
|
|
75
|
+
expect(response.body).toEqual(expectedFileContentResponse);
|
|
76
|
+
}, 10000);
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
*/
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import { Test, TestingModule } from '@nestjs/testing';
|
|
2
|
+
import { ConfigService } from '@nestjs/config';
|
|
3
|
+
import FilesResolver from '../../src/files/resolvers/files.resolver';
|
|
4
|
+
import FilesServiceFactory from '../../src/files/services/files-service.factory';
|
|
5
|
+
import LocalFilesService from '../../src/files/services/local-files.service';
|
|
6
|
+
import GitlabFilesService from '../../src/files/services/gitlab-files.service';
|
|
7
|
+
import {
|
|
8
|
+
pathToTestDirectory,
|
|
9
|
+
pathToTestFileContent,
|
|
10
|
+
testDirectory,
|
|
11
|
+
testFileContent,
|
|
12
|
+
MockConfigService,
|
|
13
|
+
} from '../testUtil';
|
|
14
|
+
|
|
15
|
+
describe('Integration tests for FilesResolver', () => {
|
|
16
|
+
let filesResolver: FilesResolver;
|
|
17
|
+
let mockConfigService: MockConfigService;
|
|
18
|
+
|
|
19
|
+
beforeEach(async () => {
|
|
20
|
+
mockConfigService = new MockConfigService();
|
|
21
|
+
const module: TestingModule = await Test.createTestingModule({
|
|
22
|
+
providers: [
|
|
23
|
+
FilesResolver,
|
|
24
|
+
FilesServiceFactory,
|
|
25
|
+
LocalFilesService,
|
|
26
|
+
GitlabFilesService,
|
|
27
|
+
{ provide: ConfigService, useClass: MockConfigService },
|
|
28
|
+
],
|
|
29
|
+
}).compile();
|
|
30
|
+
|
|
31
|
+
filesResolver = module.get<FilesResolver>(FilesResolver);
|
|
32
|
+
});
|
|
33
|
+
|
|
34
|
+
afterEach(() => {
|
|
35
|
+
jest.clearAllMocks();
|
|
36
|
+
});
|
|
37
|
+
|
|
38
|
+
const modes = ['local', 'gitlab'];
|
|
39
|
+
|
|
40
|
+
// eslint-disable-next-line no-restricted-syntax
|
|
41
|
+
for (const mode of modes) {
|
|
42
|
+
// eslint-disable-next-line no-loop-func
|
|
43
|
+
describe(`when MODE is ${mode}`, () => {
|
|
44
|
+
beforeEach(() => {
|
|
45
|
+
jest.spyOn(mockConfigService, 'get').mockReturnValue(mode);
|
|
46
|
+
});
|
|
47
|
+
|
|
48
|
+
it('should be defined', () => {
|
|
49
|
+
expect(filesResolver).toBeDefined();
|
|
50
|
+
});
|
|
51
|
+
|
|
52
|
+
describe('listDirectory', () => {
|
|
53
|
+
it('should list files', async () => {
|
|
54
|
+
const files = await filesResolver.listDirectory(pathToTestDirectory);
|
|
55
|
+
expect(files).toEqual(testDirectory);
|
|
56
|
+
});
|
|
57
|
+
});
|
|
58
|
+
|
|
59
|
+
describe('readFile', () => {
|
|
60
|
+
it('should read file', async () => {
|
|
61
|
+
const content = await filesResolver.readFile(pathToTestFileContent);
|
|
62
|
+
expect(content).toEqual(testFileContent);
|
|
63
|
+
});
|
|
64
|
+
});
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
});
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
|
|
3
|
+
echo "Starting the Traefik gateway"
|
|
4
|
+
cd ../../servers/config/gateway || exit 1
|
|
5
|
+
docker run -d \
|
|
6
|
+
--name "traefik-gateway" \
|
|
7
|
+
--network=host -v "$PWD/traefik.yml":/etc/traefik/traefik.yml \
|
|
8
|
+
-v "$PWD/dynamic":/etc/traefik/dynamic \
|
|
9
|
+
-v /var/run/docker.sock:/var/run/docker.sock \
|
|
10
|
+
--restart always \
|
|
11
|
+
traefik:v2.10
|
package/test/testUtil.ts
ADDED
|
@@ -0,0 +1,190 @@
|
|
|
1
|
+
import * as dotenv from 'dotenv';
|
|
2
|
+
import { setTimeout } from 'timers/promises';
|
|
3
|
+
|
|
4
|
+
dotenv.config({ path: '.env' });
|
|
5
|
+
|
|
6
|
+
// actual data for integration and e2e tests
|
|
7
|
+
export const readFileActualContent = ['content123'];
|
|
8
|
+
|
|
9
|
+
export const pathToTestDirectory = 'user2';
|
|
10
|
+
|
|
11
|
+
export const testDirectory = {
|
|
12
|
+
repository: {
|
|
13
|
+
tree: {
|
|
14
|
+
blobs: { edges: [] },
|
|
15
|
+
trees: {
|
|
16
|
+
edges: [
|
|
17
|
+
{ node: { name: 'data', type: 'tree' } },
|
|
18
|
+
{ node: { name: 'digital_twins', type: 'tree' } },
|
|
19
|
+
{ node: { name: 'functions', type: 'tree' } },
|
|
20
|
+
{ node: { name: 'models', type: 'tree' } },
|
|
21
|
+
{ node: { name: 'tools', type: 'tree' } },
|
|
22
|
+
],
|
|
23
|
+
},
|
|
24
|
+
},
|
|
25
|
+
},
|
|
26
|
+
};
|
|
27
|
+
export const testFileName = 'README.md';
|
|
28
|
+
export const fstestFileContent = 'content123';
|
|
29
|
+
export const pathToTestFileContent = 'user2/tools/README.md';
|
|
30
|
+
export const testFileArray = [
|
|
31
|
+
'data',
|
|
32
|
+
'digital_twins',
|
|
33
|
+
'functions',
|
|
34
|
+
'models',
|
|
35
|
+
'tools',
|
|
36
|
+
];
|
|
37
|
+
export const testFileContent = {
|
|
38
|
+
repository: {
|
|
39
|
+
blobs: {
|
|
40
|
+
nodes: [
|
|
41
|
+
{
|
|
42
|
+
name: 'README.md',
|
|
43
|
+
rawBlob: 'content123',
|
|
44
|
+
rawTextBlob: 'content123',
|
|
45
|
+
},
|
|
46
|
+
],
|
|
47
|
+
},
|
|
48
|
+
},
|
|
49
|
+
};
|
|
50
|
+
|
|
51
|
+
export function sleep(ms) {
|
|
52
|
+
const timer = setTimeout(ms);
|
|
53
|
+
Promise.resolve(timer);
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
export class MockConfigService {
|
|
57
|
+
// eslint-disable-next-line class-methods-use-this
|
|
58
|
+
get(key: string): string {
|
|
59
|
+
switch (key) {
|
|
60
|
+
case 'TOKEN':
|
|
61
|
+
return process.env.TOKEN;
|
|
62
|
+
case 'LOCAL_PATH':
|
|
63
|
+
return process.env.TEST_PATH;
|
|
64
|
+
case 'GITLAB_URL':
|
|
65
|
+
return process.env.GITLAB_URL;
|
|
66
|
+
case 'GITLAB_GROUP':
|
|
67
|
+
return 'dtaas';
|
|
68
|
+
case 'MODE':
|
|
69
|
+
if (process.env.MODE === 'gitlab') {
|
|
70
|
+
return 'gitlab';
|
|
71
|
+
}
|
|
72
|
+
if (process.env.MODE === 'local') {
|
|
73
|
+
return 'local';
|
|
74
|
+
}
|
|
75
|
+
return 'unknown';
|
|
76
|
+
|
|
77
|
+
default:
|
|
78
|
+
return undefined;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
export const mockReadFileResponseData = {
|
|
84
|
+
project: {
|
|
85
|
+
__typename: 'Project',
|
|
86
|
+
repository: {
|
|
87
|
+
__typename: 'Repository',
|
|
88
|
+
blobs: {
|
|
89
|
+
nodes: [
|
|
90
|
+
{
|
|
91
|
+
__typename: 'Blob',
|
|
92
|
+
name: 'README.md',
|
|
93
|
+
rawBlob: 'content123',
|
|
94
|
+
rawTextBlob: 'content123',
|
|
95
|
+
},
|
|
96
|
+
],
|
|
97
|
+
},
|
|
98
|
+
},
|
|
99
|
+
},
|
|
100
|
+
};
|
|
101
|
+
|
|
102
|
+
export const expectedListDirectoryResponse = {
|
|
103
|
+
data: {
|
|
104
|
+
listDirectory: {
|
|
105
|
+
repository: {
|
|
106
|
+
tree: {
|
|
107
|
+
trees: {
|
|
108
|
+
edges: [
|
|
109
|
+
{
|
|
110
|
+
node: {
|
|
111
|
+
name: 'data',
|
|
112
|
+
},
|
|
113
|
+
},
|
|
114
|
+
{
|
|
115
|
+
node: {
|
|
116
|
+
name: 'digital_twins',
|
|
117
|
+
},
|
|
118
|
+
},
|
|
119
|
+
{
|
|
120
|
+
node: {
|
|
121
|
+
name: 'functions',
|
|
122
|
+
},
|
|
123
|
+
},
|
|
124
|
+
{
|
|
125
|
+
node: {
|
|
126
|
+
name: 'models',
|
|
127
|
+
},
|
|
128
|
+
},
|
|
129
|
+
{
|
|
130
|
+
node: {
|
|
131
|
+
name: 'tools',
|
|
132
|
+
},
|
|
133
|
+
},
|
|
134
|
+
],
|
|
135
|
+
},
|
|
136
|
+
},
|
|
137
|
+
},
|
|
138
|
+
},
|
|
139
|
+
},
|
|
140
|
+
};
|
|
141
|
+
|
|
142
|
+
export const expectedFileContentResponse = {
|
|
143
|
+
data: {
|
|
144
|
+
readFile: {
|
|
145
|
+
repository: {
|
|
146
|
+
blobs: {
|
|
147
|
+
nodes: [
|
|
148
|
+
{
|
|
149
|
+
name: 'README.md',
|
|
150
|
+
rawBlob: 'content123',
|
|
151
|
+
rawTextBlob: 'content123',
|
|
152
|
+
},
|
|
153
|
+
],
|
|
154
|
+
},
|
|
155
|
+
},
|
|
156
|
+
},
|
|
157
|
+
},
|
|
158
|
+
};
|
|
159
|
+
|
|
160
|
+
export const e2elistDirectory = `query {
|
|
161
|
+
listDirectory(path:"user2")
|
|
162
|
+
{
|
|
163
|
+
repository{
|
|
164
|
+
tree{
|
|
165
|
+
trees{
|
|
166
|
+
edges{
|
|
167
|
+
node{
|
|
168
|
+
name
|
|
169
|
+
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
}`;
|
|
177
|
+
|
|
178
|
+
export const e2eReadFile = `query {
|
|
179
|
+
readFile(path:"user2/tools/README.md") {
|
|
180
|
+
repository {
|
|
181
|
+
blobs {
|
|
182
|
+
nodes {
|
|
183
|
+
name
|
|
184
|
+
rawBlob
|
|
185
|
+
rawTextBlob
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
}`;
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
// files-service.factory.spec.ts
|
|
2
|
+
import { Test, TestingModule } from '@nestjs/testing';
|
|
3
|
+
import { ConfigService } from '@nestjs/config';
|
|
4
|
+
import FilesServiceFactory from '../../src/files/services/files-service.factory';
|
|
5
|
+
import LocalFilesService from '../../src/files/services/local-files.service';
|
|
6
|
+
import GitlabFilesService from '../../src/files/services/gitlab-files.service';
|
|
7
|
+
import { IFilesService } from '../../src/files/interfaces/files.service.interface';
|
|
8
|
+
|
|
9
|
+
describe('FilesServiceFactory', () => {
|
|
10
|
+
let serviceFactory: FilesServiceFactory;
|
|
11
|
+
let configService: ConfigService;
|
|
12
|
+
let localFilesService: IFilesService;
|
|
13
|
+
let gitlabFilesService: IFilesService;
|
|
14
|
+
|
|
15
|
+
beforeEach(async () => {
|
|
16
|
+
localFilesService = new LocalFilesService(configService as ConfigService);
|
|
17
|
+
gitlabFilesService = new GitlabFilesService(configService as ConfigService);
|
|
18
|
+
|
|
19
|
+
const module: TestingModule = await Test.createTestingModule({
|
|
20
|
+
providers: [
|
|
21
|
+
FilesServiceFactory,
|
|
22
|
+
{ provide: ConfigService, useValue: { get: jest.fn() } },
|
|
23
|
+
{ provide: LocalFilesService, useValue: localFilesService },
|
|
24
|
+
{ provide: GitlabFilesService, useValue: gitlabFilesService },
|
|
25
|
+
],
|
|
26
|
+
}).compile();
|
|
27
|
+
|
|
28
|
+
serviceFactory = module.get<FilesServiceFactory>(FilesServiceFactory);
|
|
29
|
+
configService = module.get<ConfigService>(ConfigService);
|
|
30
|
+
});
|
|
31
|
+
|
|
32
|
+
it('should create a local files service when MODE is local', () => {
|
|
33
|
+
jest.spyOn(configService, 'get').mockReturnValue('local');
|
|
34
|
+
expect(serviceFactory.create()).toBe(localFilesService);
|
|
35
|
+
});
|
|
36
|
+
|
|
37
|
+
it('should create a gitlab files service when MODE is gitlab', () => {
|
|
38
|
+
jest.spyOn(configService, 'get').mockReturnValue('gitlab');
|
|
39
|
+
expect(serviceFactory.create()).toBe(gitlabFilesService);
|
|
40
|
+
});
|
|
41
|
+
|
|
42
|
+
it('should throw an error when MODE is invalid', () => {
|
|
43
|
+
jest.spyOn(configService, 'get').mockReturnValue('invalid');
|
|
44
|
+
expect(() => serviceFactory.create()).toThrowError(`Invalid MODE: invalid`);
|
|
45
|
+
});
|
|
46
|
+
});
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import { Test, TestingModule } from '@nestjs/testing';
|
|
2
|
+
import FilesResolver from '../../src/files/resolvers/files.resolver';
|
|
3
|
+
import {
|
|
4
|
+
testDirectory,
|
|
5
|
+
pathToTestDirectory,
|
|
6
|
+
pathToTestFileContent,
|
|
7
|
+
testFileContent,
|
|
8
|
+
} from '../testUtil';
|
|
9
|
+
import { IFilesService } from '../../src/files/interfaces/files.service.interface';
|
|
10
|
+
import FilesServiceFactory from '../../src/files/services/files-service.factory';
|
|
11
|
+
|
|
12
|
+
describe('Unit tests for FilesResolver', () => {
|
|
13
|
+
let filesResolver: FilesResolver;
|
|
14
|
+
let filesService: IFilesService;
|
|
15
|
+
|
|
16
|
+
beforeEach(async () => {
|
|
17
|
+
const mockFilesService: IFilesService = {
|
|
18
|
+
listDirectory: jest.fn().mockImplementation(() => testDirectory),
|
|
19
|
+
readFile: jest.fn().mockImplementation(() => testFileContent),
|
|
20
|
+
};
|
|
21
|
+
|
|
22
|
+
const module: TestingModule = await Test.createTestingModule({
|
|
23
|
+
providers: [
|
|
24
|
+
FilesResolver,
|
|
25
|
+
FilesServiceFactory,
|
|
26
|
+
{
|
|
27
|
+
provide: FilesServiceFactory,
|
|
28
|
+
useValue: {
|
|
29
|
+
create: () => mockFilesService,
|
|
30
|
+
},
|
|
31
|
+
},
|
|
32
|
+
],
|
|
33
|
+
}).compile();
|
|
34
|
+
|
|
35
|
+
filesResolver = module.get<FilesResolver>(FilesResolver);
|
|
36
|
+
filesService = module
|
|
37
|
+
.get<FilesServiceFactory>(FilesServiceFactory)
|
|
38
|
+
.create();
|
|
39
|
+
});
|
|
40
|
+
|
|
41
|
+
it('should be defined', () => {
|
|
42
|
+
expect(filesResolver).toBeDefined();
|
|
43
|
+
});
|
|
44
|
+
|
|
45
|
+
describe('listDirectory', () => {
|
|
46
|
+
it('should be defined', () => {
|
|
47
|
+
expect(filesResolver.listDirectory).toBeDefined();
|
|
48
|
+
});
|
|
49
|
+
|
|
50
|
+
it('should list files in directory', async () => {
|
|
51
|
+
const result = await filesResolver.listDirectory(pathToTestDirectory);
|
|
52
|
+
expect(result).toEqual(testDirectory);
|
|
53
|
+
expect(filesService.listDirectory).toHaveBeenCalledWith(
|
|
54
|
+
pathToTestDirectory,
|
|
55
|
+
);
|
|
56
|
+
});
|
|
57
|
+
});
|
|
58
|
+
|
|
59
|
+
describe('readFile', () => {
|
|
60
|
+
it('should be defined', () => {
|
|
61
|
+
expect(filesResolver.readFile).toBeDefined();
|
|
62
|
+
});
|
|
63
|
+
|
|
64
|
+
it('should read file', async () => {
|
|
65
|
+
const result = await filesResolver.readFile(pathToTestFileContent);
|
|
66
|
+
expect(result).toEqual(testFileContent);
|
|
67
|
+
expect(filesService.readFile).toHaveBeenCalledWith(pathToTestFileContent);
|
|
68
|
+
});
|
|
69
|
+
});
|
|
70
|
+
});
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { Test, TestingModule } from '@nestjs/testing';
|
|
2
|
+
import { ConfigService } from '@nestjs/config';
|
|
3
|
+
import axios from 'axios';
|
|
4
|
+
import GitlabFilesService from '../../src/files/services/gitlab-files.service';
|
|
5
|
+
import {
|
|
6
|
+
pathToTestFileContent,
|
|
7
|
+
testFileContent,
|
|
8
|
+
MockConfigService,
|
|
9
|
+
testDirectory,
|
|
10
|
+
} from '../testUtil';
|
|
11
|
+
|
|
12
|
+
describe('GitlabFilesService', () => {
|
|
13
|
+
let filesService: GitlabFilesService;
|
|
14
|
+
const mockConfigService = new MockConfigService();
|
|
15
|
+
jest.mock('axios');
|
|
16
|
+
|
|
17
|
+
beforeEach(async () => {
|
|
18
|
+
const module: TestingModule = await Test.createTestingModule({
|
|
19
|
+
providers: [
|
|
20
|
+
GitlabFilesService,
|
|
21
|
+
{ provide: ConfigService, useValue: mockConfigService },
|
|
22
|
+
],
|
|
23
|
+
})
|
|
24
|
+
.overrideProvider(ConfigService)
|
|
25
|
+
.useValue(mockConfigService)
|
|
26
|
+
.compile();
|
|
27
|
+
|
|
28
|
+
filesService = module.get<GitlabFilesService>(GitlabFilesService);
|
|
29
|
+
});
|
|
30
|
+
|
|
31
|
+
it('should list directory', async () => {
|
|
32
|
+
jest.spyOn(axios, 'post').mockResolvedValue({ data: testDirectory });
|
|
33
|
+
|
|
34
|
+
const result = await filesService.listDirectory('user2');
|
|
35
|
+
expect(result).toEqual(testDirectory);
|
|
36
|
+
});
|
|
37
|
+
|
|
38
|
+
it('should read file', async () => {
|
|
39
|
+
jest
|
|
40
|
+
.spyOn(axios, 'post')
|
|
41
|
+
.mockResolvedValue({ data: { data: testFileContent } });
|
|
42
|
+
|
|
43
|
+
const result = await filesService.readFile(pathToTestFileContent);
|
|
44
|
+
expect(result).toEqual(testFileContent);
|
|
45
|
+
});
|
|
46
|
+
});
|