test / unit + widget + golden + a11y (push) Failing after 30s
test / bundle smoke (xvfb 5s) (push) Has been skipped
test / daemon subprocess + web WASM smoke (push) Has been skipped
test / integration_test (xvfb) (push) Has been skipped
test / dart doc (lib API) (push) Failing after 1m1s
Reverts the D-66 amendment + the floor drop to 94 from 78b38e3 — both
were unilateral and outside my call to make. The T-115 widget-test
gap is real (T-122 still tracks it), but the right response is to
land coverage elsewhere rather than lower the gate.
Adds:
- intents_test.dart — parseIntentId for every builtin id + the
`command:<id>` prefix path.
- session_naming_test.dart — HOME-collapse, "/" → "root", oversize
paths hashing to 8 hex chars, hash stability.
- project_test.dart — onProjectOpen await branch in `open()`.
- settings_test.dart — nested-list emit + empty-map emit (the two
un-fired branches in the YAML serializer).
Co-Authored-By: Claude <noreply@anthropic.com>
314 lines
12 KiB
Dart
314 lines
12 KiB
Dart
/// Unit tests for `ProjectManager` and `RecentProject` in
|
|
/// `lib/kernel/src/project.dart`. Uses an injected `onValidateProject`
|
|
/// hook so the manager doesn't shell out to git in tests.
|
|
library;
|
|
|
|
import 'dart:convert';
|
|
import 'dart:io';
|
|
|
|
import 'package:clide/kernel/kernel.dart';
|
|
import 'package:test/test.dart';
|
|
|
|
Future<ProjectManager> _build({
|
|
Future<String?> Function(String path)? onValidateProject,
|
|
Future<void> Function(String path)? onProjectOpen,
|
|
Map<String, Object?> initialSettings = const {},
|
|
}) async {
|
|
final tmp = await Directory.systemTemp.createTemp('clide-project-test-');
|
|
final settings = SettingsStore(appDir: tmp);
|
|
await settings.load();
|
|
for (final entry in initialSettings.entries) {
|
|
await settings.set<Object>(entry.key, entry.value!);
|
|
}
|
|
final toolchain = Toolchain();
|
|
toolchain.applyResolved(const ResolvedPaths(git: '/usr/bin/git'));
|
|
final pm = ProjectManager(
|
|
log: Logger(minLevel: LogLevel.error),
|
|
events: DaemonBus(),
|
|
settings: settings,
|
|
toolchain: toolchain,
|
|
onValidateProject: onValidateProject,
|
|
onProjectOpen: onProjectOpen,
|
|
);
|
|
addTearDown(() async {
|
|
if (tmp.existsSync()) tmp.deleteSync(recursive: true);
|
|
});
|
|
return pm;
|
|
}
|
|
|
|
void main() {
|
|
group('RecentProject', () {
|
|
test(r'relativePath collapses $HOME prefix to ~', () {
|
|
final home = Platform.environment['HOME'] ?? '';
|
|
if (home.isEmpty) return;
|
|
final p = RecentProject(path: '$home/projects/clide', name: 'clide', lastOpened: DateTime.now());
|
|
expect(p.relativePath, startsWith('~/'));
|
|
});
|
|
|
|
test(r'relativePath returns the absolute path when not under $HOME', () {
|
|
final p = RecentProject(path: '/elsewhere/repo', name: 'repo', lastOpened: DateTime.now());
|
|
// If $HOME is /elsewhere... we'd collapse. Otherwise absolute is preserved.
|
|
if (!'/elsewhere/repo'.startsWith(Platform.environment['HOME'] ?? ' |