package pub import ( "context" "errors" "testing" permModel "perms-system-server/internal/model/perm" productModel "perms-system-server/internal/model/product" "perms-system-server/internal/testutil/mocks" "perms-system-server/internal/types" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "github.com/zeromicro/go-zero/core/stores/sqlx" "go.uber.org/mock/gomock" "golang.org/x/crypto/bcrypt" ) // TC-0048: 事务保护-中途失败回滚 func TestSyncPerms_Mock_TransactionRollbackOnBatchUpdateFail(t *testing.T) { ctrl := gomock.NewController(t) defer ctrl.Finish() dbErr := errors.New("batch update failed") hashedSecret, err := bcrypt.GenerateFromPassword([]byte("test_app_secret"), bcrypt.MinCost) require.NoError(t, err) mockProduct := mocks.NewMockSysProductModel(ctrl) mockProduct.EXPECT().FindOneByAppKey(gomock.Any(), "test_app_key"). Return(&productModel.SysProduct{ Id: 1, Code: "test_product", AppKey: "test_app_key", AppSecret: string(hashedSecret), Status: 1, }, nil) mockPerm := mocks.NewMockSysPermModel(ctrl) mockPerm.EXPECT().FindMapByProductCode(gomock.Any(), "test_product"). Return(map[string]*permModel.SysPerm{ "existing_code": { Id: 10, ProductCode: "test_product", Code: "existing_code", Name: "Old Name", Remark: "old remark", Status: 1, }, }, nil) mockPerm.EXPECT().TransactCtx(gomock.Any(), gomock.Any()). DoAndReturn(func(ctx context.Context, fn func(context.Context, sqlx.Session) error) error { return fn(ctx, nil) }) mockPerm.EXPECT().BatchInsertWithTx(gomock.Any(), nil, gomock.Any()).Return(nil) mockPerm.EXPECT().BatchUpdateWithTx(gomock.Any(), nil, gomock.Any()).Return(dbErr) svcCtx := mocks.NewMockServiceContext(mocks.MockModels{ Product: mockProduct, Perm: mockPerm, }) logic := NewSyncPermsLogic(context.Background(), svcCtx) resp, err := logic.SyncPerms(&types.SyncPermsReq{ AppKey: "test_app_key", AppSecret: "test_app_secret", Perms: []types.SyncPermItem{ {Code: "new_code", Name: "New Perm"}, {Code: "existing_code", Name: "Updated Name", Remark: "new remark"}, }, }) assert.Nil(t, resp) assert.Error(t, err) assert.Contains(t, err.Error(), "同步权限事务失败") }