хранилище переехало с PocketBase на SQLite со своим каталогом файлов
- база своя: два пула, захват одним UPDATE ... RETURNING, шаги схемы на goose под файловым замком, одна миграция начальной схемы вместо семи прежних - транспорт переписан на net/http: свои слои, свой ограничитель частоты, отдача файла с проверкой владельца; панель /_/ и пространство /api/ исчезли - по находкам ревью: журнал не пишет путь под корнем приложения, ключ бюджета читается справа налево, узнавание известного идёт читающим пулом
This commit is contained in:
@@ -9,12 +9,9 @@ import (
|
||||
"strings"
|
||||
"testing"
|
||||
|
||||
"github.com/pocketbase/pocketbase/core"
|
||||
"github.com/stretchr/testify/assert"
|
||||
"github.com/stretchr/testify/require"
|
||||
|
||||
pbrepo "git.vakhrushev.me/av/transcriber/internal/adapter/repo/pocketbase"
|
||||
"git.vakhrushev.me/av/transcriber/internal/adapter/repo/pocketbase/migrations"
|
||||
"git.vakhrushev.me/av/transcriber/internal/entity"
|
||||
)
|
||||
|
||||
@@ -168,7 +165,7 @@ func TestList_MalformedCursorIsRejected(t *testing.T) {
|
||||
},
|
||||
{
|
||||
name: "декодируется, но идентификатора нет",
|
||||
cursor: base64.RawURLEncoding.EncodeToString([]byte("2026-08-15 10:00:00.000Z|")),
|
||||
cursor: base64.RawURLEncoding.EncodeToString([]byte("2026-08-15T10:00:00Z|")),
|
||||
},
|
||||
{
|
||||
name: "пара пуста целиком",
|
||||
@@ -202,25 +199,11 @@ func TestTopicsResolveToNames(t *testing.T) {
|
||||
|
||||
// Тема заводится напрямую: словарь тем свой у каждого человека, и пишет его
|
||||
// задача языковой модели, которой ещё нет.
|
||||
topics, err := env.app.FindCollectionByNameOrId(migrations.TopicsCollection)
|
||||
require.NoError(t, err)
|
||||
topic := core.NewRecord(topics)
|
||||
topic.Set("owner", env.account.Id)
|
||||
topic.Set("name", "семейный архив")
|
||||
require.NoError(t, env.app.Save(topic))
|
||||
topicID := newTopic(t, env, env.account.ID, "семейный архив")
|
||||
attachTopic(t, env, all.Items[0].ID, topicID)
|
||||
|
||||
repo := pbrepo.NewAudioRecordRepository(env.app)
|
||||
record, err := repo.GetByID(all.Items[0].ID, env.account.Id)
|
||||
record, err := env.handler.recordRepo.GetByID(all.Items[0].ID, env.account.ID)
|
||||
require.NoError(t, err)
|
||||
record.TopicIDs = []string{topic.Id}
|
||||
require.NoError(t, repo.Save(record, ""))
|
||||
|
||||
// Правку тем конвейер не делает, поэтому кладём их тем же путём, каким это
|
||||
// сделает задача языковой модели, — прямым сохранением записи коллекции.
|
||||
raw, err := env.app.FindRecordById(migrations.RecordsCollection, record.Id)
|
||||
require.NoError(t, err)
|
||||
raw.Set("topics", []string{topic.Id})
|
||||
require.NoError(t, env.app.Save(raw))
|
||||
|
||||
page := pageOf(t, env, "")
|
||||
require.Len(t, page.Items, 1)
|
||||
@@ -247,14 +230,14 @@ func TestList_ThreeStatesEachRecordOnce(t *testing.T) {
|
||||
all := pageOf(t, env, "")
|
||||
require.Len(t, all.Items, 3)
|
||||
|
||||
repo := pbrepo.NewAudioRecordRepository(env.app)
|
||||
repo := env.handler.recordRepo
|
||||
|
||||
halted, err := repo.GetByID(all.Items[0].ID, env.account.Id)
|
||||
halted, err := repo.GetByID(all.Items[0].ID, env.account.ID)
|
||||
require.NoError(t, err)
|
||||
halted.Halt(entity.HaltReasonStuck, "застряла")
|
||||
require.NoError(t, repo.Save(halted, ""))
|
||||
|
||||
done, err := repo.GetByID(all.Items[1].ID, env.account.Id)
|
||||
done, err := repo.GetByID(all.Items[1].ID, env.account.ID)
|
||||
require.NoError(t, err)
|
||||
done.MoveToState(entity.StateDone)
|
||||
require.NoError(t, repo.Save(done, ""))
|
||||
@@ -295,11 +278,11 @@ func TestList_ShowsOnlyOwnRecords(t *testing.T) {
|
||||
|
||||
acceptRecords(t, env, 2)
|
||||
|
||||
_, stranger := newSecondAccount(t, env.app)
|
||||
newSecondAccount(t, env)
|
||||
|
||||
w := httptest.NewRecorder()
|
||||
req := httptest.NewRequest("GET", "/app/audiorecords", http.NoBody)
|
||||
asUser(req, stranger)
|
||||
asUser(req, "stranger")
|
||||
env.mux.ServeHTTP(w, req)
|
||||
require.Equal(t, http.StatusOK, w.Code)
|
||||
|
||||
@@ -319,12 +302,12 @@ func TestList_DoesNotReadTranscript(t *testing.T) {
|
||||
all := pageOf(t, env, "")
|
||||
require.Len(t, all.Items, 1)
|
||||
|
||||
repo := pbrepo.NewAudioRecordRepository(env.app)
|
||||
record, err := repo.GetByID(all.Items[0].ID, env.account.Id)
|
||||
repo := env.handler.recordRepo
|
||||
record, err := repo.GetByID(all.Items[0].ID, env.account.ID)
|
||||
require.NoError(t, err)
|
||||
|
||||
const marker = "СОДЕРЖИМОЕ-РАСШИФРОВКИ-МАРКЕР"
|
||||
texts := pbrepo.NewTextRepository(env.app)
|
||||
texts := env.handler.textRepo
|
||||
transcript, err := texts.Put(record.Id, entity.TextKindTranscript, marker)
|
||||
require.NoError(t, err)
|
||||
record.TranscriptTextID = &transcript.Id
|
||||
@@ -413,19 +396,10 @@ func TestForeignTopicDoesNotResolve(t *testing.T) {
|
||||
all := pageOf(t, env, "")
|
||||
require.Len(t, all.Items, 1)
|
||||
|
||||
stranger, _ := newSecondAccount(t, env.app)
|
||||
stranger := newSecondAccount(t, env)
|
||||
|
||||
topics, err := env.app.FindCollectionByNameOrId(migrations.TopicsCollection)
|
||||
require.NoError(t, err)
|
||||
foreign := core.NewRecord(topics)
|
||||
foreign.Set("owner", stranger.Id)
|
||||
foreign.Set("name", "ЧУЖАЯ-ТЕМА-МАРКЕР")
|
||||
require.NoError(t, env.app.Save(foreign))
|
||||
|
||||
raw, err := env.app.FindRecordById(migrations.RecordsCollection, all.Items[0].ID)
|
||||
require.NoError(t, err)
|
||||
raw.Set("topics", []string{foreign.Id})
|
||||
require.NoError(t, env.app.Save(raw))
|
||||
foreign := newTopic(t, env, stranger.ID, "ЧУЖАЯ-ТЕМА-МАРКЕР")
|
||||
attachTopic(t, env, all.Items[0].ID, foreign)
|
||||
|
||||
w := httptest.NewRecorder()
|
||||
env.serve(w, httptest.NewRequest("GET", "/app/audiorecords", http.NoBody))
|
||||
|
||||
Reference in New Issue
Block a user