From 8fedd09156fb5c8a18bf358c0af44093c9e54ea6 Mon Sep 17 00:00:00 2001 From: Viktor Tsapovskiy Date: Thu, 23 Oct 2025 17:46:15 +0300 Subject: [PATCH 1/2] box: box.New returns an error instead of panic Method `box.New` now returns (*Box, error), because avoiding panics entirely in third-party libraries is ideal, since we can't break compatibility. Nonetheless, there is still a way to panic on error, via implemented `box.MustNew` wrapper. Part of #448 --- CHANGELOG.md | 3 ++ box/box.go | 19 ++++++++--- box/box_test.go | 20 ++++++++--- box/example_test.go | 35 +++++++++++++++---- box/session_test.go | 3 +- box/tarantool_test.go | 78 ++++++++++++++++++++++++++++++------------- 6 files changed, 119 insertions(+), 39 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ab3c73982..cb9e9587c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,7 @@ Versioning](http://semver.org/spec/v2.0.0.html) except to the first release. ### Added * New types for MessagePack extensions compatible with go-option (#459). +* Added `box.MustNew` wrapper for `box.New`: panics when `box.New` returns an error (#448). ### Changed @@ -18,6 +19,8 @@ Versioning](http://semver.org/spec/v2.0.0.html) except to the first release. ### Fixed +* `box.New` returns an error instead of panic (#448). + ## [v2.4.1] - 2025-10-16 This maintenance release marks the end of active development on the `v2` diff --git a/box/box.go b/box/box.go index a4cc1780e..d28f8a876 100644 --- a/box/box.go +++ b/box/box.go @@ -1,6 +1,8 @@ package box import ( + "errors" + "github.com/tarantool/go-tarantool/v3" ) @@ -11,16 +13,25 @@ type Box struct { } // New returns a new instance of the box structure, which implements the Box interface. -func New(conn tarantool.Doer) *Box { +func New(conn tarantool.Doer) (*Box, error) { if conn == nil { - // Check if the provided Tarantool connection is nil, and if it is, panic with an error - // message. panic early helps to catch and fix nil pointer issues in the code. - panic("tarantool connection cannot be nil") + return nil, errors.New("tarantool connection cannot be nil") } return &Box{ conn: conn, // Assigns the provided Tarantool connection. + }, nil +} + +// MustNew returns a new instance of the box structure, which implements the Box interface. +func MustNew(conn tarantool.Doer) *Box { + b, err := New(conn) + if err != nil { + // Check if the provided Tarantool connection is nil, and if it is, panic with an error + // message. panic early helps to catch and fix nil pointer issues in the code + panic(err) } + return b } // Schema returns a new Schema instance, providing access to schema-related operations. diff --git a/box/box_test.go b/box/box_test.go index 59ceaf6e3..e9732e108 100644 --- a/box/box_test.go +++ b/box/box_test.go @@ -15,8 +15,15 @@ import ( func TestNew(t *testing.T) { t.Parallel() + _, err := box.New(nil) + require.Error(t, err) +} + +func TestMustNew(t *testing.T) { + t.Parallel() + // Create a box instance with a nil connection. This should lead to a panic. - require.Panics(t, func() { box.New(nil) }) + require.Panics(t, func() { box.MustNew(nil) }) } func TestMocked_BoxInfo(t *testing.T) { @@ -37,7 +44,8 @@ func TestMocked_BoxInfo(t *testing.T) { mock := test_helpers.NewMockDoer(t, test_helpers.NewMockResponse(t, data), ) - b := box.New(&mock) + b, err := box.New(&mock) + require.NoError(t, err) info, err := b.Info() require.NoError(t, err) @@ -57,7 +65,8 @@ func TestMocked_BoxSchemaUserInfo(t *testing.T) { mock := test_helpers.NewMockDoer(t, test_helpers.NewMockResponse(t, data), ) - b := box.New(&mock) + b, err := box.New(&mock) + require.NoError(t, err) privs, err := b.Schema().User().Info(context.Background(), "username") require.NoError(t, err) @@ -82,8 +91,9 @@ func TestMocked_BoxSessionSu(t *testing.T) { test_helpers.NewMockResponse(t, []interface{}{}), errors.New("user not found or supplied credentials are invalid"), ) - b := box.New(&mock) + b, err := box.New(&mock) + require.NoError(t, err) - err := b.Session().Su(context.Background(), "admin") + err = b.Session().Su(context.Background(), "admin") require.NoError(t, err) } diff --git a/box/example_test.go b/box/example_test.go index fa65189a8..578f88876 100644 --- a/box/example_test.go +++ b/box/example_test.go @@ -45,7 +45,10 @@ func ExampleBox_Info() { // Or use simple Box implementation. - b := box.New(client) + b, err := box.New(client) + if err != nil { + log.Fatalf("Failed get box info: %s", err) + } info, err := b.Info() if err != nil { @@ -88,7 +91,11 @@ func ExampleSchemaUser_Exists() { } // Or use simple User implementation. - b := box.New(client) + b, err := box.New(client) + if err != nil { + log.Fatalf("Failed get box info: %s", err) + } + exists, err := b.Schema().User().Exists(ctx, "user") if err != nil { log.Fatalf("Failed get box schema user exists with error: %s", err) @@ -120,7 +127,11 @@ func ExampleSchemaUser_Create() { } // Create SchemaUser. - schemaUser := box.New(client).Schema().User() + b, err := box.New(client) + if err != nil { + log.Fatalf("Failed to connect: %s", err) + } + schemaUser := b.Schema().User() // Create a new user. username := "new_user" @@ -153,7 +164,11 @@ func ExampleSchemaUser_Drop() { } // Create SchemaUser. - schemaUser := box.New(client).Schema().User() + b, err := box.New(client) + if err != nil { + log.Fatalf("Failed to connect: %s", err) + } + schemaUser := b.Schema().User() // Drop an existing user. username := "new_user" @@ -192,7 +207,11 @@ func ExampleSchemaUser_Password() { } // Create SchemaUser. - schemaUser := box.New(client).Schema().User() + b, err := box.New(client) + if err != nil { + log.Fatalf("Failed to connect: %s", err) + } + schemaUser := b.Schema().User() // Get the password hash. password := "my-password" @@ -221,7 +240,11 @@ func ExampleSchemaUser_Info() { } // Create SchemaUser. - schemaUser := box.New(client).Schema().User() + b, err := box.New(client) + if err != nil { + log.Fatalf("Failed to connect: %s", err) + } + schemaUser := b.Schema().User() info, err := schemaUser.Info(ctx, "test") if err != nil { diff --git a/box/session_test.go b/box/session_test.go index 39b80d1d4..8348dd11c 100644 --- a/box/session_test.go +++ b/box/session_test.go @@ -10,7 +10,8 @@ import ( ) func TestBox_Session(t *testing.T) { - b := box.New(th.Ptr(th.NewMockDoer(t))) + b, err := box.New(th.Ptr(th.NewMockDoer(t))) + require.NoError(t, err) require.NotNil(t, b.Session()) } diff --git a/box/tarantool_test.go b/box/tarantool_test.go index 4244a98e9..56092859d 100644 --- a/box/tarantool_test.go +++ b/box/tarantool_test.go @@ -48,7 +48,10 @@ func TestBox_Sugar_Info(t *testing.T) { conn, err := tarantool.Connect(ctx, dialer, tarantool.Opts{}) require.NoError(t, err) - info, err := box.New(conn).Info() + b, err := box.New(conn) + require.NoError(t, err) + + info, err := b.Info() require.NoError(t, err) validateInfo(t, info) @@ -70,6 +73,10 @@ func TestBox_Info(t *testing.T) { validateInfo(t, resp.Info) } +func TestBox_Connection_NotNil(t *testing.T) { + +} + func TestBox_Sugar_Schema_UserCreate_NoError(t *testing.T) { const ( username = "user_create_no_error" @@ -83,7 +90,8 @@ func TestBox_Sugar_Schema_UserCreate_NoError(t *testing.T) { conn, err := tarantool.Connect(ctx, dialer, tarantool.Opts{}) require.NoError(t, err) - b := box.New(conn) + b, err := box.New(conn) + require.NoError(t, err) // Create new user. err = b.Schema().User().Create(ctx, username, box.UserCreateOptions{Password: password}) @@ -103,7 +111,8 @@ func TestBox_Sugar_Schema_UserCreate_CanConnectWithNewCred(t *testing.T) { conn, err := tarantool.Connect(ctx, dialer, tarantool.Opts{}) require.NoError(t, err) - b := box.New(conn) + b, err := box.New(conn) + require.NoError(t, err) // Create new user. err = b.Schema().User().Create(ctx, username, box.UserCreateOptions{Password: password}) @@ -137,7 +146,8 @@ func TestBox_Sugar_Schema_UserCreate_AlreadyExists(t *testing.T) { conn, err := tarantool.Connect(ctx, dialer, tarantool.Opts{}) require.NoError(t, err) - b := box.New(conn) + b, err := box.New(conn) + require.NoError(t, err) // Create new user. err = b.Schema().User().Create(ctx, username, box.UserCreateOptions{Password: password}) @@ -167,7 +177,8 @@ func TestBox_Sugar_Schema_UserCreate_ExistsTrue(t *testing.T) { conn, err := tarantool.Connect(ctx, dialer, tarantool.Opts{}) require.NoError(t, err) - b := box.New(conn) + b, err := box.New(conn) + require.NoError(t, err) // Create new user. err = b.Schema().User().Create(ctx, username, box.UserCreateOptions{Password: password}) @@ -193,7 +204,8 @@ func TestBox_Sugar_Schema_UserCreate_IfNotExistsNoErr(t *testing.T) { conn, err := tarantool.Connect(ctx, dialer, tarantool.Opts{}) require.NoError(t, err) - b := box.New(conn) + b, err := box.New(conn) + require.NoError(t, err) // Create new user. err = b.Schema().User().Create(ctx, username, box.UserCreateOptions{Password: password}) @@ -217,7 +229,8 @@ func TestBox_Sugar_Schema_UserPassword(t *testing.T) { conn, err := tarantool.Connect(ctx, dialer, tarantool.Opts{}) require.NoError(t, err) - b := box.New(conn) + b, err := box.New(conn) + require.NoError(t, err) // Require password hash. hash, err := b.Schema().User().Password(ctx, password) @@ -236,7 +249,8 @@ func TestBox_Sugar_Schema_UserDrop_AfterCreate(t *testing.T) { conn, err := tarantool.Connect(ctx, dialer, tarantool.Opts{}) require.NoError(t, err) - b := box.New(conn) + b, err := box.New(conn) + require.NoError(t, err) // Create new user err = b.Schema().User().Create(ctx, username, box.UserCreateOptions{Password: password}) @@ -258,7 +272,8 @@ func TestBox_Sugar_Schema_UserDrop_DoubleDrop(t *testing.T) { conn, err := tarantool.Connect(ctx, dialer, tarantool.Opts{}) require.NoError(t, err) - b := box.New(conn) + b, err := box.New(conn) + require.NoError(t, err) // Create new user err = b.Schema().User().Create(ctx, username, box.UserCreateOptions{Password: password}) @@ -286,7 +301,8 @@ func TestBox_Sugar_Schema_UserDrop_UnknownUser(t *testing.T) { conn, err := tarantool.Connect(ctx, dialer, tarantool.Opts{}) require.NoError(t, err) - b := box.New(conn) + b, err := box.New(conn) + require.NoError(t, err) // Require error cause user not exists err = b.Schema().User().Drop(ctx, "some_strange_not_existing_name", box.UserDropOptions{}) @@ -305,7 +321,8 @@ func TestSchemaUser_Passwd_NotFound(t *testing.T) { conn, err := tarantool.Connect(ctx, dialer, tarantool.Opts{}) require.NoError(t, err) - b := box.New(conn) + b, err := box.New(conn) + require.NoError(t, err) err = b.Schema().User().Passwd(ctx, "not-exists-passwd", "new_password") require.Error(t, err) @@ -329,7 +346,8 @@ func TestSchemaUser_Passwd_Ok(t *testing.T) { conn, err := tarantool.Connect(ctx, dialer, tarantool.Opts{}) require.NoError(t, err) - b := box.New(conn) + b, err := box.New(conn) + require.NoError(t, err) // New user change password and connect @@ -367,7 +385,8 @@ func TestSchemaUser_Passwd_WithoutGrants(t *testing.T) { conn, err := tarantool.Connect(ctx, dialer, tarantool.Opts{}) require.NoError(t, err) - b := box.New(conn) + b, err := box.New(conn) + require.NoError(t, err) err = b.Schema().User().Create(ctx, username, box.UserCreateOptions{Password: startPassword, IfNotExists: true}) @@ -381,7 +400,8 @@ func TestSchemaUser_Passwd_WithoutGrants(t *testing.T) { require.NoError(t, err) require.NotNil(t, conn2Fail) - bFail := box.New(conn2Fail) + bFail, err := box.New(conn2Fail) + require.NoError(t, err) // can't change self user password without grants err = bFail.Schema().User().Passwd(ctx, endPassword) require.Error(t, err) @@ -401,7 +421,8 @@ func TestSchemaUser_Info_TestUserCorrect(t *testing.T) { conn, err := tarantool.Connect(ctx, dialer, tarantool.Opts{}) require.NoError(t, err) - b := box.New(conn) + b, err := box.New(conn) + require.NoError(t, err) privileges, err := b.Schema().User().Info(ctx, dialer.User) require.NoError(t, err) @@ -418,7 +439,8 @@ func TestSchemaUser_Info_NonExistsUser(t *testing.T) { conn, err := tarantool.Connect(ctx, dialer, tarantool.Opts{}) require.NoError(t, err) - b := box.New(conn) + b, err := box.New(conn) + require.NoError(t, err) privileges, err := b.Schema().User().Info(ctx, "non-existing") require.Error(t, err) @@ -438,7 +460,8 @@ func TestBox_Sugar_Schema_UserGrant_NoSu(t *testing.T) { conn, err := tarantool.Connect(ctx, dialer, tarantool.Opts{}) require.NoError(t, err) - b := box.New(conn) + b, err := box.New(conn) + require.NoError(t, err) err = b.Schema().User().Create(ctx, username, box.UserCreateOptions{Password: password}) require.NoError(t, err) @@ -471,7 +494,8 @@ func TestBox_Sugar_Schema_UserGrant_WithSu(t *testing.T) { conn, err := tarantool.Connect(ctx, dialer, tarantool.Opts{}) require.NoError(t, err) - b := box.New(conn) + b, err := box.New(conn) + require.NoError(t, err) err = b.Schema().User().Create(ctx, username, box.UserCreateOptions{Password: password}) require.NoError(t, err) @@ -521,7 +545,8 @@ func TestSchemaUser_Revoke_WithoutSu(t *testing.T) { conn, err := tarantool.Connect(ctx, dialer, tarantool.Opts{}) require.NoError(t, err) - b := box.New(conn) + b, err := box.New(conn) + require.NoError(t, err) err = b.Schema().User().Create(ctx, username, box.UserCreateOptions{Password: password}) require.NoError(t, err) @@ -555,7 +580,8 @@ func TestSchemaUser_Revoke_WithSu(t *testing.T) { conn, err := tarantool.Connect(ctx, dialer, tarantool.Opts{}) require.NoError(t, err) - b := box.New(conn) + b, err := box.New(conn) + require.NoError(t, err) err = b.Schema().User().Create(ctx, username, box.UserCreateOptions{Password: password}) require.NoError(t, err) @@ -603,7 +629,8 @@ func TestSchemaUser_Revoke_NonExistsPermission(t *testing.T) { conn, err := tarantool.Connect(ctx, dialer, tarantool.Opts{}) require.NoError(t, err) - b := box.New(conn) + b, err := box.New(conn) + require.NoError(t, err) err = b.Schema().User().Create(ctx, username, box.UserCreateOptions{Password: password}) require.NoError(t, err) @@ -639,7 +666,8 @@ func TestSession_Su_AdminPermissions(t *testing.T) { conn, err := tarantool.Connect(ctx, dialer, tarantool.Opts{}) require.NoError(t, err) - b := box.New(conn) + b, err := box.New(conn) + require.NoError(t, err) err = b.Session().Su(ctx, "admin") require.NoError(t, err) @@ -652,7 +680,11 @@ func cleanupUser(username string) { log.Fatal(err) } - b := box.New(conn) + b, err := box.New(conn) + if err != nil { + log.Fatal(err) + } + err = b.Schema().User().Drop(ctx, username, box.UserDropOptions{}) if err != nil { log.Fatal(err) From 549064566670328ad4ffd341d9c2edbf9a556f43 Mon Sep 17 00:00:00 2001 From: Viktor Tsapovskiy Date: Sat, 25 Oct 2025 23:53:29 +0300 Subject: [PATCH 2/2] box: refactored tests with box.New Tests now use `box.MustNew` instead of `box.New`. Added TestMocked_BoxNew for box.New creating a workable object by means of checking length of Request[] in mockDoer after subrequest. Closes #448 --- CHANGELOG.md | 5 ++- MIGRATION.md | 2 ++ box/box.go | 3 +- box/box_test.go | 27 +++++++++++---- box/example_test.go | 34 ++++--------------- box/session_test.go | 3 +- box/tarantool_test.go | 76 ++++++++++++++----------------------------- 7 files changed, 56 insertions(+), 94 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index cb9e9587c..c2dc4fc19 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,16 +11,15 @@ Versioning](http://semver.org/spec/v2.0.0.html) except to the first release. ### Added * New types for MessagePack extensions compatible with go-option (#459). -* Added `box.MustNew` wrapper for `box.New`: panics when `box.New` returns an error (#448). +* Added `box.MustNew` wrapper for `box.New` without an error (#448). ### Changed * Required Go version is `1.24` now (#456). +* `box.New` returns an error instead of panic (#448). ### Fixed -* `box.New` returns an error instead of panic (#448). - ## [v2.4.1] - 2025-10-16 This maintenance release marks the end of active development on the `v2` diff --git a/MIGRATION.md b/MIGRATION.md index 54f4e3034..ea82c8815 100644 --- a/MIGRATION.md +++ b/MIGRATION.md @@ -9,6 +9,8 @@ TODO ### Major changes * Required Go version is `1.24` now. +* `box.New` returns an error instead of panic +* Added `box.MustNew` wrapper for `box.New` without an error ## Migration from v1.x.x to v2.x.x diff --git a/box/box.go b/box/box.go index d28f8a876..4341768cf 100644 --- a/box/box.go +++ b/box/box.go @@ -24,11 +24,10 @@ func New(conn tarantool.Doer) (*Box, error) { } // MustNew returns a new instance of the box structure, which implements the Box interface. +// It panics if conn == nil. func MustNew(conn tarantool.Doer) *Box { b, err := New(conn) if err != nil { - // Check if the provided Tarantool connection is nil, and if it is, panic with an error - // message. panic early helps to catch and fix nil pointer issues in the code panic(err) } return b diff --git a/box/box_test.go b/box/box_test.go index e9732e108..57d0d5526 100644 --- a/box/box_test.go +++ b/box/box_test.go @@ -26,6 +26,22 @@ func TestMustNew(t *testing.T) { require.Panics(t, func() { box.MustNew(nil) }) } +func TestMocked_BoxNew(t *testing.T) { + t.Parallel() + + mock := test_helpers.NewMockDoer(t, + test_helpers.NewMockResponse(t, "valid"), + ) + + b, err := box.New(&mock) + require.NoError(t, err) + require.NotNil(t, b) + + assert.Len(t, mock.Requests, 0) + b.Schema().User().Exists(box.NewInfoRequest().Ctx(), "") + require.Len(t, mock.Requests, 1) +} + func TestMocked_BoxInfo(t *testing.T) { t.Parallel() @@ -44,8 +60,7 @@ func TestMocked_BoxInfo(t *testing.T) { mock := test_helpers.NewMockDoer(t, test_helpers.NewMockResponse(t, data), ) - b, err := box.New(&mock) - require.NoError(t, err) + b := box.MustNew(&mock) info, err := b.Info() require.NoError(t, err) @@ -65,8 +80,7 @@ func TestMocked_BoxSchemaUserInfo(t *testing.T) { mock := test_helpers.NewMockDoer(t, test_helpers.NewMockResponse(t, data), ) - b, err := box.New(&mock) - require.NoError(t, err) + b := box.MustNew(&mock) privs, err := b.Schema().User().Info(context.Background(), "username") require.NoError(t, err) @@ -91,9 +105,8 @@ func TestMocked_BoxSessionSu(t *testing.T) { test_helpers.NewMockResponse(t, []interface{}{}), errors.New("user not found or supplied credentials are invalid"), ) - b, err := box.New(&mock) - require.NoError(t, err) + b := box.MustNew(&mock) - err = b.Session().Su(context.Background(), "admin") + err := b.Session().Su(context.Background(), "admin") require.NoError(t, err) } diff --git a/box/example_test.go b/box/example_test.go index 578f88876..39474d8aa 100644 --- a/box/example_test.go +++ b/box/example_test.go @@ -45,10 +45,7 @@ func ExampleBox_Info() { // Or use simple Box implementation. - b, err := box.New(client) - if err != nil { - log.Fatalf("Failed get box info: %s", err) - } + b := box.MustNew(client) info, err := b.Info() if err != nil { @@ -91,10 +88,7 @@ func ExampleSchemaUser_Exists() { } // Or use simple User implementation. - b, err := box.New(client) - if err != nil { - log.Fatalf("Failed get box info: %s", err) - } + b := box.MustNew(client) exists, err := b.Schema().User().Exists(ctx, "user") if err != nil { @@ -127,11 +121,7 @@ func ExampleSchemaUser_Create() { } // Create SchemaUser. - b, err := box.New(client) - if err != nil { - log.Fatalf("Failed to connect: %s", err) - } - schemaUser := b.Schema().User() + schemaUser := box.MustNew(client).Schema().User() // Create a new user. username := "new_user" @@ -164,11 +154,7 @@ func ExampleSchemaUser_Drop() { } // Create SchemaUser. - b, err := box.New(client) - if err != nil { - log.Fatalf("Failed to connect: %s", err) - } - schemaUser := b.Schema().User() + schemaUser := box.MustNew(client).Schema().User() // Drop an existing user. username := "new_user" @@ -207,11 +193,7 @@ func ExampleSchemaUser_Password() { } // Create SchemaUser. - b, err := box.New(client) - if err != nil { - log.Fatalf("Failed to connect: %s", err) - } - schemaUser := b.Schema().User() + schemaUser := box.MustNew(client).Schema().User() // Get the password hash. password := "my-password" @@ -240,11 +222,7 @@ func ExampleSchemaUser_Info() { } // Create SchemaUser. - b, err := box.New(client) - if err != nil { - log.Fatalf("Failed to connect: %s", err) - } - schemaUser := b.Schema().User() + schemaUser := box.MustNew(client).Schema().User() info, err := schemaUser.Info(ctx, "test") if err != nil { diff --git a/box/session_test.go b/box/session_test.go index 8348dd11c..188360251 100644 --- a/box/session_test.go +++ b/box/session_test.go @@ -10,8 +10,7 @@ import ( ) func TestBox_Session(t *testing.T) { - b, err := box.New(th.Ptr(th.NewMockDoer(t))) - require.NoError(t, err) + b := box.MustNew(th.Ptr(th.NewMockDoer(t))) require.NotNil(t, b.Session()) } diff --git a/box/tarantool_test.go b/box/tarantool_test.go index 56092859d..ae47932d8 100644 --- a/box/tarantool_test.go +++ b/box/tarantool_test.go @@ -48,8 +48,7 @@ func TestBox_Sugar_Info(t *testing.T) { conn, err := tarantool.Connect(ctx, dialer, tarantool.Opts{}) require.NoError(t, err) - b, err := box.New(conn) - require.NoError(t, err) + b := box.MustNew(conn) info, err := b.Info() require.NoError(t, err) @@ -73,10 +72,6 @@ func TestBox_Info(t *testing.T) { validateInfo(t, resp.Info) } -func TestBox_Connection_NotNil(t *testing.T) { - -} - func TestBox_Sugar_Schema_UserCreate_NoError(t *testing.T) { const ( username = "user_create_no_error" @@ -90,8 +85,7 @@ func TestBox_Sugar_Schema_UserCreate_NoError(t *testing.T) { conn, err := tarantool.Connect(ctx, dialer, tarantool.Opts{}) require.NoError(t, err) - b, err := box.New(conn) - require.NoError(t, err) + b := box.MustNew(conn) // Create new user. err = b.Schema().User().Create(ctx, username, box.UserCreateOptions{Password: password}) @@ -111,8 +105,7 @@ func TestBox_Sugar_Schema_UserCreate_CanConnectWithNewCred(t *testing.T) { conn, err := tarantool.Connect(ctx, dialer, tarantool.Opts{}) require.NoError(t, err) - b, err := box.New(conn) - require.NoError(t, err) + b := box.MustNew(conn) // Create new user. err = b.Schema().User().Create(ctx, username, box.UserCreateOptions{Password: password}) @@ -146,8 +139,7 @@ func TestBox_Sugar_Schema_UserCreate_AlreadyExists(t *testing.T) { conn, err := tarantool.Connect(ctx, dialer, tarantool.Opts{}) require.NoError(t, err) - b, err := box.New(conn) - require.NoError(t, err) + b := box.MustNew(conn) // Create new user. err = b.Schema().User().Create(ctx, username, box.UserCreateOptions{Password: password}) @@ -177,8 +169,7 @@ func TestBox_Sugar_Schema_UserCreate_ExistsTrue(t *testing.T) { conn, err := tarantool.Connect(ctx, dialer, tarantool.Opts{}) require.NoError(t, err) - b, err := box.New(conn) - require.NoError(t, err) + b := box.MustNew(conn) // Create new user. err = b.Schema().User().Create(ctx, username, box.UserCreateOptions{Password: password}) @@ -204,8 +195,7 @@ func TestBox_Sugar_Schema_UserCreate_IfNotExistsNoErr(t *testing.T) { conn, err := tarantool.Connect(ctx, dialer, tarantool.Opts{}) require.NoError(t, err) - b, err := box.New(conn) - require.NoError(t, err) + b := box.MustNew(conn) // Create new user. err = b.Schema().User().Create(ctx, username, box.UserCreateOptions{Password: password}) @@ -229,8 +219,7 @@ func TestBox_Sugar_Schema_UserPassword(t *testing.T) { conn, err := tarantool.Connect(ctx, dialer, tarantool.Opts{}) require.NoError(t, err) - b, err := box.New(conn) - require.NoError(t, err) + b := box.MustNew(conn) // Require password hash. hash, err := b.Schema().User().Password(ctx, password) @@ -249,8 +238,7 @@ func TestBox_Sugar_Schema_UserDrop_AfterCreate(t *testing.T) { conn, err := tarantool.Connect(ctx, dialer, tarantool.Opts{}) require.NoError(t, err) - b, err := box.New(conn) - require.NoError(t, err) + b := box.MustNew(conn) // Create new user err = b.Schema().User().Create(ctx, username, box.UserCreateOptions{Password: password}) @@ -272,8 +260,7 @@ func TestBox_Sugar_Schema_UserDrop_DoubleDrop(t *testing.T) { conn, err := tarantool.Connect(ctx, dialer, tarantool.Opts{}) require.NoError(t, err) - b, err := box.New(conn) - require.NoError(t, err) + b := box.MustNew(conn) // Create new user err = b.Schema().User().Create(ctx, username, box.UserCreateOptions{Password: password}) @@ -301,8 +288,7 @@ func TestBox_Sugar_Schema_UserDrop_UnknownUser(t *testing.T) { conn, err := tarantool.Connect(ctx, dialer, tarantool.Opts{}) require.NoError(t, err) - b, err := box.New(conn) - require.NoError(t, err) + b := box.MustNew(conn) // Require error cause user not exists err = b.Schema().User().Drop(ctx, "some_strange_not_existing_name", box.UserDropOptions{}) @@ -321,8 +307,7 @@ func TestSchemaUser_Passwd_NotFound(t *testing.T) { conn, err := tarantool.Connect(ctx, dialer, tarantool.Opts{}) require.NoError(t, err) - b, err := box.New(conn) - require.NoError(t, err) + b := box.MustNew(conn) err = b.Schema().User().Passwd(ctx, "not-exists-passwd", "new_password") require.Error(t, err) @@ -346,8 +331,7 @@ func TestSchemaUser_Passwd_Ok(t *testing.T) { conn, err := tarantool.Connect(ctx, dialer, tarantool.Opts{}) require.NoError(t, err) - b, err := box.New(conn) - require.NoError(t, err) + b := box.MustNew(conn) // New user change password and connect @@ -385,8 +369,7 @@ func TestSchemaUser_Passwd_WithoutGrants(t *testing.T) { conn, err := tarantool.Connect(ctx, dialer, tarantool.Opts{}) require.NoError(t, err) - b, err := box.New(conn) - require.NoError(t, err) + b := box.MustNew(conn) err = b.Schema().User().Create(ctx, username, box.UserCreateOptions{Password: startPassword, IfNotExists: true}) @@ -400,8 +383,8 @@ func TestSchemaUser_Passwd_WithoutGrants(t *testing.T) { require.NoError(t, err) require.NotNil(t, conn2Fail) - bFail, err := box.New(conn2Fail) - require.NoError(t, err) + bFail := box.MustNew(conn2Fail) + // can't change self user password without grants err = bFail.Schema().User().Passwd(ctx, endPassword) require.Error(t, err) @@ -421,8 +404,7 @@ func TestSchemaUser_Info_TestUserCorrect(t *testing.T) { conn, err := tarantool.Connect(ctx, dialer, tarantool.Opts{}) require.NoError(t, err) - b, err := box.New(conn) - require.NoError(t, err) + b := box.MustNew(conn) privileges, err := b.Schema().User().Info(ctx, dialer.User) require.NoError(t, err) @@ -439,8 +421,7 @@ func TestSchemaUser_Info_NonExistsUser(t *testing.T) { conn, err := tarantool.Connect(ctx, dialer, tarantool.Opts{}) require.NoError(t, err) - b, err := box.New(conn) - require.NoError(t, err) + b := box.MustNew(conn) privileges, err := b.Schema().User().Info(ctx, "non-existing") require.Error(t, err) @@ -460,8 +441,7 @@ func TestBox_Sugar_Schema_UserGrant_NoSu(t *testing.T) { conn, err := tarantool.Connect(ctx, dialer, tarantool.Opts{}) require.NoError(t, err) - b, err := box.New(conn) - require.NoError(t, err) + b := box.MustNew(conn) err = b.Schema().User().Create(ctx, username, box.UserCreateOptions{Password: password}) require.NoError(t, err) @@ -494,8 +474,7 @@ func TestBox_Sugar_Schema_UserGrant_WithSu(t *testing.T) { conn, err := tarantool.Connect(ctx, dialer, tarantool.Opts{}) require.NoError(t, err) - b, err := box.New(conn) - require.NoError(t, err) + b := box.MustNew(conn) err = b.Schema().User().Create(ctx, username, box.UserCreateOptions{Password: password}) require.NoError(t, err) @@ -545,8 +524,7 @@ func TestSchemaUser_Revoke_WithoutSu(t *testing.T) { conn, err := tarantool.Connect(ctx, dialer, tarantool.Opts{}) require.NoError(t, err) - b, err := box.New(conn) - require.NoError(t, err) + b := box.MustNew(conn) err = b.Schema().User().Create(ctx, username, box.UserCreateOptions{Password: password}) require.NoError(t, err) @@ -580,8 +558,7 @@ func TestSchemaUser_Revoke_WithSu(t *testing.T) { conn, err := tarantool.Connect(ctx, dialer, tarantool.Opts{}) require.NoError(t, err) - b, err := box.New(conn) - require.NoError(t, err) + b := box.MustNew(conn) err = b.Schema().User().Create(ctx, username, box.UserCreateOptions{Password: password}) require.NoError(t, err) @@ -629,8 +606,7 @@ func TestSchemaUser_Revoke_NonExistsPermission(t *testing.T) { conn, err := tarantool.Connect(ctx, dialer, tarantool.Opts{}) require.NoError(t, err) - b, err := box.New(conn) - require.NoError(t, err) + b := box.MustNew(conn) err = b.Schema().User().Create(ctx, username, box.UserCreateOptions{Password: password}) require.NoError(t, err) @@ -666,8 +642,7 @@ func TestSession_Su_AdminPermissions(t *testing.T) { conn, err := tarantool.Connect(ctx, dialer, tarantool.Opts{}) require.NoError(t, err) - b, err := box.New(conn) - require.NoError(t, err) + b := box.MustNew(conn) err = b.Session().Su(ctx, "admin") require.NoError(t, err) @@ -680,10 +655,7 @@ func cleanupUser(username string) { log.Fatal(err) } - b, err := box.New(conn) - if err != nil { - log.Fatal(err) - } + b := box.MustNew(conn) err = b.Schema().User().Drop(ctx, username, box.UserDropOptions{}) if err != nil {