fix(saved-sql): 修复 SQL 库连接关联丢失与历史文件不可见

* fix: 持久化并显示 SQL 库连接关联

* fix: 补充 SQL 库关联状态翻译

* chore: 修复数据标签页策略格式

---------

Co-authored-by: zipg <4047349+zipg@users.noreply.github.com>
This commit is contained in:
zipgandzipg authored and GitHub committed 2026-08-05 23:58:32 +08:00
1 parent 580b70e1d4
commit 445b6473f4
18 files changed
+336 -115

No files matched your search

+129
View File
@@ -136,6 +136,135 @@ test("saved SQL summaries load file content on demand", async () => {
assert.equal(apiMock.loadSavedSqlFile.mock.calls.length, 1);
});
test("changing a saved SQL execution target persists the latest target", async () => {
const file: SavedSqlFile = {
id: "sql-target",
connectionId: "conn-1",
name: "query.sql",
database: "db-1",
schema: "public",
sql: "SELECT 1;",
sqlLoaded: true,
createdAt: "2026-06-27T00:00:00.000Z",
updatedAt: "2026-06-27T00:00:00.000Z",
};
apiMock.loadSavedSqlLibrary.mockResolvedValue({ folders: [], files: [file] });
const store = useSavedSqlStore();
await store.initFromStorage();
await store.updateFileExecutionTarget("sql-target", {
connectionId: "conn-2",
database: "db-2",
schema: "app",
});
const saved = apiMock.saveSavedSqlFile.mock.calls.at(-1)?.[0];
assert.equal(saved?.connectionId, "conn-2");
assert.equal(saved?.database, "db-2");
assert.equal(saved?.schema, "app");
assert.equal(saved?.sql, file.sql);
assert.equal(saved?.name, file.name);
assert.deepEqual(
{
connectionId: store.getFile("sql-target")?.connectionId,
database: store.getFile("sql-target")?.database,
schema: store.getFile("sql-target")?.schema,
},
{ connectionId: "conn-2", database: "db-2", schema: "app" },
);
});
test("rapid saved SQL target changes persist only the latest target", async () => {
const file: SavedSqlFile = {
id: "sql-target",
connectionId: "conn-1",
name: "query.sql",
database: "db-1",
sql: "SELECT 1;",
sqlLoaded: true,
createdAt: "2026-06-27T00:00:00.000Z",
updatedAt: "2026-06-27T00:00:00.000Z",
};
apiMock.loadSavedSqlLibrary.mockResolvedValue({ folders: [], files: [file] });
apiMock.saveSavedSqlFile.mockImplementation(async (value) => value);
const store = useSavedSqlStore();
await store.initFromStorage();
const first = store.updateFileExecutionTarget("sql-target", { connectionId: "conn-2", database: "db-2" });
const second = store.updateFileExecutionTarget("sql-target", { connectionId: "conn-3", database: "db-3" });
await Promise.all([first, second]);
assert.equal(apiMock.saveSavedSqlFile.mock.calls.length, 1);
assert.equal(apiMock.saveSavedSqlFile.mock.calls.at(-1)?.[0].connectionId, "conn-3");
assert.equal(apiMock.saveSavedSqlFile.mock.calls.at(-1)?.[0].database, "db-3");
assert.equal(store.getFile("sql-target")?.connectionId, "conn-3");
});
test("saved SQL target changes roll back when persistence fails", async () => {
const file: SavedSqlFile = {
id: "sql-target",
connectionId: "conn-1",
name: "query.sql",
database: "db-1",
schema: "public",
sql: "SELECT 1;",
sqlLoaded: true,
createdAt: "2026-06-27T00:00:00.000Z",
updatedAt: "2026-06-27T00:00:00.000Z",
};
apiMock.loadSavedSqlLibrary.mockResolvedValue({ folders: [], files: [file] });
apiMock.saveSavedSqlFile.mockRejectedValueOnce(new Error("disk full"));
const store = useSavedSqlStore();
await store.initFromStorage();
await assert.rejects(store.updateFileExecutionTarget("sql-target", { connectionId: "conn-2", database: "db-2", schema: "app" }), /disk full/);
assert.deepEqual(
{
connectionId: store.getFile("sql-target")?.connectionId,
database: store.getFile("sql-target")?.database,
schema: store.getFile("sql-target")?.schema,
},
{ connectionId: "conn-1", database: "db-1", schema: "public" },
);
});
test("empty and deleted-connection SQL files remain in the library", async () => {
const files: SavedSqlFile[] = [
{
id: "unassociated",
connectionId: "",
name: "unassociated.sql",
database: "",
sql: "SELECT 1;",
sqlLoaded: true,
createdAt: "2026-06-27T00:00:00.000Z",
updatedAt: "2026-06-27T00:00:00.000Z",
},
{
id: "deleted",
connectionId: "deleted-connection",
name: "deleted.sql",
database: "",
sql: "SELECT 2;",
sqlLoaded: true,
createdAt: "2026-06-27T00:00:00.000Z",
updatedAt: "2026-06-27T00:00:00.000Z",
},
];
apiMock.loadSavedSqlLibrary.mockResolvedValue({ folders: [], files });
const store = useSavedSqlStore();
await store.initFromStorage();
assert.deepEqual(
store.allFiles.map((item) => item.id),
["deleted", "unassociated"],
);
});
test("saving an existing SQL file without folderId keeps its folder", async () => {
const file: SavedSqlFile = {
id: "sql-1",