diff --git a/scripts/test-coverage.ts b/scripts/test-coverage.ts new file mode 100644 index 0000000..4be9ce1 --- /dev/null +++ b/scripts/test-coverage.ts @@ -0,0 +1,11 @@ +import { wrapCliTask } from 'obsidian-dev-utils/script-utils/cli-utils'; +import { testCoverage } from 'obsidian-dev-utils/script-utils/test-runners/vitest'; + +const FULL_COVERAGE_PERCENT = 100; + +await wrapCliTask(() => + testCoverage({ + minCoverageInPercents: FULL_COVERAGE_PERCENT, + projects: ['unit-tests'] + }) +); diff --git a/scripts/test-integration-android.ts b/scripts/test-integration-android.ts new file mode 100644 index 0000000..730d79b --- /dev/null +++ b/scripts/test-integration-android.ts @@ -0,0 +1,8 @@ +import { wrapCliTask } from 'obsidian-dev-utils/script-utils/cli-utils'; +import { test } from 'obsidian-dev-utils/script-utils/test-runners/vitest'; + +await wrapCliTask(() => + test({ + projects: ['integration-tests:android'] + }) +); diff --git a/scripts/test-integration-desktop.ts b/scripts/test-integration-desktop.ts new file mode 100644 index 0000000..3615463 --- /dev/null +++ b/scripts/test-integration-desktop.ts @@ -0,0 +1,8 @@ +import { wrapCliTask } from 'obsidian-dev-utils/script-utils/cli-utils'; +import { test } from 'obsidian-dev-utils/script-utils/test-runners/vitest'; + +await wrapCliTask(() => + test({ + projects: ['integration-tests:desktop'] + }) +); diff --git a/scripts/test-integration-no-app.ts b/scripts/test-integration-no-app.ts new file mode 100644 index 0000000..4b4e7e4 --- /dev/null +++ b/scripts/test-integration-no-app.ts @@ -0,0 +1,8 @@ +import { wrapCliTask } from 'obsidian-dev-utils/script-utils/cli-utils'; +import { test } from 'obsidian-dev-utils/script-utils/test-runners/vitest'; + +await wrapCliTask(() => + test({ + projects: ['integration-tests:no-app'] + }) +); diff --git a/scripts/test-integration.ts b/scripts/test-integration.ts new file mode 100644 index 0000000..473fdd2 --- /dev/null +++ b/scripts/test-integration.ts @@ -0,0 +1,14 @@ +import { wrapCliTask } from 'obsidian-dev-utils/script-utils/cli-utils'; +import { test } from 'obsidian-dev-utils/script-utils/test-runners/vitest'; + +await wrapCliTask(async () => { + await test({ + projects: ['integration-tests:no-app'] + }); + await test({ + projects: ['integration-tests:android'] + }); + await test({ + projects: ['integration-tests:desktop'] + }); +}); diff --git a/scripts/test-watch.ts b/scripts/test-watch.ts new file mode 100644 index 0000000..157a275 --- /dev/null +++ b/scripts/test-watch.ts @@ -0,0 +1,8 @@ +import { wrapCliTask } from 'obsidian-dev-utils/script-utils/cli-utils'; +import { testWatch } from 'obsidian-dev-utils/script-utils/test-runners/vitest'; + +await wrapCliTask(() => + testWatch({ + projects: ['unit-tests'] + }) +); diff --git a/scripts/test.ts b/scripts/test.ts new file mode 100644 index 0000000..0faf152 --- /dev/null +++ b/scripts/test.ts @@ -0,0 +1,8 @@ +import { wrapCliTask } from 'obsidian-dev-utils/script-utils/cli-utils'; +import { test } from 'obsidian-dev-utils/script-utils/test-runners/vitest'; + +await wrapCliTask(() => + test({ + projects: ['unit-tests'] + }) +); diff --git a/scripts/vitest-config.ts b/scripts/vitest-config.ts new file mode 100644 index 0000000..7370d80 --- /dev/null +++ b/scripts/vitest-config.ts @@ -0,0 +1,83 @@ +import { defineConfig } from 'vitest/config'; + +const SHARED_EXCLUDE = ['node_modules', 'dist']; +const BIG_TIMEOUT_IN_MILLISECONDS = 30_000; +const ANDROID_TIMEOUT_IN_MILLISECONDS = 60_000; +const HOOK_TIMEOUT_MULTIPLIER = 4; + +export const config = defineConfig({ + test: { + coverage: { + exclude: [ + 'src/**/*.test.ts' + ], + include: ['src/**/*.ts'], + provider: 'v8', + reporter: ['text', 'lcov', 'html'], + reportsDirectory: './coverage' + }, + exclude: ['node_modules', 'dist'], + globals: false, + include: ['src/**/*.test.ts'], + passWithNoTests: true, + projects: [ + { + resolve: { + alias: { + obsidian: 'obsidian-test-mocks/obsidian' + } + }, + ssr: { + noExternal: ['obsidian-dev-utils', 'obsidian-typings'] + }, + test: { + environment: 'jsdom', + exclude: [...SHARED_EXCLUDE, 'src/**/*.integration.test.ts'], + execArgv: ['--no-webstorage'], + include: ['src/**/*.test.ts'], + name: 'unit-tests', + setupFiles: ['obsidian-test-mocks/vitest-setup'] + } + }, + { + test: { + environment: 'node', + fileParallelism: false, + hookTimeout: BIG_TIMEOUT_IN_MILLISECONDS * HOOK_TIMEOUT_MULTIPLIER, + include: ['src/**/*.no-app.integration.test.ts'], + name: 'integration-tests:no-app', + testTimeout: BIG_TIMEOUT_IN_MILLISECONDS + } + }, + { + test: { + environment: 'node', + fileParallelism: false, + globalSetup: ['obsidian-integration-testing/vitest-global-setup'], + hookTimeout: BIG_TIMEOUT_IN_MILLISECONDS * HOOK_TIMEOUT_MULTIPLIER, + include: ['src/**/*.desktop.integration.test.ts'], + name: 'integration-tests:desktop', + testTimeout: BIG_TIMEOUT_IN_MILLISECONDS + } + }, + { + test: { + environment: 'node', + environmentOptions: { + obsidianTransport: { + appiumUrl: 'http://localhost:4723', + avdName: 'obsidian_test', + type: 'obsidian-android-appium' + } + }, + fileParallelism: false, + globalSetup: ['obsidian-integration-testing/vitest-global-setup'], + hookTimeout: ANDROID_TIMEOUT_IN_MILLISECONDS * HOOK_TIMEOUT_MULTIPLIER, + include: ['src/**/*.android.integration.test.ts'], + name: 'integration-tests:android', + testTimeout: ANDROID_TIMEOUT_IN_MILLISECONDS + } + } + ] + } +}); diff --git a/src/plugin.android.integration.test.ts b/src/plugin.android.integration.test.ts new file mode 100644 index 0000000..3edca19 --- /dev/null +++ b/src/plugin.android.integration.test.ts @@ -0,0 +1,13 @@ +import { getTempVault } from 'obsidian-integration-testing/vitest-global-setup'; +import { + describe, + expect, + it +} from 'vitest'; + +describe('Smoke test', () => { + it('should load plugin on Android', () => { + const vault = getTempVault(); + expect(vault.path).toBeTruthy(); + }); +}); diff --git a/src/plugin.desktop.integration.test.ts b/src/plugin.desktop.integration.test.ts new file mode 100644 index 0000000..db2691f --- /dev/null +++ b/src/plugin.desktop.integration.test.ts @@ -0,0 +1,13 @@ +import { getTempVault } from 'obsidian-integration-testing/vitest-global-setup'; +import { + describe, + expect, + it +} from 'vitest'; + +describe('Smoke test', () => { + it('should load plugin on Desktop', () => { + const vault = getTempVault(); + expect(vault.path).toBeTruthy(); + }); +}); diff --git a/tsconfig.json b/tsconfig.json index 0a086f7..e422da6 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -32,6 +32,7 @@ "./commitlint.config.ts", "./eslint.config.mts", "./src/**/*.ts", - "./scripts/**/*.ts" + "./scripts/**/*.ts", + "./vitest.config.ts" ] } diff --git a/vitest.config.ts b/vitest.config.ts new file mode 100644 index 0000000..1fa39d7 --- /dev/null +++ b/vitest.config.ts @@ -0,0 +1,3 @@ +import { config } from './scripts/vitest-config.ts'; + +export default config;