package user import ( "context" "testing" "github.com/DATA-DOG/go-sqlmock" "github.com/stretchr/testify/assert" "gorm.io/driver/mysql" "gorm.io/gorm" ) func setupMockDBForShipping(t *testing.T) (*gorm.DB, sqlmock.Sqlmock) { db, mock, err := sqlmock.New() if err != nil { t.Fatalf("an error '%s' was not expected when opening a stub database connection", err) } gormDB, err := gorm.Open(mysql.New(mysql.Config{ Conn: db, SkipInitializeWithVersion: true, }), &gorm.Config{}) if err != nil { t.Fatalf("an error '%s' was not expected when opening gorm database", err) } return gormDB, mock } func TestRequestShippings_EmptyInventoryIDs(t *testing.T) { db, _ := setupMockDBForShipping(t) svc := newTestService(db) // Empty inventory IDs should return failed with "invalid_params" _, _, _, _, failed, err := svc.RequestShippings(context.Background(), 1, []int64{}, nil) assert.NoError(t, err) assert.Len(t, failed, 1) assert.Equal(t, "invalid_params", failed[0].Reason) } func TestRequestShippings_AllZeroInventoryIDs(t *testing.T) { db, _ := setupMockDBForShipping(t) svc := newTestService(db) // All zero or negative IDs should be filtered, resulting in empty uniq list _, _, _, _, failed, err := svc.RequestShippings(context.Background(), 1, []int64{0, -1, 0}, nil) assert.NoError(t, err) assert.Len(t, failed, 1) assert.Equal(t, "invalid_params", failed[0].Reason) } func TestRequestShippings_NoDefaultAddress(t *testing.T) { db, mock := setupMockDBForShipping(t) svc := newTestService(db) // Mock default address query - return no rows mock.ExpectQuery("SELECT .* FROM `user_addresses`"). WillReturnRows(sqlmock.NewRows(nil)) // Mock all addresses query - return empty mock.ExpectQuery("SELECT .* FROM `user_addresses`"). WillReturnRows(sqlmock.NewRows(nil)) // With valid IDs but no address, should return no_default_address error _, _, _, _, failed, err := svc.RequestShippings(context.Background(), 1, []int64{1, 2}, nil) assert.NoError(t, err) assert.Len(t, failed, 1) assert.Equal(t, "no_default_address", failed[0].Reason) }