package m2mcore_test import ( "context" "errors" "testing" "git.zetit.ru/zuevav/Bridge-and-Join-s/internal/m2m" "git.zetit.ru/zuevav/Bridge-and-Join-s/internal/m2mcore" ) func TestRepoCreateIdempotentByGUID(t *testing.T) { ctx := context.Background() repo := m2mcore.NewMemoryRepository() // Используем валидный 36-символьный UUID (XSD НРД не требует битов // версии/варианта, только длину и hex). const guidStr = "c02a1d5e-c2af-4799-bab4-953f133c5133" d1, err := m2mcore.NewDeal(m2m.UUID(guidStr), "inv-1", []byte("a")) if err != nil { t.Fatal(err) } d2, err := m2mcore.NewDeal(m2m.UUID(guidStr), "inv-1", []byte("a")) if err != nil { t.Fatal(err) } saved1, err := repo.Create(ctx, d1) if err != nil { t.Fatal(err) } saved2, err := repo.Create(ctx, d2) if err != nil { t.Fatal(err) } if saved1.ID != saved2.ID { t.Errorf("идемпотентность нарушена: %s != %s", saved1.ID, saved2.ID) } } func TestRepoGetByGUIDNotFound(t *testing.T) { repo := m2mcore.NewMemoryRepository() _, err := repo.GetByGUID(context.Background(), m2m.UUID("c02a1d5e-c2af-4799-bab4-953f133c5133")) if !errors.Is(err, m2mcore.ErrNotFound) { t.Errorf("ожидалась ErrNotFound, получено %v", err) } } func TestRepoListFilters(t *testing.T) { ctx := context.Background() repo := m2mcore.NewMemoryRepository() mkDeal := func(guid, inv string) { t.Helper() d, err := m2mcore.NewDeal(m2m.UUID(guid), inv, []byte("x")) if err != nil { t.Fatal(err) } if _, err := repo.Create(ctx, d); err != nil { t.Fatal(err) } } mkDeal("00000000-0000-0000-0000-000000000001", "inv-A") mkDeal("00000000-0000-0000-0000-000000000002", "inv-A") mkDeal("00000000-0000-0000-0000-000000000003", "inv-B") all, err := repo.List(ctx, m2mcore.Filter{}) if err != nil { t.Fatal(err) } if len(all) != 3 { t.Errorf("ожидалось 3 сделки, получено %d", len(all)) } onlyA, err := repo.List(ctx, m2mcore.Filter{InvestorID: "inv-A"}) if err != nil { t.Fatal(err) } if len(onlyA) != 2 { t.Errorf("ожидалось 2 сделки inv-A, получено %d", len(onlyA)) } }