From ff06b28fd937ead48fff99a121bf3c531e63c091 Mon Sep 17 00:00:00 2001 From: electrovir Date: Tue, 10 Sep 2024 13:39:36 +0000 Subject: [PATCH] ignore docker on mac and fix prisma test --- packages/node/configs/c8.config.json | 3 +- .../src/augments/os/operating-system.test.ts | 8 +- .../node/src/augments/os/operating-system.ts | 21 +++ .../docker/containers/container-info.test.ts | 32 ++-- .../containers/container-status.test.ts | 46 ++--- .../containers/copy-to-container.test.ts | 86 +++++---- .../containers/docker-command-inputs.test.ts | 176 +++++++++--------- .../docker/containers/kill-container.test.ts | 38 ++-- .../docker/containers/run-container.test.ts | 90 ++++----- .../containers/try-or-kill-container.test.ts | 54 +++--- packages/node/src/docker/docker-image.test.ts | 28 +-- packages/node/src/docker/docker-image.ts | 2 - .../node/src/docker/docker-startup.test.ts | 14 +- .../node/src/docker/run-docker-test.mock.ts | 19 ++ .../node/src/prisma/prisma-migrations.test.ts | 16 +- packages/node/src/prisma/prisma-migrations.ts | 2 - 16 files changed, 363 insertions(+), 272 deletions(-) create mode 100644 packages/node/src/docker/run-docker-test.mock.ts diff --git a/packages/node/configs/c8.config.json b/packages/node/configs/c8.config.json index 0b49257b..e1b46165 100644 --- a/packages/node/configs/c8.config.json +++ b/packages/node/configs/c8.config.json @@ -5,7 +5,8 @@ "clean": true, "exclude": [ "**/*.test.ts", - "**/*.example.ts" + "**/*.example.ts", + "src/docker" ], "include": [ "src/**/*.ts" diff --git a/packages/node/src/augments/os/operating-system.test.ts b/packages/node/src/augments/os/operating-system.test.ts index 7fef5a0a..154ae566 100644 --- a/packages/node/src/augments/os/operating-system.test.ts +++ b/packages/node/src/augments/os/operating-system.test.ts @@ -1,9 +1,15 @@ import {assert} from '@augment-vir/assert'; import {describe, it} from '@augment-vir/test'; -import {currentOperatingSystem, OperatingSystem} from './operating-system.js'; +import {currentOperatingSystem, isOperatingSystem, OperatingSystem} from './operating-system.js'; describe('currentOperatingSystem', () => { it('has a valid value', () => { assert.isEnumValue(currentOperatingSystem, OperatingSystem); }); }); + +describe(isOperatingSystem.name, () => { + it('returns a boolean', () => { + assert.isBoolean(isOperatingSystem(OperatingSystem.Mac)); + }); +}); diff --git a/packages/node/src/augments/os/operating-system.ts b/packages/node/src/augments/os/operating-system.ts index 006bd0d8..218dd3a0 100644 --- a/packages/node/src/augments/os/operating-system.ts +++ b/packages/node/src/augments/os/operating-system.ts @@ -21,6 +21,27 @@ export enum OperatingSystem { */ export const currentOperatingSystem: OperatingSystem = getOperatingSystem(); +/** + * Checks if the current operating system is the requested one. + * + * @category Node : OS + * @category Package : @augment-vir/node + * @example + * + * ```ts + * import {isOperatingSystem, OperatingSystem} from '@augment-vir/node'; + * + * if (isOperatingSystem(OperatingSystem.Mac)) { + * // do something + * } + * ``` + * + * @package [`@augment-vir/node`](https://www.npmjs.com/package/@augment-vir/node) + */ +export function isOperatingSystem(operatingSystem: OperatingSystem): boolean { + return currentOperatingSystem === operatingSystem; +} + function getOperatingSystem(): OperatingSystem { /** We can't test all of these on a single system. */ /* node:coverage ignore next 7 */ diff --git a/packages/node/src/docker/containers/container-info.test.ts b/packages/node/src/docker/containers/container-info.test.ts index 30e57d42..4e755885 100644 --- a/packages/node/src/docker/containers/container-info.test.ts +++ b/packages/node/src/docker/containers/container-info.test.ts @@ -1,21 +1,25 @@ import {assert} from '@augment-vir/assert'; import {describe, it} from '@augment-vir/test'; import {docker} from '../../augments/docker.js'; +import {dockerTest} from '../run-docker-test.mock.js'; import {runMockLongLivingContainer} from './run-container.mock.js'; const testContainerName = `test-${docker.container.getInfo.name}`; -describe(docker.container.getInfo.name, () => { - it('gets info', async () => { - await docker.container.kill(testContainerName); - await runMockLongLivingContainer(testContainerName); - const info = await docker.container.getInfo(testContainerName); - assert.isObject(info); - await docker.container.kill(testContainerName); - }); - it('returns nothing if container is not running', async () => { - await docker.container.kill(testContainerName); - const info = await docker.container.getInfo(testContainerName); - assert.isUndefined(info); - }); -}); +describe( + docker.container.getInfo.name, + dockerTest(() => { + it('gets info', async () => { + await docker.container.kill(testContainerName); + await runMockLongLivingContainer(testContainerName); + const info = await docker.container.getInfo(testContainerName); + assert.isObject(info); + await docker.container.kill(testContainerName); + }); + it('returns nothing if container is not running', async () => { + await docker.container.kill(testContainerName); + const info = await docker.container.getInfo(testContainerName); + assert.isUndefined(info); + }); + }), +); diff --git a/packages/node/src/docker/containers/container-status.test.ts b/packages/node/src/docker/containers/container-status.test.ts index 1379239b..8026bd30 100644 --- a/packages/node/src/docker/containers/container-status.test.ts +++ b/packages/node/src/docker/containers/container-status.test.ts @@ -1,29 +1,33 @@ import {assert} from '@augment-vir/assert'; import {describe, it} from '@augment-vir/test'; import {docker} from '../../augments/docker.js'; +import {dockerTest} from '../run-docker-test.mock.js'; import {runMockLongLivingContainer} from './run-container.mock.js'; const testContainerName = `test-${docker.container.getLogs.name}`; -describe(docker.container.getLogs.name, () => { - it('gets all logs', async () => { - await docker.container.kill(testContainerName); - await runMockLongLivingContainer(testContainerName); - const logs = await docker.container.getLogs(testContainerName); - assert.strictEquals(logs, ''); - await docker.container.kill(testContainerName); - }); - it('gets the last log', async () => { - await docker.container.kill(testContainerName); - await runMockLongLivingContainer(testContainerName); - const logs = await docker.container.getLogs(testContainerName, 1); - assert.strictEquals(logs, ''); - await docker.container.kill(testContainerName); - }); - it('errors if container does not exist', async () => { - await docker.container.kill(testContainerName); - await assert.throws(docker.container.getLogs(testContainerName, 1), { - matchMessage: 'No such container', +describe( + docker.container.getLogs.name, + dockerTest(() => { + it('gets all logs', async () => { + await docker.container.kill(testContainerName); + await runMockLongLivingContainer(testContainerName); + const logs = await docker.container.getLogs(testContainerName); + assert.strictEquals(logs, ''); + await docker.container.kill(testContainerName); }); - }); -}); + it('gets the last log', async () => { + await docker.container.kill(testContainerName); + await runMockLongLivingContainer(testContainerName); + const logs = await docker.container.getLogs(testContainerName, 1); + assert.strictEquals(logs, ''); + await docker.container.kill(testContainerName); + }); + it('errors if container does not exist', async () => { + await docker.container.kill(testContainerName); + await assert.throws(docker.container.getLogs(testContainerName, 1), { + matchMessage: 'No such container', + }); + }); + }), +); diff --git a/packages/node/src/docker/containers/copy-to-container.test.ts b/packages/node/src/docker/containers/copy-to-container.test.ts index e9a0e345..b00085ec 100644 --- a/packages/node/src/docker/containers/copy-to-container.test.ts +++ b/packages/node/src/docker/containers/copy-to-container.test.ts @@ -3,50 +3,54 @@ import {describe, it} from '@augment-vir/test'; import {readFile} from 'node:fs/promises'; import {docker} from '../../augments/docker.js'; import {recursiveFileReadDir, workspaceQueryPackageJsonPath} from '../../file-paths.mock.js'; +import {dockerTest} from '../run-docker-test.mock.js'; import {runMockLongLivingContainer} from './run-container.mock.js'; const testContainerName = `test-${docker.container.copyTo.name}`; -describe(docker.container.copyTo.name, () => { - it('copies a file', async () => { - const copyToPath = '/tmp/hi.json'; - await docker.container.kill(testContainerName); - await runMockLongLivingContainer(testContainerName); - await docker.container.copyTo({ - containerAbsolutePath: copyToPath, - containerNameOrId: testContainerName, - hostPath: workspaceQueryPackageJsonPath, +describe( + docker.container.copyTo.name, + dockerTest(() => { + it('copies a file', async () => { + const copyToPath = '/tmp/hi.json'; + await docker.container.kill(testContainerName); + await runMockLongLivingContainer(testContainerName); + await docker.container.copyTo({ + containerAbsolutePath: copyToPath, + containerNameOrId: testContainerName, + hostPath: workspaceQueryPackageJsonPath, + }); + const results = await docker.container.runCommand({ + command: `cat ${copyToPath}`, + containerNameOrId: testContainerName, + }); + assert.strictEquals( + results.stdout, + (await readFile(workspaceQueryPackageJsonPath)).toString(), + ); + await docker.container.kill(testContainerName); }); - const results = await docker.container.runCommand({ - command: `cat ${copyToPath}`, - containerNameOrId: testContainerName, + it('copies a dir', async () => { + const copyToPath = '/tmp/whole-dir'; + await docker.container.kill(testContainerName); + await runMockLongLivingContainer(testContainerName); + await docker.container.copyTo({ + containerAbsolutePath: copyToPath, + containerNameOrId: testContainerName, + hostPath: recursiveFileReadDir, + }); + const results = await docker.container.runCommand({ + command: `ls -la ${copyToPath} | awk '{print $9}'`, + containerNameOrId: testContainerName, + }); + assert.deepEquals(results.stdout.trim().split('\n').sort(), [ + '.', + '..', + 'a-file.txt', + 'b-file.txt', + 'inner-dir', + ]); + await docker.container.kill(testContainerName); }); - assert.strictEquals( - results.stdout, - (await readFile(workspaceQueryPackageJsonPath)).toString(), - ); - await docker.container.kill(testContainerName); - }); - it('copies a dir', async () => { - const copyToPath = '/tmp/whole-dir'; - await docker.container.kill(testContainerName); - await runMockLongLivingContainer(testContainerName); - await docker.container.copyTo({ - containerAbsolutePath: copyToPath, - containerNameOrId: testContainerName, - hostPath: recursiveFileReadDir, - }); - const results = await docker.container.runCommand({ - command: `ls -la ${copyToPath} | awk '{print $9}'`, - containerNameOrId: testContainerName, - }); - assert.deepEquals(results.stdout.trim().split('\n').sort(), [ - '.', - '..', - 'a-file.txt', - 'b-file.txt', - 'inner-dir', - ]); - await docker.container.kill(testContainerName); - }); -}); + }), +); diff --git a/packages/node/src/docker/containers/docker-command-inputs.test.ts b/packages/node/src/docker/containers/docker-command-inputs.test.ts index bd82f37e..56be49cf 100644 --- a/packages/node/src/docker/containers/docker-command-inputs.test.ts +++ b/packages/node/src/docker/containers/docker-command-inputs.test.ts @@ -1,4 +1,5 @@ import {describe, itCases} from '@augment-vir/test'; +import {dockerTest} from '../run-docker-test.mock.js'; import { DockerVolumeMappingType, makeEnvFlags, @@ -6,90 +7,99 @@ import { makeVolumeFlags, } from './docker-command-inputs.js'; -describe(makeVolumeFlags.name, () => { - itCases(makeVolumeFlags, [ - { - it: 'handles an empty array', - input: [], - expect: '', - }, - { - it: 'handles undefined', - input: undefined, - expect: '', - }, - { - it: 'maps', - input: [ - { - containerAbsolutePath: '/tmp/hi', - hostAbsolutePath: '/users/home/hi', - }, - { - containerAbsolutePath: '/tmp/bye', - hostAbsolutePath: '/users/home/bye', - type: DockerVolumeMappingType.Cached, - }, - ], - expect: "-v '/users/home/hi':'/tmp/hi' -v '/users/home/bye':'/tmp/bye':cached", - }, - ]); -}); +describe( + makeVolumeFlags.name, + dockerTest(() => { + itCases(makeVolumeFlags, [ + { + it: 'handles an empty array', + input: [], + expect: '', + }, + { + it: 'handles undefined', + input: undefined, + expect: '', + }, + { + it: 'maps', + input: [ + { + containerAbsolutePath: '/tmp/hi', + hostAbsolutePath: '/users/home/hi', + }, + { + containerAbsolutePath: '/tmp/bye', + hostAbsolutePath: '/users/home/bye', + type: DockerVolumeMappingType.Cached, + }, + ], + expect: "-v '/users/home/hi':'/tmp/hi' -v '/users/home/bye':'/tmp/bye':cached", + }, + ]); + }), +); -describe(makePortMapFlags.name, () => { - itCases(makePortMapFlags, [ - { - it: 'handles an empty array', - input: [], - expect: '', - }, - { - it: 'handles undefined', - input: undefined, - expect: '', - }, - { - it: 'handles undefined', - input: [ - { - hostPort: 1234, - containerPort: 9876, - }, - { - hostPort: 42, - containerPort: 98, - }, - ], - expect: '-p 1234:9876 -p 42:98', - }, - ]); -}); +describe( + makePortMapFlags.name, + dockerTest(() => { + itCases(makePortMapFlags, [ + { + it: 'handles an empty array', + input: [], + expect: '', + }, + { + it: 'handles undefined', + input: undefined, + expect: '', + }, + { + it: 'handles undefined', + input: [ + { + hostPort: 1234, + containerPort: 9876, + }, + { + hostPort: 42, + containerPort: 98, + }, + ], + expect: '-p 1234:9876 -p 42:98', + }, + ]); + }), +); -describe(makeEnvFlags.name, () => { - itCases(makeEnvFlags, [ - { - it: 'handles an empty map', - input: {}, - expect: '', - }, - { - it: 'handles undefined', - input: undefined, - expect: '', - }, - { - it: 'maps', - input: { - CONTAINER_ONE: { - allowInterpolation: false, - value: 'value 1', - }, - CONTAINER_TWO: { - allowInterpolation: true, - value: 'VALUE_2', +describe( + makeEnvFlags.name, + dockerTest(() => { + itCases(makeEnvFlags, [ + { + it: 'handles an empty map', + input: {}, + expect: '', + }, + { + it: 'handles undefined', + input: undefined, + expect: '', + }, + { + it: 'maps', + input: { + CONTAINER_ONE: { + allowInterpolation: false, + value: 'value 1', + }, + CONTAINER_TWO: { + allowInterpolation: true, + value: 'VALUE_2', + }, }, + expect: '-e CONTAINER_ONE=\'value 1\' -e CONTAINER_TWO="VALUE_2"', }, - expect: '-e CONTAINER_ONE=\'value 1\' -e CONTAINER_TWO="VALUE_2"', - }, - ]); -}); + ]); + }), +); diff --git a/packages/node/src/docker/containers/kill-container.test.ts b/packages/node/src/docker/containers/kill-container.test.ts index f7e629f2..bdf28717 100644 --- a/packages/node/src/docker/containers/kill-container.test.ts +++ b/packages/node/src/docker/containers/kill-container.test.ts @@ -1,25 +1,29 @@ import {assert} from '@augment-vir/assert'; import {describe, it} from '@augment-vir/test'; import {docker} from '../../augments/docker.js'; +import {dockerTest} from '../run-docker-test.mock.js'; import {DockerContainerStatus} from './container-status.js'; import {runMockLongLivingContainer} from './run-container.mock.js'; const testContainerName = `test-${docker.container.kill.name}`; -describe(docker.container.kill.name, () => { - it('kills a container', async () => { - await docker.container.kill(testContainerName); - await runMockLongLivingContainer(testContainerName); - await docker.container.kill(testContainerName); - }); - it('kills a container without removing it', async () => { - await docker.container.kill(testContainerName); - await runMockLongLivingContainer(testContainerName); - await docker.container.kill(testContainerName, {keepContainer: true}); - assert.strictEquals( - await docker.container.getStatus(testContainerName), - DockerContainerStatus.Exited, - ); - await docker.container.kill(testContainerName); - }); -}); +describe( + docker.container.kill.name, + dockerTest(() => { + it('kills a container', async () => { + await docker.container.kill(testContainerName); + await runMockLongLivingContainer(testContainerName); + await docker.container.kill(testContainerName); + }); + it('kills a container without removing it', async () => { + await docker.container.kill(testContainerName); + await runMockLongLivingContainer(testContainerName); + await docker.container.kill(testContainerName, {keepContainer: true}); + assert.strictEquals( + await docker.container.getStatus(testContainerName), + DockerContainerStatus.Exited, + ); + await docker.container.kill(testContainerName); + }); + }), +); diff --git a/packages/node/src/docker/containers/run-container.test.ts b/packages/node/src/docker/containers/run-container.test.ts index f232935f..9711e09c 100644 --- a/packages/node/src/docker/containers/run-container.test.ts +++ b/packages/node/src/docker/containers/run-container.test.ts @@ -1,59 +1,63 @@ import {assert} from '@augment-vir/assert'; import {describe, it} from '@augment-vir/test'; import {docker} from '../../augments/docker.js'; +import {dockerTest} from '../run-docker-test.mock.js'; import {runMockLongLivingContainer} from './run-container.mock.js'; const testContainerName = `test-${docker.container.run.name}`; const testImageName = 'alpine:3.20.2'; -describe(docker.container.run.name, () => { - it('starts a detached container', async () => { - await docker.container.waitUntilRemoved(testContainerName); +describe( + docker.container.run.name, + dockerTest(() => { + it('starts a detached container', async () => { + await docker.container.waitUntilRemoved(testContainerName); - await runMockLongLivingContainer(testContainerName); - await docker.container.waitUntilRunning(testContainerName); - await docker.container.kill(testContainerName); - await docker.container.waitUntilExited(testContainerName); - }); - it('starts a non-detached container', async () => { - await docker.container.waitUntilRemoved(testContainerName); - - await docker.container.run({ - containerName: testContainerName, - detach: false, - imageName: testImageName, - removeWhenDone: true, + await runMockLongLivingContainer(testContainerName); + await docker.container.waitUntilRunning(testContainerName); + await docker.container.kill(testContainerName); + await docker.container.waitUntilExited(testContainerName); }); - await docker.container.waitUntilExited(testContainerName); - }); - it('removes a container after running a command', async () => { - await docker.container.waitUntilRemoved(testContainerName); + it('starts a non-detached container', async () => { + await docker.container.waitUntilRemoved(testContainerName); - await docker.container.run({ - containerName: testContainerName, - detach: true, - imageName: testImageName, - removeWhenDone: true, + await docker.container.run({ + containerName: testContainerName, + detach: false, + imageName: testImageName, + removeWhenDone: true, + }); + await docker.container.waitUntilExited(testContainerName); }); - await docker.container.waitUntilExited(testContainerName); - }); - it('errors out with a custom command', async () => { - await docker.container.waitUntilRemoved(testContainerName); + it('removes a container after running a command', async () => { + await docker.container.waitUntilRemoved(testContainerName); - await assert.throws( - docker.container.run({ + await docker.container.run({ containerName: testContainerName, - detach: false, + detach: true, imageName: testImageName, - useCurrentUser: true, removeWhenDone: true, - command: 'random-command-this-does-not-exist-please-electrovir', - }), - { - matchMessage: - 'exec: "random-command-this-does-not-exist-please-electrovir": executable file not found', - }, - ); - await docker.container.waitUntilExited(testContainerName); - }); -}); + }); + await docker.container.waitUntilExited(testContainerName); + }); + it('errors out with a custom command', async () => { + await docker.container.waitUntilRemoved(testContainerName); + + await assert.throws( + docker.container.run({ + containerName: testContainerName, + detach: false, + imageName: testImageName, + useCurrentUser: true, + removeWhenDone: true, + command: 'random-command-this-does-not-exist-please-electrovir', + }), + { + matchMessage: + 'exec: "random-command-this-does-not-exist-please-electrovir": executable file not found', + }, + ); + await docker.container.waitUntilExited(testContainerName); + }); + }), +); diff --git a/packages/node/src/docker/containers/try-or-kill-container.test.ts b/packages/node/src/docker/containers/try-or-kill-container.test.ts index a8e36413..9257c127 100644 --- a/packages/node/src/docker/containers/try-or-kill-container.test.ts +++ b/packages/node/src/docker/containers/try-or-kill-container.test.ts @@ -1,36 +1,40 @@ import {assert} from '@augment-vir/assert'; import {describe, it} from '@augment-vir/test'; import {docker} from '../../augments/docker.js'; +import {dockerTest} from '../run-docker-test.mock.js'; import {runMockLongLivingContainer} from './run-container.mock.js'; const testContainerName = `test-${docker.container.tryOrKill.name}`; -describe(docker.container.tryOrKill.name, () => { - it('runs without failure', async () => { - await docker.container.kill(testContainerName); - await runMockLongLivingContainer(testContainerName); - const result = await docker.container.tryOrKill(testContainerName, (containerName) => { - assert.strictEquals(containerName, testContainerName); - return 'hi'; - }); +describe( + docker.container.tryOrKill.name, + dockerTest(() => { + it('runs without failure', async () => { + await docker.container.kill(testContainerName); + await runMockLongLivingContainer(testContainerName); + const result = await docker.container.tryOrKill(testContainerName, (containerName) => { + assert.strictEquals(containerName, testContainerName); + return 'hi'; + }); - await docker.container.waitUntilRunning(testContainerName); - await docker.container.kill(testContainerName); - await docker.container.waitUntilExited(testContainerName); + await docker.container.waitUntilRunning(testContainerName); + await docker.container.kill(testContainerName); + await docker.container.waitUntilExited(testContainerName); - assert.tsType(result).equals(); - assert.strictEquals(result, 'hi'); - }); + assert.tsType(result).equals(); + assert.strictEquals(result, 'hi'); + }); - it('runs with failure', async () => { - await docker.container.kill(testContainerName); - await runMockLongLivingContainer(testContainerName); - await assert.throws( - docker.container.tryOrKill(testContainerName, () => { - throw new Error('fake error'); - }), - ); + it('runs with failure', async () => { + await docker.container.kill(testContainerName); + await runMockLongLivingContainer(testContainerName); + await assert.throws( + docker.container.tryOrKill(testContainerName, () => { + throw new Error('fake error'); + }), + ); - await docker.container.waitUntilRemoved(testContainerName); - }); -}); + await docker.container.waitUntilRemoved(testContainerName); + }); + }), +); diff --git a/packages/node/src/docker/docker-image.test.ts b/packages/node/src/docker/docker-image.test.ts index cbabd928..d4ff3456 100644 --- a/packages/node/src/docker/docker-image.test.ts +++ b/packages/node/src/docker/docker-image.test.ts @@ -2,6 +2,7 @@ import {assert} from '@augment-vir/assert'; import {describe, it} from '@augment-vir/test'; import {docker} from '../augments/docker.js'; import {runMockLongLivingContainer} from './containers/run-container.mock.js'; +import {dockerTest} from './run-docker-test.mock.js'; /** * Using Alpine Linux because it's so small. @@ -13,15 +14,18 @@ import {runMockLongLivingContainer} from './containers/run-container.mock.js'; */ export const testDockerImageName = 'alpine:3.19.3'; -describe('docker.image', () => { - it('updates and removes', async () => { - await docker.image.remove(testDockerImageName); - assert.isFalse(await docker.image.exists(testDockerImageName)); - await docker.image.update(testDockerImageName); - assert.isTrue(await docker.image.exists(testDockerImageName)); - await docker.image.update(testDockerImageName); - }); - it('ignores removing already missing images', async () => { - await docker.image.remove('electrovir-fake-image-name:123.456.0789'); - }); -}); +describe( + 'docker.image', + dockerTest(() => { + it('updates and removes', async () => { + await docker.image.remove(testDockerImageName); + assert.isFalse(await docker.image.exists(testDockerImageName)); + await docker.image.update(testDockerImageName); + assert.isTrue(await docker.image.exists(testDockerImageName)); + await docker.image.update(testDockerImageName); + }); + it('ignores removing already missing images', async () => { + await docker.image.remove('electrovir-fake-image-name:123.456.0789'); + }); + }), +); diff --git a/packages/node/src/docker/docker-image.ts b/packages/node/src/docker/docker-image.ts index 4697d30d..02ff0fc4 100644 --- a/packages/node/src/docker/docker-image.ts +++ b/packages/node/src/docker/docker-image.ts @@ -1,4 +1,3 @@ -import {log} from '@augment-vir/common'; import {ensureError} from '@augment-vir/core'; import {runShellCommand} from '../augments/terminal/shell.js'; @@ -33,7 +32,6 @@ export async function removeImageFromLocalRegistry( const shellOutput = await runShellCommand(`docker image rm '${imageName}'`, { rejectOnError: true, }); - log.debug(shellOutput); } catch (caught) { const error = ensureError(caught); diff --git a/packages/node/src/docker/docker-startup.test.ts b/packages/node/src/docker/docker-startup.test.ts index 3ae55564..da00d9e9 100644 --- a/packages/node/src/docker/docker-startup.test.ts +++ b/packages/node/src/docker/docker-startup.test.ts @@ -1,8 +1,12 @@ import {describe, it} from '@augment-vir/test'; import {docker} from '../augments/docker.js'; +import {dockerTest} from './run-docker-test.mock.js'; -describe('docker.start', () => { - it('runs', async () => { - await docker.start(); - }); -}); +describe( + 'docker.start', + dockerTest(() => { + it('runs', async () => { + await docker.start(); + }); + }), +); diff --git a/packages/node/src/docker/run-docker-test.mock.ts b/packages/node/src/docker/run-docker-test.mock.ts new file mode 100644 index 00000000..6d2dad77 --- /dev/null +++ b/packages/node/src/docker/run-docker-test.mock.ts @@ -0,0 +1,19 @@ +import type {MaybePromise} from '@augment-vir/common'; +import {isOperatingSystem, OperatingSystem} from '../augments/os/operating-system.js'; + +export function dockerTest(callback: () => MaybePromise) { + if (isOperatingSystem(OperatingSystem.Mac) && process.env.CI) { + /** + * We cannot test Docker on macOS GitHub Actions runners. + * + * @see + * - https://github.com/actions/runner-images/issues/8104 + * - https://github.com/douglascamata/setup-docker-macos-action?tab=readme-ov-file#arm64-processors-m1-m2-m3-series-used-on-macos-14-images-are-unsupported + * - https://github.com/actions/runner-images/issues/2150 + * - https://github.com/actions/runner/issues/1456 + */ + return () => {}; + } + + return callback; +} diff --git a/packages/node/src/prisma/prisma-migrations.test.ts b/packages/node/src/prisma/prisma-migrations.test.ts index 171122c8..ef0fa848 100644 --- a/packages/node/src/prisma/prisma-migrations.test.ts +++ b/packages/node/src/prisma/prisma-migrations.test.ts @@ -145,11 +145,17 @@ describe(prisma.migration.applyDev.name, () => { await clearTestDatabaseOutputs(); await prisma.database.resetDev(testPrismaSchemaPath); - await prisma.migration.create({migrationName: 'init'}, testPrismaSchemaPath); - assert.deepEquals(await prisma.migration.status(testPrismaSchemaPath), { - totalMigrations: 1, - unappliedMigrations: [], - }); + await prisma.migration.create( + { + migrationName: 'init', + createOnly: true, + }, + testPrismaSchemaPath, + ); + const status = await prisma.migration.status(testPrismaSchemaPath); + + assert.strictEquals(status.totalMigrations, 1); + assert.isLengthExactly(status.unappliedMigrations, 1); await assert.throws(prisma.migration.applyDev(testPrismaSchema2Path), { matchMessage: 'A new Prisma migration is needed for', diff --git a/packages/node/src/prisma/prisma-migrations.ts b/packages/node/src/prisma/prisma-migrations.ts index 211b8c7f..5a1b0ecd 100644 --- a/packages/node/src/prisma/prisma-migrations.ts +++ b/packages/node/src/prisma/prisma-migrations.ts @@ -50,7 +50,6 @@ export async function applyPrismaMigrationsToDev( ...env, }, stdoutCallback(stdout, childProcess) { - log.debug({stdout}); if (stdout.includes('Enter a name for the new migration')) { if (childProcess.pid) { terminate(childProcess.pid); @@ -59,7 +58,6 @@ export async function applyPrismaMigrationsToDev( } }, stderrCallback(stderr, childProcess) { - log.debug({stderr}); if ( stderr.includes( 'Prisma Migrate has detected that the environment is non-interactive, which is not supported',