bindingset

package
v0.6.0 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Oct 24, 2026 License: AGPL-3.0 Imports: 6 Imported by: 0

Documentation

Overview

Package bindingset — посев фикстур под инвариант «у выдачи есть хотя бы одна строка набора субъектов» (задача PRO-Robotech/kaname#902).

Отложенная проверка `access_bindings_carry_a_subject` отвергает фиксацию транзакции, оставившей выдачу без строк `access_binding_subjects`. Фикстура не снисходительнее продукта: она заводит то, что заводит продукт, — набор той же транзакцией, что строку выдачи. Набор фикстуры — одна строка из пары выдачи (`subject_type`, `subject_id`), порядковый номер 0: так пишет каждый путь записи продукта для выдачи с одним субъектом (`domain.NormalizeSubjects` сводит одиночную пару к набору из одного элемента).

Почему отдельный пакет

Посев зовут пробы многих пакетов, а `*_test.go` другого пакета импортировать нельзя; копия в каждом пакете — вторая редакция одного предмета. Образец — `internal/testsupport/activewayin` (тот же класс: отложенная проверка базы и фикстуры, писавшие строку без её спутника).

Пакет импортируют только пробы: прод-сборка его не видит.

Три формы

  • With оборачивает ОДИН оператор вставки выдач, исполняемый вне явной транзакции: набор ложится тем же оператором.
  • Seed пишет набор выдачам, которые завела открытая транзакция pgx, перед её фиксацией.
  • Insert — вставка выдачи портом писателя репозитория и запись её набора тем же писателем, как у сценариев службы.

Index

Constants

View Source
const SeedSQL = `` /* 308-byte string literal not displayed */

SeedSQL — строка набора каждой выдаче, которую ЭТА транзакция завела либо изменила и у которой строк набора нет. Выдача узнаётся по `xmin` строки — то есть по самой транзакции, — поэтому фикстуре не нужно перечислять идентификаторы.

Variables

This section is empty.

Functions

func Insert

Insert вставляет выдачу и пишет её набор тем же писателем, то есть в той же транзакции. Набор — `b.Subjects`, а без него — одна строка из пары вставленной выдачи. Отказ вставки возвращается как есть: набор после отказанной вставки не пишется.

func Seed

func Seed(t testing.TB, ctx context.Context, tx Execer)

Seed заводит строки набора выдачам транзакции перед её фиксацией.

func With

func With(insertBindings string) string

With оборачивает ОДИН оператор вставки строк выдач так, что строка набора каждой вставленной выдачи ложится тем же оператором: `WITH bound AS (<вставка> RETURNING …) INSERT INTO <набор> SELECT … FROM bound`.

Область строки набора (`resource_type`, `resource_id`) берётся из `RETURNING`, а не триггером заполнения: соседняя часть оператора `WITH` строку выдачи ещё не видит, а внешний ключ набора судится в конце оператора, когда видна уже обе строки.

Types

type Execer

type Execer interface {
	Exec(ctx context.Context, sql string, args ...any) (pgconn.CommandTag, error)
}

Execer — исполнитель оператора открытой транзакции pgx.

type Writer

type Writer interface {
	Insert(ctx context.Context, b domain.AccessBinding) (domain.AccessBinding, error)
	InsertSubjects(ctx context.Context, bindingID domain.AccessBindingID, subjects []domain.Subject) error
}

Writer — порт записи выдачи и её набора (подмножество `access_binding.WriterIface`).

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL