Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 4 additions & 4 deletions clis/linux-do/topic-content.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -51,9 +51,9 @@ describe('linux-do topic-content', () => {
expect(command?.columns).toEqual(['content']);
});
it('keeps topic adapter as a summarized first-page reader after the split', () => {
const topicTs = fs.readFileSync(new URL('./topic.ts', import.meta.url), 'utf8');
expect(topicTs).not.toContain('main_only');
expect(topicTs).toContain('slice(0, 200)');
expect(topicTs).toContain('帖子首页摘要和回复');
const topicSource = fs.readFileSync(new URL('./topic.js', import.meta.url), 'utf8');
expect(topicSource).not.toContain('main_only');
expect(topicSource).toContain('slice(0, 200)');
expect(topicSource).toContain('帖子首页摘要和回复');
});
});
5 changes: 5 additions & 0 deletions scripts/check-doc-coverage.sh
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,11 @@ for adapter_dir in "$SRC_DIR"/*/; do
adapter_name="$(basename "$adapter_dir")"
# Skip internal directories (e.g., _shared)
[[ "$adapter_name" == _* ]] && continue
# Skip helper-only directories that do not expose any top-level adapter commands.
top_level_files="$(find "$adapter_dir" -maxdepth 1 -type f | awk -F/ '{print $NF}')"
if [[ -n "$top_level_files" ]] && ! printf '%s\n' "$top_level_files" | grep -qv '^_'; then
continue
fi
total=$((total + 1))

# Check if doc exists in browser/ or desktop/ subdirectories
Expand Down
51 changes: 51 additions & 0 deletions src/ci-regressions.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
import { execFileSync } from 'node:child_process';
import * as fs from 'node:fs';
import * as os from 'node:os';
import * as path from 'node:path';
import { afterEach, describe, expect, it } from 'vitest';

const tempDirs: string[] = [];

afterEach(() => {
for (const dir of tempDirs.splice(0)) {
fs.rmSync(dir, { recursive: true, force: true });
}
});

describe('CI regression coverage', () => {
it('ignores helper-only adapter directories when checking docs coverage', () => {
const fixtureRoot = fs.mkdtempSync(path.join(os.tmpdir(), 'opencli-doc-coverage-'));
tempDirs.push(fixtureRoot);

const scriptsDir = path.join(fixtureRoot, 'scripts');
const clisDir = path.join(fixtureRoot, 'clis', 'slock');
const docsBrowserDir = path.join(fixtureRoot, 'docs', 'adapters', 'browser');
const docsDesktopDir = path.join(fixtureRoot, 'docs', 'adapters', 'desktop');

fs.mkdirSync(scriptsDir, { recursive: true });
fs.mkdirSync(clisDir, { recursive: true });
fs.mkdirSync(docsBrowserDir, { recursive: true });
fs.mkdirSync(docsDesktopDir, { recursive: true });

fs.copyFileSync(
path.join(process.cwd(), 'scripts', 'check-doc-coverage.sh'),
path.join(scriptsDir, 'check-doc-coverage.sh'),
);
fs.writeFileSync(
path.join(clisDir, '_utils.js'),
'export const helper = () => "noop";\n',
);

const output = execFileSync(
'bash',
[path.join(scriptsDir, 'check-doc-coverage.sh'), '--strict'],
{
cwd: fixtureRoot,
encoding: 'utf8',
},
);

expect(output).toContain('Doc Coverage: 0/0 adapters documented');
expect(output).toContain('All adapters have documentation');
});
});
4 changes: 2 additions & 2 deletions vitest.config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ export default defineConfig({
test: {
name: 'unit',
include: ['src/**/*.test.ts'],
exclude: ['clis/**/*.test.ts'],
exclude: ['src/clis/**/*.test.ts'],
sequence: { groupOrder: 0 },
},
},
Expand All @@ -23,7 +23,7 @@ export default defineConfig({
{
test: {
name: 'adapter',
include: ['clis/**/*.test.ts'],
include: ['clis/**/*.test.js', 'src/clis/**/*.test.ts'],
sequence: { groupOrder: 1 },
},
},
Expand Down