fix(mysql): improve create database permission hint
This commit is contained in:
10 files changed
+63
-5
No files matched your search
@@ -0,0 +1,31 @@
|
||||
import { describe, expect, it } from "vitest";
|
||||
import { appendCreateDatabaseErrorHint } from "@/lib/database/createDatabaseErrorHints";
|
||||
|
||||
const hint = "Use an account with GRANT OPTION to grant CREATE permission.";
|
||||
const t = (key: string) => (key === "contextMenu.mysqlCreateDatabasePermissionHint" ? hint : key);
|
||||
|
||||
describe("appendCreateDatabaseErrorHint", () => {
|
||||
it("adds guidance for MySQL error 1044", () => {
|
||||
const message = appendCreateDatabaseErrorHint("mysql", "ERROR 1044 (42000): Access denied for user 'root'@'%' to database 'pro'", t);
|
||||
|
||||
expect(message).toContain("ERROR 1044");
|
||||
expect(message).toContain(hint);
|
||||
});
|
||||
|
||||
it("recognizes access-denied messages when the driver omits the error code", () => {
|
||||
const message = appendCreateDatabaseErrorHint("mysql", "Access denied for user 'app'@'%' to database 'pro'", t);
|
||||
|
||||
expect(message).toContain(hint);
|
||||
});
|
||||
|
||||
it("does not alter unrelated or non-MySQL errors", () => {
|
||||
expect(appendCreateDatabaseErrorHint("mysql", "ERROR 1007: Can't create database; database exists", t)).toBe("ERROR 1007: Can't create database; database exists");
|
||||
expect(appendCreateDatabaseErrorHint("postgres", "ERROR 1044: permission denied", t)).toBe("ERROR 1044: permission denied");
|
||||
});
|
||||
|
||||
it("does not append the same hint twice", () => {
|
||||
const original = `ERROR 1044: Access denied\n\n${hint}`;
|
||||
|
||||
expect(appendCreateDatabaseErrorHint("mysql", original, t)).toBe(original);
|
||||
});
|
||||
});
|
||||
@@ -0,0 +1,13 @@
|
||||
import type { DatabaseType } from "@/types/database";
|
||||
|
||||
type Translate = (key: string) => string;
|
||||
|
||||
function isMysqlCreateDatabaseAccessDenied(message: string): boolean {
|
||||
return /\b1044\b/i.test(message) || /access denied for user[\s\S]*to database/i.test(message);
|
||||
}
|
||||
|
||||
export function appendCreateDatabaseErrorHint(databaseType: DatabaseType | undefined, message: string, t: Translate): string {
|
||||
if (databaseType !== "mysql" || !isMysqlCreateDatabaseAccessDenied(message)) return message;
|
||||
const hint = t("contextMenu.mysqlCreateDatabasePermissionHint");
|
||||
return message.includes(hint) ? message : `${message}\n\n${hint}`;
|
||||
}
|
||||
Reference in new issue
Block a user