From 84070a0f07775d44d077c002fef14102c58a18f0 Mon Sep 17 00:00:00 2001 From: Roman Maklakov Date: Wed, 12 Jan 2022 15:28:55 +0300 Subject: [PATCH] entc/gen: add ctx in client.BeginTx (#2260) * doc: fix docker-compose up command(#2253) * entc/gen: add ctx in TxBegin & run go generate (#2253) * entc/integration: add tests for TxBegin Commit and Rollback (#2253) * entc/integration: uncomment accidentally commented code(#2253) * entc/integration: fixes after code-review (#2253) * entc/integration: remove blank lines, code-review (#2253) * examples: run code gen (#2253) --- CONTRIBUTING.md | 2 +- entc/gen/template/dialect/sql/tx.tmpl | 1 + entc/integration/cascadelete/ent/client.go | 1 + entc/integration/config/ent/client.go | 1 + entc/integration/customid/ent/client.go | 1 + entc/integration/edgefield/ent/client.go | 1 + entc/integration/ent/client.go | 1 + entc/integration/hooks/ent/client.go | 1 + entc/integration/idtype/ent/client.go | 1 + entc/integration/integration_test.go | 34 ++++++++++++++++++++-- entc/integration/json/ent/client.go | 1 + entc/integration/migrate/entv1/client.go | 1 + entc/integration/migrate/entv2/client.go | 1 + entc/integration/multischema/ent/client.go | 1 + entc/integration/privacy/ent/client.go | 1 + entc/integration/template/ent/client.go | 1 + examples/edgeindex/ent/client.go | 1 + examples/entcpkg/ent/client.go | 1 + examples/fs/ent/client.go | 1 + examples/m2m2types/ent/client.go | 1 + examples/m2mbidi/ent/client.go | 1 + examples/m2mrecur/ent/client.go | 1 + examples/o2m2types/ent/client.go | 1 + examples/o2mrecur/ent/client.go | 1 + examples/o2o2types/ent/client.go | 1 + examples/o2obidi/ent/client.go | 1 + examples/o2orecur/ent/client.go | 1 + examples/privacyadmin/ent/client.go | 1 + examples/privacytenant/ent/client.go | 1 + examples/start/ent/client.go | 1 + examples/traversal/ent/client.go | 1 + examples/version/ent/client.go | 1 + 32 files changed, 62 insertions(+), 4 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index ff60653a7..799a47ae5 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -34,7 +34,7 @@ go generate ./... Then, in `entc/inegration` run `docker-compose` in order to spin-up all database containers: ``` -docker-compose -f compose/docker-compose.yaml up -d --scale test=0 +docker-compose -f docker-compose.yaml up -d ``` Then, run `go test ./...` to run all integration tests. diff --git a/entc/gen/template/dialect/sql/tx.tmpl b/entc/gen/template/dialect/sql/tx.tmpl index 5e5367b7d..9c103fa87 100644 --- a/entc/gen/template/dialect/sql/tx.tmpl +++ b/entc/gen/template/dialect/sql/tx.tmpl @@ -21,6 +21,7 @@ func (c *Client) BeginTx(ctx context.Context, opts *sql.TxOptions) (*Tx, error) cfg := c.config cfg.driver = &txDriver{tx: tx, drv: c.driver} return &Tx{ + ctx: ctx, config: cfg, {{- range $n := $.Nodes }} {{ $n.Name }}: New{{ $n.Name }}Client(cfg), diff --git a/entc/integration/cascadelete/ent/client.go b/entc/integration/cascadelete/ent/client.go index 4f7a1457d..e51662e6d 100644 --- a/entc/integration/cascadelete/ent/client.go +++ b/entc/integration/cascadelete/ent/client.go @@ -102,6 +102,7 @@ func (c *Client) BeginTx(ctx context.Context, opts *sql.TxOptions) (*Tx, error) cfg := c.config cfg.driver = &txDriver{tx: tx, drv: c.driver} return &Tx{ + ctx: ctx, config: cfg, Comment: NewCommentClient(cfg), Post: NewPostClient(cfg), diff --git a/entc/integration/config/ent/client.go b/entc/integration/config/ent/client.go index 652798526..054c7fc2b 100644 --- a/entc/integration/config/ent/client.go +++ b/entc/integration/config/ent/client.go @@ -91,6 +91,7 @@ func (c *Client) BeginTx(ctx context.Context, opts *sql.TxOptions) (*Tx, error) cfg := c.config cfg.driver = &txDriver{tx: tx, drv: c.driver} return &Tx{ + ctx: ctx, config: cfg, User: NewUserClient(cfg), }, nil diff --git a/entc/integration/customid/ent/client.go b/entc/integration/customid/ent/client.go index 2d2777ead..7049d4ccd 100644 --- a/entc/integration/customid/ent/client.go +++ b/entc/integration/customid/ent/client.go @@ -139,6 +139,7 @@ func (c *Client) BeginTx(ctx context.Context, opts *sql.TxOptions) (*Tx, error) cfg := c.config cfg.driver = &txDriver{tx: tx, drv: c.driver} return &Tx{ + ctx: ctx, config: cfg, Blob: NewBlobClient(cfg), Car: NewCarClient(cfg), diff --git a/entc/integration/edgefield/ent/client.go b/entc/integration/edgefield/ent/client.go index ee81ef389..b7260fe32 100644 --- a/entc/integration/edgefield/ent/client.go +++ b/entc/integration/edgefield/ent/client.go @@ -133,6 +133,7 @@ func (c *Client) BeginTx(ctx context.Context, opts *sql.TxOptions) (*Tx, error) cfg := c.config cfg.driver = &txDriver{tx: tx, drv: c.driver} return &Tx{ + ctx: ctx, config: cfg, Car: NewCarClient(cfg), Card: NewCardClient(cfg), diff --git a/entc/integration/ent/client.go b/entc/integration/ent/client.go index 46b547d72..d62920e9e 100644 --- a/entc/integration/ent/client.go +++ b/entc/integration/ent/client.go @@ -158,6 +158,7 @@ func (c *Client) BeginTx(ctx context.Context, opts *sql.TxOptions) (*Tx, error) cfg := c.config cfg.driver = &txDriver{tx: tx, drv: c.driver} return &Tx{ + ctx: ctx, config: cfg, Card: NewCardClient(cfg), Comment: NewCommentClient(cfg), diff --git a/entc/integration/hooks/ent/client.go b/entc/integration/hooks/ent/client.go index 97f382eac..7e04e3233 100644 --- a/entc/integration/hooks/ent/client.go +++ b/entc/integration/hooks/ent/client.go @@ -97,6 +97,7 @@ func (c *Client) BeginTx(ctx context.Context, opts *sql.TxOptions) (*Tx, error) cfg := c.config cfg.driver = &txDriver{tx: tx, drv: c.driver} return &Tx{ + ctx: ctx, config: cfg, Card: NewCardClient(cfg), User: NewUserClient(cfg), diff --git a/entc/integration/idtype/ent/client.go b/entc/integration/idtype/ent/client.go index 18a220bc0..5b39a57a7 100644 --- a/entc/integration/idtype/ent/client.go +++ b/entc/integration/idtype/ent/client.go @@ -92,6 +92,7 @@ func (c *Client) BeginTx(ctx context.Context, opts *sql.TxOptions) (*Tx, error) cfg := c.config cfg.driver = &txDriver{tx: tx, drv: c.driver} return &Tx{ + ctx: ctx, config: cfg, User: NewUserClient(cfg), }, nil diff --git a/entc/integration/integration_test.go b/entc/integration/integration_test.go index 8d806e3c0..acce3abb2 100644 --- a/entc/integration/integration_test.go +++ b/entc/integration/integration_test.go @@ -1397,7 +1397,7 @@ func Tx(t *testing.T, client *ent.Client) { require.Error(t, err, "cannot start a transaction within a transaction") require.NoError(t, tx.Rollback()) }) - t.Run("TxOptions", func(t *testing.T) { + t.Run("TxOptions Rollback", func(t *testing.T) { if client.Dialect() == dialect.SQLite { t.Skip("Skipping SQLite") } @@ -1406,11 +1406,39 @@ func Tx(t *testing.T, client *ent.Client) { var m mocker m.On("onRollback", nil).Once() defer m.AssertExpectations(t) - tx.OnRollback(m.rHook()) + tx.OnRollback(func(next ent.Rollbacker) ent.Rollbacker { + return ent.RollbackFunc(func(ctx context.Context, tx *ent.Tx) error { + err := next.Rollback(ctx, tx) + m.onRollback(err) + require.NotNil(t, ctx) + return err + }) + }) err = tx.Item.Create().Exec(ctx) - require.Error(t, err) + require.Error(t, err, "expect creation to fail in read-only tx") require.NoError(t, tx.Rollback()) }) + t.Run("TxOptions Commit", func(t *testing.T) { + if client.Dialect() == dialect.SQLite { + t.Skip("Skipping SQLite") + } + tx, err := client.BeginTx(ctx, &sql.TxOptions{Isolation: stdsql.LevelReadCommitted}) + require.NoError(t, err) + var m mocker + m.On("onCommit", nil).Once() + defer m.AssertExpectations(t) + tx.OnCommit(func(next ent.Committer) ent.Committer { + return ent.CommitFunc(func(ctx context.Context, tx *ent.Tx) error { + err := next.Commit(ctx, tx) + m.onCommit(err) + require.NotNil(t, ctx) + return err + }) + }) + err = tx.Item.Create().Exec(ctx) + require.NoError(t, tx.Commit()) + require.NoError(t, err) + }) } func DefaultValue(t *testing.T, client *ent.Client) { diff --git a/entc/integration/json/ent/client.go b/entc/integration/json/ent/client.go index 497980d5e..8f17169df 100644 --- a/entc/integration/json/ent/client.go +++ b/entc/integration/json/ent/client.go @@ -91,6 +91,7 @@ func (c *Client) BeginTx(ctx context.Context, opts *sql.TxOptions) (*Tx, error) cfg := c.config cfg.driver = &txDriver{tx: tx, drv: c.driver} return &Tx{ + ctx: ctx, config: cfg, User: NewUserClient(cfg), }, nil diff --git a/entc/integration/migrate/entv1/client.go b/entc/integration/migrate/entv1/client.go index 0fd287259..996e3e97e 100644 --- a/entc/integration/migrate/entv1/client.go +++ b/entc/integration/migrate/entv1/client.go @@ -107,6 +107,7 @@ func (c *Client) BeginTx(ctx context.Context, opts *sql.TxOptions) (*Tx, error) cfg := c.config cfg.driver = &txDriver{tx: tx, drv: c.driver} return &Tx{ + ctx: ctx, config: cfg, Car: NewCarClient(cfg), Conversion: NewConversionClient(cfg), diff --git a/entc/integration/migrate/entv2/client.go b/entc/integration/migrate/entv2/client.go index 3cb74bb6e..7fbb08859 100644 --- a/entc/integration/migrate/entv2/client.go +++ b/entc/integration/migrate/entv2/client.go @@ -122,6 +122,7 @@ func (c *Client) BeginTx(ctx context.Context, opts *sql.TxOptions) (*Tx, error) cfg := c.config cfg.driver = &txDriver{tx: tx, drv: c.driver} return &Tx{ + ctx: ctx, config: cfg, Car: NewCarClient(cfg), Conversion: NewConversionClient(cfg), diff --git a/entc/integration/multischema/ent/client.go b/entc/integration/multischema/ent/client.go index 86be01219..c560dad40 100644 --- a/entc/integration/multischema/ent/client.go +++ b/entc/integration/multischema/ent/client.go @@ -102,6 +102,7 @@ func (c *Client) BeginTx(ctx context.Context, opts *sql.TxOptions) (*Tx, error) cfg := c.config cfg.driver = &txDriver{tx: tx, drv: c.driver} return &Tx{ + ctx: ctx, config: cfg, Group: NewGroupClient(cfg), Pet: NewPetClient(cfg), diff --git a/entc/integration/privacy/ent/client.go b/entc/integration/privacy/ent/client.go index ea483c941..e5eb17dd0 100644 --- a/entc/integration/privacy/ent/client.go +++ b/entc/integration/privacy/ent/client.go @@ -102,6 +102,7 @@ func (c *Client) BeginTx(ctx context.Context, opts *sql.TxOptions) (*Tx, error) cfg := c.config cfg.driver = &txDriver{tx: tx, drv: c.driver} return &Tx{ + ctx: ctx, config: cfg, Task: NewTaskClient(cfg), Team: NewTeamClient(cfg), diff --git a/entc/integration/template/ent/client.go b/entc/integration/template/ent/client.go index f3e4c7dd4..f68a6fbc7 100644 --- a/entc/integration/template/ent/client.go +++ b/entc/integration/template/ent/client.go @@ -104,6 +104,7 @@ func (c *Client) BeginTx(ctx context.Context, opts *sql.TxOptions) (*Tx, error) cfg := c.config cfg.driver = &txDriver{tx: tx, drv: c.driver} return &Tx{ + ctx: ctx, config: cfg, Group: NewGroupClient(cfg), Pet: NewPetClient(cfg), diff --git a/examples/edgeindex/ent/client.go b/examples/edgeindex/ent/client.go index 00cbeaf0c..cf8ccd7dc 100644 --- a/examples/edgeindex/ent/client.go +++ b/examples/edgeindex/ent/client.go @@ -97,6 +97,7 @@ func (c *Client) BeginTx(ctx context.Context, opts *sql.TxOptions) (*Tx, error) cfg := c.config cfg.driver = &txDriver{tx: tx, drv: c.driver} return &Tx{ + ctx: ctx, config: cfg, City: NewCityClient(cfg), Street: NewStreetClient(cfg), diff --git a/examples/entcpkg/ent/client.go b/examples/entcpkg/ent/client.go index 6a999a1b2..a58097bd6 100644 --- a/examples/entcpkg/ent/client.go +++ b/examples/entcpkg/ent/client.go @@ -91,6 +91,7 @@ func (c *Client) BeginTx(ctx context.Context, opts *sql.TxOptions) (*Tx, error) cfg := c.config cfg.driver = &txDriver{tx: tx, drv: c.driver} return &Tx{ + ctx: ctx, config: cfg, User: NewUserClient(cfg), }, nil diff --git a/examples/fs/ent/client.go b/examples/fs/ent/client.go index d6d78e7d1..1b3b200ba 100644 --- a/examples/fs/ent/client.go +++ b/examples/fs/ent/client.go @@ -92,6 +92,7 @@ func (c *Client) BeginTx(ctx context.Context, opts *sql.TxOptions) (*Tx, error) cfg := c.config cfg.driver = &txDriver{tx: tx, drv: c.driver} return &Tx{ + ctx: ctx, config: cfg, File: NewFileClient(cfg), }, nil diff --git a/examples/m2m2types/ent/client.go b/examples/m2m2types/ent/client.go index 7420edcc6..d23e892ed 100644 --- a/examples/m2m2types/ent/client.go +++ b/examples/m2m2types/ent/client.go @@ -97,6 +97,7 @@ func (c *Client) BeginTx(ctx context.Context, opts *sql.TxOptions) (*Tx, error) cfg := c.config cfg.driver = &txDriver{tx: tx, drv: c.driver} return &Tx{ + ctx: ctx, config: cfg, Group: NewGroupClient(cfg), User: NewUserClient(cfg), diff --git a/examples/m2mbidi/ent/client.go b/examples/m2mbidi/ent/client.go index 0c9c0b7b9..fe9f3898e 100644 --- a/examples/m2mbidi/ent/client.go +++ b/examples/m2mbidi/ent/client.go @@ -92,6 +92,7 @@ func (c *Client) BeginTx(ctx context.Context, opts *sql.TxOptions) (*Tx, error) cfg := c.config cfg.driver = &txDriver{tx: tx, drv: c.driver} return &Tx{ + ctx: ctx, config: cfg, User: NewUserClient(cfg), }, nil diff --git a/examples/m2mrecur/ent/client.go b/examples/m2mrecur/ent/client.go index b58e77d85..a3bfab873 100644 --- a/examples/m2mrecur/ent/client.go +++ b/examples/m2mrecur/ent/client.go @@ -92,6 +92,7 @@ func (c *Client) BeginTx(ctx context.Context, opts *sql.TxOptions) (*Tx, error) cfg := c.config cfg.driver = &txDriver{tx: tx, drv: c.driver} return &Tx{ + ctx: ctx, config: cfg, User: NewUserClient(cfg), }, nil diff --git a/examples/o2m2types/ent/client.go b/examples/o2m2types/ent/client.go index 9131044ff..1e3fb5a62 100644 --- a/examples/o2m2types/ent/client.go +++ b/examples/o2m2types/ent/client.go @@ -97,6 +97,7 @@ func (c *Client) BeginTx(ctx context.Context, opts *sql.TxOptions) (*Tx, error) cfg := c.config cfg.driver = &txDriver{tx: tx, drv: c.driver} return &Tx{ + ctx: ctx, config: cfg, Pet: NewPetClient(cfg), User: NewUserClient(cfg), diff --git a/examples/o2mrecur/ent/client.go b/examples/o2mrecur/ent/client.go index a6ceec4d4..6d11d4b7f 100644 --- a/examples/o2mrecur/ent/client.go +++ b/examples/o2mrecur/ent/client.go @@ -92,6 +92,7 @@ func (c *Client) BeginTx(ctx context.Context, opts *sql.TxOptions) (*Tx, error) cfg := c.config cfg.driver = &txDriver{tx: tx, drv: c.driver} return &Tx{ + ctx: ctx, config: cfg, Node: NewNodeClient(cfg), }, nil diff --git a/examples/o2o2types/ent/client.go b/examples/o2o2types/ent/client.go index 4a605072f..738b2a259 100644 --- a/examples/o2o2types/ent/client.go +++ b/examples/o2o2types/ent/client.go @@ -97,6 +97,7 @@ func (c *Client) BeginTx(ctx context.Context, opts *sql.TxOptions) (*Tx, error) cfg := c.config cfg.driver = &txDriver{tx: tx, drv: c.driver} return &Tx{ + ctx: ctx, config: cfg, Card: NewCardClient(cfg), User: NewUserClient(cfg), diff --git a/examples/o2obidi/ent/client.go b/examples/o2obidi/ent/client.go index 765caa9da..7d67e1c9c 100644 --- a/examples/o2obidi/ent/client.go +++ b/examples/o2obidi/ent/client.go @@ -92,6 +92,7 @@ func (c *Client) BeginTx(ctx context.Context, opts *sql.TxOptions) (*Tx, error) cfg := c.config cfg.driver = &txDriver{tx: tx, drv: c.driver} return &Tx{ + ctx: ctx, config: cfg, User: NewUserClient(cfg), }, nil diff --git a/examples/o2orecur/ent/client.go b/examples/o2orecur/ent/client.go index e803307c6..0adba589c 100644 --- a/examples/o2orecur/ent/client.go +++ b/examples/o2orecur/ent/client.go @@ -92,6 +92,7 @@ func (c *Client) BeginTx(ctx context.Context, opts *sql.TxOptions) (*Tx, error) cfg := c.config cfg.driver = &txDriver{tx: tx, drv: c.driver} return &Tx{ + ctx: ctx, config: cfg, Node: NewNodeClient(cfg), }, nil diff --git a/examples/privacyadmin/ent/client.go b/examples/privacyadmin/ent/client.go index d0cee8246..f59d866e4 100644 --- a/examples/privacyadmin/ent/client.go +++ b/examples/privacyadmin/ent/client.go @@ -91,6 +91,7 @@ func (c *Client) BeginTx(ctx context.Context, opts *sql.TxOptions) (*Tx, error) cfg := c.config cfg.driver = &txDriver{tx: tx, drv: c.driver} return &Tx{ + ctx: ctx, config: cfg, User: NewUserClient(cfg), }, nil diff --git a/examples/privacytenant/ent/client.go b/examples/privacytenant/ent/client.go index 1195289a8..164796639 100644 --- a/examples/privacytenant/ent/client.go +++ b/examples/privacytenant/ent/client.go @@ -102,6 +102,7 @@ func (c *Client) BeginTx(ctx context.Context, opts *sql.TxOptions) (*Tx, error) cfg := c.config cfg.driver = &txDriver{tx: tx, drv: c.driver} return &Tx{ + ctx: ctx, config: cfg, Group: NewGroupClient(cfg), Tenant: NewTenantClient(cfg), diff --git a/examples/start/ent/client.go b/examples/start/ent/client.go index 85bfa13fa..dc4eabbe3 100644 --- a/examples/start/ent/client.go +++ b/examples/start/ent/client.go @@ -102,6 +102,7 @@ func (c *Client) BeginTx(ctx context.Context, opts *sql.TxOptions) (*Tx, error) cfg := c.config cfg.driver = &txDriver{tx: tx, drv: c.driver} return &Tx{ + ctx: ctx, config: cfg, Car: NewCarClient(cfg), Group: NewGroupClient(cfg), diff --git a/examples/traversal/ent/client.go b/examples/traversal/ent/client.go index 62a0931e6..5f366b5fb 100644 --- a/examples/traversal/ent/client.go +++ b/examples/traversal/ent/client.go @@ -102,6 +102,7 @@ func (c *Client) BeginTx(ctx context.Context, opts *sql.TxOptions) (*Tx, error) cfg := c.config cfg.driver = &txDriver{tx: tx, drv: c.driver} return &Tx{ + ctx: ctx, config: cfg, Group: NewGroupClient(cfg), Pet: NewPetClient(cfg), diff --git a/examples/version/ent/client.go b/examples/version/ent/client.go index c87580332..1c0ae6ef0 100644 --- a/examples/version/ent/client.go +++ b/examples/version/ent/client.go @@ -91,6 +91,7 @@ func (c *Client) BeginTx(ctx context.Context, opts *sql.TxOptions) (*Tx, error) cfg := c.config cfg.driver = &txDriver{tx: tx, drv: c.driver} return &Tx{ + ctx: ctx, config: cfg, User: NewUserClient(cfg), }, nil