test(app/e2e): cover project-settings error-UX paths (Cluster G3) (#731)
* test(app/e2e): cover 5 error-UX paths + host indicator + script removal for project settings Add helpers/project-settings.ts DSL helpers and extend projects-settings.spec.ts with 5 new tests covering the error paths dropped by PR #725: - stale_project_config callout + disabled save + reload recovery - invalid_project_config read callout + reload after fix - write_failed callout + retry + reload recovery - single-host static indicator vs picker chip - script removal via kebab menu + confirm dialog * refactor(app/e2e): unslop project-settings helpers and spec - Fix removeProjectScript: derive trigger testID from row testID instead of using scoped locator (which was timing out) - Extract inline writeFile call in invalid-config test to restorePaseoConfig helper - Replace raw testID click in write_failed test with clickReloadProjectSettings - Remove writeFile from spec imports; drop defensive ?? "" fallback * test(app/e2e): add read-transport and offline no-target tests for project settings - Add read-transport failure test: WS-level drop during readProjectConfig triggers read-transport-callout; Reload retries until WS reconnects and refetch succeeds. - Add no-target test: WS drop after form load triggers NoEditableTarget via live connectionStatus check (useHostRuntimeSnapshot) on the selected host. - Hoist openProjects/editWorktreeSetup from spec body into project-settings helper. - Fix expectNoProjectSettingsError to accept optional timeout (needed for toPass loop). - Add isHostGone to renderContent: after readQuery errors are checked, offline/error connectionStatus renders NoEditableTarget without unmounting ProjectSettingsBody. * fixup(app/e2e): correct misleading comments on WS close → error-state mapping
This commit is contained in:
@@ -71,6 +71,12 @@ export default function ProjectSettingsScreen({ projectKey }: ProjectSettingsScr
|
||||
}
|
||||
}, [editableHosts, selectedServerId]);
|
||||
|
||||
const selectedSnapshot = useHostRuntimeSnapshot(selectedServerId);
|
||||
const isHostGone =
|
||||
Boolean(selectedServerId) &&
|
||||
(selectedSnapshot?.connectionStatus === "offline" ||
|
||||
selectedSnapshot?.connectionStatus === "error");
|
||||
|
||||
const selectedHost = editableHosts.find((host) => host.serverId === selectedServerId);
|
||||
const client = useHostRuntimeClient(selectedHost?.serverId ?? "");
|
||||
|
||||
@@ -85,6 +91,7 @@ export default function ProjectSettingsScreen({ projectKey }: ProjectSettingsScr
|
||||
selectedHost={selectedHost}
|
||||
onSelectHost={setSelectedServerId}
|
||||
client={client}
|
||||
isHostGone={isHostGone}
|
||||
/>
|
||||
);
|
||||
}
|
||||
@@ -139,6 +146,7 @@ interface ProjectSettingsBodyProps {
|
||||
selectedHost: ProjectHostEntry;
|
||||
onSelectHost: (serverId: string) => void;
|
||||
client: DaemonClient;
|
||||
isHostGone: boolean;
|
||||
}
|
||||
|
||||
function ProjectSettingsBody({
|
||||
@@ -147,6 +155,7 @@ function ProjectSettingsBody({
|
||||
selectedHost,
|
||||
onSelectHost,
|
||||
client,
|
||||
isHostGone,
|
||||
}: ProjectSettingsBodyProps) {
|
||||
const queryKey = useMemo(
|
||||
() => ["project-config", selectedHost.serverId, selectedHost.repoRoot] as const,
|
||||
@@ -192,6 +201,7 @@ function ProjectSettingsBody({
|
||||
client,
|
||||
onReload: handleReload,
|
||||
hasMultipleHosts,
|
||||
isHostGone,
|
||||
})}
|
||||
</View>
|
||||
);
|
||||
@@ -207,6 +217,7 @@ interface RenderContentInput {
|
||||
client: DaemonClient;
|
||||
onReload: () => void;
|
||||
hasMultipleHosts: boolean;
|
||||
isHostGone: boolean;
|
||||
}
|
||||
|
||||
function renderContent({
|
||||
@@ -219,6 +230,7 @@ function renderContent({
|
||||
client,
|
||||
onReload,
|
||||
hasMultipleHosts,
|
||||
isHostGone,
|
||||
}: RenderContentInput) {
|
||||
if (readQuery.isLoading) {
|
||||
return (
|
||||
@@ -250,6 +262,10 @@ function renderContent({
|
||||
);
|
||||
}
|
||||
|
||||
if (isHostGone) {
|
||||
return <NoEditableTarget />;
|
||||
}
|
||||
|
||||
if (!loadedConfig) {
|
||||
return (
|
||||
<View style={styles.centered}>
|
||||
|
||||
Reference in New Issue
Block a user