feat: refine subject visits and project workflows
Add early termination visit workflow with ordering, non-applicable visit handling, visit window display, and medication adherence support. Extend monitoring visit issue template fields, site scoping, setup draft project info handling, login security UI, attachment behavior, and related tests/migrations.
This commit is contained in:
@@ -0,0 +1,48 @@
|
||||
import { describe, expect, it } from "vitest";
|
||||
import { readFileSync } from "node:fs";
|
||||
import { resolve } from "node:path";
|
||||
|
||||
const readLoginView = () => readFileSync(resolve(__dirname, "./Login.vue"), "utf8");
|
||||
|
||||
describe("Login protocol agreement", () => {
|
||||
it("requires protocol agreement before calling login", () => {
|
||||
const source = readLoginView();
|
||||
const protocolGuardIndex = source.indexOf("!form.agreeProtocol");
|
||||
const loginCallIndex = source.indexOf("auth.login(form.email, form.password)");
|
||||
|
||||
expect(source).toContain('v-model="form.agreeProtocol"');
|
||||
expect(source).toContain("我已阅读并同意");
|
||||
expect(source).toContain("请先阅读并同意用户协议");
|
||||
expect(protocolGuardIndex).toBeGreaterThan(-1);
|
||||
expect(loginCallIndex).toBeGreaterThan(-1);
|
||||
expect(protocolGuardIndex).toBeLessThan(loginCallIndex);
|
||||
});
|
||||
|
||||
it("offers remember password through browser credentials without local password storage", () => {
|
||||
const source = readLoginView();
|
||||
|
||||
expect(source).toContain('v-model="form.rememberPassword"');
|
||||
expect(source).toContain("记住密码");
|
||||
expect(source).toContain('autocomplete="username"');
|
||||
expect(source).toContain('name="username"');
|
||||
expect(source).toContain('name="password"');
|
||||
expect(source).toContain("tryLoadBrowserCredential");
|
||||
expect(source).toContain("tryStoreBrowserCredential");
|
||||
expect(source).toContain("navigator.credentials");
|
||||
expect(source).toContain("password: true");
|
||||
expect(source).not.toContain('localStorage.setItem("ctms_saved_password"');
|
||||
expect(source).not.toContain("localStorage.setItem('ctms_saved_password'");
|
||||
});
|
||||
|
||||
it("opens a CTMS-specific protocol dialog from the protocol text", () => {
|
||||
const source = readLoginView();
|
||||
|
||||
expect(source).toContain('v-model="protocolDialogVisible"');
|
||||
expect(source).toContain('@click.stop.prevent="openProtocolDialog"');
|
||||
expect(source).toContain("protocolSections");
|
||||
expect(source).toContain("临床试验数据与合规");
|
||||
expect(source).toContain("项目、中心、受试者、访视、AE/SAE、PD");
|
||||
expect(source).toContain("权限与审计");
|
||||
expect(source).toContain("confirmProtocol");
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user