Учёт DEPO: имя базы обязательно, bj базу по серверу не ищет
Имя базы DEPO задаёт клиент — скрипт и подготовка логином администратора работают только с ней. Автопоиск по серверу убран (экран, скрипт, подготовка, проверка подключения, старый экран conn), выбор из нескольких найденных баз — тоже. Вместо поиска — защита от опечатки: скрипт (SQL Server и PostgreSQL), подготовка и проверка подключения сначала убеждаются, что в названной базе есть учётные таблицы OD_FACES и OD_RESTS, иначе останавливаются, ничего не меняя. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_014FsEKyJrYF69Cj9ZXzFLRi
This commit is contained in:
@@ -347,17 +347,18 @@ func TestFromLocalBundle(t *testing.T) {
|
||||
}
|
||||
}
|
||||
|
||||
// Один скрипт подготовки базы DEPO: сам ищет базу, создаёт логин, таблицы, права и (по выбору) задание.
|
||||
// Один скрипт подготовки базы DEPO: в названной базе (сам не ищет, но проверяет, что это DEPO) создаёт логин,
|
||||
// таблицы, права и (по выбору) задание.
|
||||
func TestDepoSetupScript(t *testing.T) {
|
||||
f := FancyMSSQLSettings{}
|
||||
s := depoSetupScript(f, "", "bj_user", "Pass1word", true)
|
||||
for _, want := range []string{"DECLARE @db sysname = N'';", "DECLARE @pass nvarchar(128) = N'Pass1word';", "OD_FACES", "CREATE LOGIN [bj_user] WITH PASSWORD = N''' + REPLACE(@pass, N'''', N'''''')", "FTV_M2M_EVENTS", "db_datareader", "sp_add_job @job_name = N'bj2depo'", "@database_name = @db", "SQLAgentReaderRole"} {
|
||||
s := depoSetupScript(f, "DEPO_DATA", "bj_user", "Pass1word", true)
|
||||
for _, want := range []string{"DECLARE @db sysname = N'DEPO_DATA';", "RAISERROR(N'Базы %s на этом сервере нет.", "OBJECT_ID(QUOTENAME(@db) + N'.dbo.OD_FACES', N'U') IS NULL", "DECLARE @pass nvarchar(128) = N'Pass1word';", "OD_FACES", "CREATE LOGIN [bj_user] WITH PASSWORD = N''' + REPLACE(@pass, N'''', N'''''')", "FTV_M2M_EVENTS", "db_datareader", "sp_add_job @job_name = N'bj2depo'", "@database_name = @db", "SQLAgentReaderRole"} {
|
||||
if !strings.Contains(s, want) {
|
||||
t.Fatalf("в скрипте нет %q", want)
|
||||
}
|
||||
}
|
||||
if strings.Contains(s, "BJ_DEPO_DATA") || strings.Contains(s, "\nGO") {
|
||||
t.Fatal("в скрипте — имя нашей базы или GO (переменные @db между пакетами не живут)")
|
||||
if strings.Contains(s, "BJ_DEPO_DATA") || strings.Contains(s, "\nGO") || strings.Contains(s, "sys.databases") || strings.Contains(s, "%!") {
|
||||
t.Fatal("в скрипте — имя нашей базы, GO (переменные @db между пакетами не живут), поиск базы по серверу или сбой подстановки")
|
||||
}
|
||||
// каждая строка EXEC(@in + N'…') — закрытый литерал: чётное число кавычек
|
||||
for _, line := range strings.Split(s, "\n") {
|
||||
@@ -370,7 +371,7 @@ func TestDepoSetupScript(t *testing.T) {
|
||||
t.Fatal("обработка силами bj: без задания, с правом на процедуру и указанной базой")
|
||||
}
|
||||
pg := depoSetupScript(FancyMSSQLSettings{DBType: "postgres"}, "depo", "bj_user", "p'w", false)
|
||||
if !strings.Contains(pg, `\c "depo"`) || !strings.Contains(pg, "PASSWORD 'p''w'") {
|
||||
if !strings.Contains(pg, `\c "depo"`) || !strings.Contains(pg, "PASSWORD 'p''w'") || !strings.Contains(pg, "RAISE EXCEPTION 'В базе % нет учётных таблиц DEPO") {
|
||||
t.Fatal("PostgreSQL: подключение к базе и экранирование пароля")
|
||||
}
|
||||
if p := depoGenPassword(); len(p) != 24 || !strings.ContainsAny(p, "ABCDEFGHJKLMNPQRSTUVWXYZ") || !strings.ContainsAny(p, "23456789") {
|
||||
@@ -443,7 +444,7 @@ func TestDumpOnboardingPages(t *testing.T) {
|
||||
t.Fatal(err)
|
||||
}
|
||||
_ = os.WriteFile(filepath.Join(dir, "prepare.html"), []byte(b.String()), 0o644)
|
||||
_ = os.WriteFile(filepath.Join(dir, "depo-script.sql"), []byte(depoSetupScript(FancyMSSQLSettings{}, "", "bj_user", "Xk7pQ2mN9vR4tL8wZ3hB6cJd", true)), 0o644)
|
||||
_ = os.WriteFile(filepath.Join(dir, "depo-script.sql"), []byte(depoSetupScript(FancyMSSQLSettings{}, "DEPO_DATA", "bj_user", "Xk7pQ2mN9vR4tL8wZ3hB6cJd", true)), 0o644)
|
||||
}
|
||||
|
||||
// Первая страница (администратор) — для снимка в TestDumpOnboardingPages.
|
||||
@@ -503,9 +504,12 @@ func TestDepoScriptView(t *testing.T) {
|
||||
if f := rc.Snapshot().Fancy; f.Server != "10.0.0.5" || f.Password != "Secret123x" {
|
||||
t.Fatalf("без адреса сервера настройки не должны меняться: %q", f.Server)
|
||||
}
|
||||
// PostgreSQL — свой скрипт; без имени базы — понятная причина вместо скрипта
|
||||
form.Set("db_type", "postgres")
|
||||
// имя базы обязательно (bj по серверу не ищет) — без него вместо скрипта понятная причина
|
||||
form.Set("depo_database", "")
|
||||
if w := post(form); w.Code != http.StatusBadRequest || !strings.Contains(w.Body.String(), "имя базы") {
|
||||
t.Fatalf("SQL Server без базы: %d %s", w.Code, w.Body.String())
|
||||
}
|
||||
form.Set("db_type", "postgres")
|
||||
if w := post(form); w.Code != http.StatusBadRequest || !strings.Contains(w.Body.String(), "имя базы") {
|
||||
t.Fatalf("PostgreSQL без базы: %d %s", w.Code, w.Body.String())
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user