Skip to content

Commit

Permalink
test: add tests
Browse files Browse the repository at this point in the history
  • Loading branch information
viceice committed Aug 21, 2023
1 parent b6db7bd commit dd5a904
Show file tree
Hide file tree
Showing 10 changed files with 194 additions and 14 deletions.
1 change: 1 addition & 0 deletions .gitignore
Expand Up @@ -3,6 +3,7 @@ node_modules/
/bin
/dist
/coverage
/html/

# generated files
/src/usr/local/containerbase/version
Expand Down
1 change: 1 addition & 0 deletions package.json
Expand Up @@ -59,6 +59,7 @@
"@typescript-eslint/eslint-plugin": "6.4.0",
"@typescript-eslint/parser": "6.4.0",
"@vitest/coverage-v8": "0.34.1",
"@vitest/ui": "0.34.2",
"@yarnpkg/sdks": "3.0.0-rc.48",
"bats": "1.10.0",
"bats-assert": "2.0.0",
Expand Down
35 changes: 35 additions & 0 deletions src/cli/services/compression.service.spec.ts
@@ -0,0 +1,35 @@
import type { Container } from 'inversify';
import { beforeEach, describe, expect, test, vi } from 'vitest';
import { CompressionService, rootContainer } from '.';

vi.mock('execa');
vi.mock('node:fs');
vi.mock('node:stream/promises');

describe('compression.service', () => {
let child!: Container;

beforeEach(() => {
child = rootContainer.createChild();
});

test('extracts with bstar', async () => {
const svc = child.get(CompressionService);

await expect(
svc.extract({ file: 'some.txz', cwd: globalThis.cacheDir }),
).resolves.toBeUndefined();

await expect(
svc.extract({ file: 'some.txz', cwd: globalThis.cacheDir, strip: 1 }),
).resolves.toBeUndefined();
});

test('extracts with node-tar', async () => {
const svc = child.get(CompressionService);

await expect(
svc.extract({ file: 'some.tgz', cwd: globalThis.cacheDir }),
).resolves.toBeUndefined();
});
});
6 changes: 3 additions & 3 deletions src/cli/services/env.service.spec.ts
Expand Up @@ -3,7 +3,7 @@ import { env } from 'node:process';
import type { Container } from 'inversify';
import { beforeEach, describe, expect, test, vi } from 'vitest';
import { EnvService, rootContainer } from '.';
import { rootFile } from '~test/path';
import { rootPath } from '~test/path';

const mocks = vi.hoisted(() => ({ arch: vi.fn() }));

Expand Down Expand Up @@ -45,7 +45,7 @@ describe('env.service', () => {
});

test('userHome', () => {
expect(child.get(EnvService).userHome).toBe(rootFile('home/ubuntu'));
expect(child.get(EnvService).userHome).toBe(rootPath('home/ubuntu'));
});

test('userId', () => {
Expand All @@ -71,7 +71,7 @@ describe('env.service', () => {
describe('rootDir', () => {
test('uses test root', () => {
const e = child.get(EnvService);
expect(e.rootDir).toBe(rootFile());
expect(e.rootDir).toBe(rootPath());
});

test('uses default root', () => {
Expand Down
24 changes: 20 additions & 4 deletions src/cli/services/http.service.spec.ts
Expand Up @@ -4,7 +4,7 @@ import { beforeEach, describe, expect, test } from 'vitest';
import { logger } from '../utils';
import { HttpService, rootContainer } from '.';
import { scope } from '~test/http-mock';
import { cacheFile } from '~test/path';
import { cachePath } from '~test/path';

const baseUrl = 'https://example.com';
describe('http.service', () => {
Expand Down Expand Up @@ -53,7 +53,7 @@ describe('http.service', () => {
scope(baseUrl).get('/test.txt').reply(200, 'ok');

const http = child.get(HttpService);
const expected = cacheFile(
const expected = cachePath(
`d1dc63218c42abba594fff6450457dc8c4bfdd7c22acf835a50ca0e5d2693020/test.txt`,
);

Expand All @@ -68,7 +68,7 @@ describe('http.service', () => {
const http = child.get(HttpService);
const expectedChecksum =
'd1dc63218c42abba594fff6450457dc8c4bfdd7c22acf835a50ca0e5d2693020';
const expected = cacheFile(
const expected = cachePath(
`d1dc63218c42abba594fff6450457dc8c4bfdd7c22acf835a50ca0e5d2693020/test.txt`,
);

Expand All @@ -89,6 +89,22 @@ describe('http.service', () => {
).toBe(expected);
});

test('exists', async () => {
scope(baseUrl)
.head('/test.txt')
.reply(200)
.head('/test.txt')
.reply(404)
.head('/test.txt')
.times(3)
.reply(500);

const http = child.get(HttpService);
expect(await http.exists(`${baseUrl}/test.txt`)).toBe(true);
expect(await http.exists(`${baseUrl}/test.txt`)).toBe(false);
await expect(http.exists(`${baseUrl}/test.txt`)).rejects.toThrow();
});

test('replaces url', async () => {
scope('https://example.org').get('/replace.txt').reply(200, 'ok');

Expand All @@ -105,7 +121,7 @@ describe('http.service', () => {
env.URL_REPLACE_1_FROM = 'https://example.test';

const http = child.get(HttpService);
const expected = cacheFile(
const expected = cachePath(
`f4eba41457a330d0fa5289e49836326c6a0208bbc639862e70bb378c88c62642/replace.txt`,
);

Expand Down
35 changes: 32 additions & 3 deletions src/cli/services/path.service.spec.ts
Expand Up @@ -5,7 +5,7 @@ import type { Container } from 'inversify';
import { beforeEach, describe, expect, test } from 'vitest';
import { fileRights } from '../utils';
import { PathService, rootContainer } from '.';
import { rootFile } from '~test/path';
import { rootPath } from '~test/path';

describe('path.service', () => {
const path = env.PATH;
Expand All @@ -16,15 +16,23 @@ describe('path.service', () => {
env.PATH = path;
});

test('envFile', () => {
expect(child.get(PathService).envFile).toBe(rootPath('usr/local/etc/env'));
});

test('tmpDir', () => {
expect(child.get(PathService).tmpDir).toBe(rootPath('tmp'));
});

test('toolsPath', () => {
expect(child.get(PathService).toolsPath).toBe(
rootFile('opt/containerbase/tools'),
rootPath('opt/containerbase/tools'),
);
});

test('versionPath', () => {
expect(child.get(PathService).versionPath).toBe(
rootFile('opt/containerbase/versions'),
rootPath('opt/containerbase/versions'),
);
});

Expand All @@ -47,6 +55,27 @@ describe('path.service', () => {
);
});

test('versionedToolPath', () => {
expect(child.get(PathService).versionedToolPath('node', '18.0.1')).toBe(
rootPath('opt/containerbase/tools/node/18.0.1'),
);
});

test('creates and finds tool paths', async () => {
await mkdir(rootPath('opt/containerbase/tools'), { recursive: true });
const svc = child.get(PathService);
expect(await svc.findToolPath('node')).toBeNull();
await svc.createToolPath('node');
expect(await svc.findToolPath('node')).toBe(
rootPath('opt/containerbase/tools/node'),
);
expect(await svc.findVersionedToolPath('node', '18.0.1')).toBeNull();
await svc.createVersionedToolPath('node', '18.0.1');
expect(await svc.findVersionedToolPath('node', '18.0.1')).toBe(
rootPath('opt/containerbase/tools/node/18.0.1'),
);
});

describe('exportToolEnv', () => {
test('node', async () => {
const pathSvc = child.get(PathService);
Expand Down
28 changes: 28 additions & 0 deletions src/cli/services/version.service.spec.ts
@@ -0,0 +1,28 @@
import { mkdir } from 'fs/promises';
import type { Container } from 'inversify';
import { beforeEach, describe, expect, test } from 'vitest';
import { VersionService, rootContainer } from '.';
import { rootPath } from '~test/path';

describe('version.service', () => {
let child!: Container;

beforeEach(() => {
child = rootContainer.createChild();
});

test('works', async () => {
const svc = child.get(VersionService);

// doesn't fail
await svc.update('node', '14.17.0');

await mkdir(rootPath('opt/containerbase/versions'), { recursive: true });

expect(await svc.find('node')).toBeNull();
await svc.update('node', '14.17.0');
expect(await svc.find('node')).toBe('14.17.0');
await svc.update('node', '');
expect(await svc.find('node')).toBeNull();
});
});
4 changes: 2 additions & 2 deletions test/path.ts
@@ -1,10 +1,10 @@
import { sep } from 'node:path';

export function cacheFile(path: string): string {
export function cachePath(path: string): string {
return `${globalThis.cacheDir}/${path}`.replace(/\/+/g, sep);
}

export function rootFile(path?: string): string {
export function rootPath(path?: string): string {
if (!path) {
return globalThis.rootDir.replace(/\/+/g, sep);
}
Expand Down
4 changes: 3 additions & 1 deletion vite.config.ts
Expand Up @@ -12,7 +12,9 @@ export default defineConfig({
reporter: ci ? ['lcovonly', 'text'] : ['html', 'text'],
include: ['src/cli/**/*.ts'],
},
reporters: ci ? ['default', new GithubActionsReporter()] : ['default'],
reporters: ci
? ['default', new GithubActionsReporter()]
: ['default', 'html'],
restoreMocks: true,
setupFiles: './test/global-setup.ts',
deps: { moduleDirectories: ['node_modules', '.yarn/'] },
Expand Down
70 changes: 69 additions & 1 deletion yarn.lock
Expand Up @@ -841,6 +841,13 @@ __metadata:
languageName: node
linkType: hard

"@polka/url@npm:^1.0.0-next.20":
version: 1.0.0-next.21
resolution: "@polka/url@npm:1.0.0-next.21"
checksum: c7654046d38984257dd639eab3dc770d1b0340916097b2fac03ce5d23506ada684e05574a69b255c32ea6a144a957c8cd84264159b545fca031c772289d88788
languageName: node
linkType: hard

"@semantic-release/commit-analyzer@npm:^10.0.0":
version: 10.0.1
resolution: "@semantic-release/commit-analyzer@npm:10.0.1"
Expand Down Expand Up @@ -1497,6 +1504,23 @@ __metadata:
languageName: node
linkType: hard

"@vitest/ui@npm:0.34.2":
version: 0.34.2
resolution: "@vitest/ui@npm:0.34.2"
dependencies:
"@vitest/utils": 0.34.2
fast-glob: ^3.3.0
fflate: ^0.8.0
flatted: ^3.2.7
pathe: ^1.1.1
picocolors: ^1.0.0
sirv: ^2.0.3
peerDependencies:
vitest: ">=0.30.1 <1"
checksum: 27772824dc78d6b6c4580c4f5a5a7eebcb1f0c2a3744de80381f8b766ed485cc88ae0978a8f28a46b02e35b80ea26a1ad7facf0054ab00c39670dff2e2bb4524
languageName: node
linkType: hard

"@vitest/utils@npm:0.34.1":
version: 0.34.1
resolution: "@vitest/utils@npm:0.34.1"
Expand All @@ -1508,6 +1532,17 @@ __metadata:
languageName: node
linkType: hard

"@vitest/utils@npm:0.34.2":
version: 0.34.2
resolution: "@vitest/utils@npm:0.34.2"
dependencies:
diff-sequences: ^29.4.3
loupe: ^2.3.6
pretty-format: ^29.5.0
checksum: 55081528a475413759bf752ec084ccfc013e1f549c4f9523535034c86aab6d2f8711ac44d462817d01d3ccb1608f9150809a94896a681be8602d78554b162037
languageName: node
linkType: hard

"@yarnpkg/core@npm:^4.0.0-rc.48":
version: 4.0.0-rc.49
resolution: "@yarnpkg/core@npm:4.0.0-rc.49"
Expand Down Expand Up @@ -2603,6 +2638,7 @@ __metadata:
"@typescript-eslint/eslint-plugin": 6.4.0
"@typescript-eslint/parser": 6.4.0
"@vitest/coverage-v8": 0.34.1
"@vitest/ui": 0.34.2
"@yarnpkg/sdks": 3.0.0-rc.48
bats: 1.10.0
bats-assert: 2.0.0
Expand Down Expand Up @@ -3730,6 +3766,13 @@ __metadata:
languageName: node
linkType: hard

"fflate@npm:^0.8.0":
version: 0.8.0
resolution: "fflate@npm:0.8.0"
checksum: 6215f95ee01d620a41e459247a7de7e7117dd23e78ef017c26b64c26f2a880a90eedc77675918bbf816d18cc990f6505cd71be933c67cc48cc1e7ebbff1589ea
languageName: node
linkType: hard

"figures@npm:^2.0.0":
version: 2.0.0
resolution: "figures@npm:2.0.0"
Expand Down Expand Up @@ -3825,7 +3868,7 @@ __metadata:
languageName: node
linkType: hard

"flatted@npm:^3.1.0":
"flatted@npm:^3.1.0, flatted@npm:^3.2.7":
version: 3.2.7
resolution: "flatted@npm:3.2.7"
checksum: 427633049d55bdb80201c68f7eb1cbd533e03eac541f97d3aecab8c5526f12a20ccecaeede08b57503e772c769e7f8680b37e8d482d1e5f8d7e2194687f9ea35
Expand Down Expand Up @@ -5997,6 +6040,13 @@ __metadata:
languageName: node
linkType: hard

"mrmime@npm:^1.0.0":
version: 1.0.1
resolution: "mrmime@npm:1.0.1"
checksum: cc979da44bbbffebaa8eaf7a45117e851f2d4cb46a3ada6ceb78130466a04c15a0de9a9ce1c8b8ba6f6e1b8618866b1352992bf1757d241c0ddca558b9f28a77
languageName: node
linkType: hard

"ms@npm:2.1.2":
version: 2.1.2
resolution: "ms@npm:2.1.2"
Expand Down Expand Up @@ -7971,6 +8021,17 @@ __metadata:
languageName: node
linkType: hard

"sirv@npm:^2.0.3":
version: 2.0.3
resolution: "sirv@npm:2.0.3"
dependencies:
"@polka/url": ^1.0.0-next.20
mrmime: ^1.0.0
totalist: ^3.0.0
checksum: e2dfd4c97735a6ad6d842d0eec2cd9e3919ff0e46f0d228248c5753ad4b70b832711e77e1259c031c439cdb08303cc54d923685c92b0e890145cc733af7c5568
languageName: node
linkType: hard

"slash@npm:^3.0.0":
version: 3.0.0
resolution: "slash@npm:3.0.0"
Expand Down Expand Up @@ -8558,6 +8619,13 @@ __metadata:
languageName: node
linkType: hard

"totalist@npm:^3.0.0":
version: 3.0.1
resolution: "totalist@npm:3.0.1"
checksum: 5132d562cf88ff93fd710770a92f31dbe67cc19b5c6ccae2efc0da327f0954d211bbfd9456389655d726c624f284b4a23112f56d1da931ca7cfabbe1f45e778a
languageName: node
linkType: hard

"tr46@npm:~0.0.3":
version: 0.0.3
resolution: "tr46@npm:0.0.3"
Expand Down

0 comments on commit dd5a904

Please sign in to comment.