sysRolePermModel_test.go 32 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089
  1. package roleperm
  2. import (
  3. "context"
  4. "errors"
  5. "math/rand"
  6. "sort"
  7. "testing"
  8. "time"
  9. "perms-system-server/internal/testutil"
  10. "github.com/go-sql-driver/mysql"
  11. "github.com/stretchr/testify/assert"
  12. "github.com/stretchr/testify/require"
  13. "github.com/zeromicro/go-zero/core/stores/sqlx"
  14. )
  15. func randRolePermId() int64 {
  16. return int64(900000 + rand.Intn(100000))
  17. }
  18. func sortedInt64Copy(a []int64) []int64 {
  19. b := append([]int64(nil), a...)
  20. sort.Slice(b, func(i, j int) bool { return b[i] < b[j] })
  21. return b
  22. }
  23. func int64SliceEqualIgnoreOrder(a, b []int64) bool {
  24. if len(a) != len(b) {
  25. return false
  26. }
  27. aa, bb := sortedInt64Copy(a), sortedInt64Copy(b)
  28. for i := range aa {
  29. if aa[i] != bb[i] {
  30. return false
  31. }
  32. }
  33. return true
  34. }
  35. // TC-0281: 正常插入
  36. func TestSysRolePermModel_CRUD(t *testing.T) {
  37. ctx := context.Background()
  38. conn := testutil.GetTestSqlConn()
  39. m := NewSysRolePermModel(conn, testutil.GetTestCacheConf(), testutil.GetTestCachePrefix())
  40. roleId := randRolePermId()
  41. permId := randRolePermId()
  42. ts := time.Now().Unix()
  43. data := &SysRolePerm{
  44. RoleId: roleId,
  45. PermId: permId,
  46. CreateTime: ts,
  47. UpdateTime: ts,
  48. }
  49. res, err := m.Insert(ctx, data)
  50. if err != nil {
  51. t.Fatalf("Insert: %v", err)
  52. }
  53. id, err := res.LastInsertId()
  54. if err != nil {
  55. t.Fatalf("LastInsertId: %v", err)
  56. }
  57. defer testutil.CleanTable(ctx, conn, "sys_role_perm", id)
  58. got, err := m.FindOne(ctx, id)
  59. if err != nil {
  60. t.Fatalf("FindOne: %v", err)
  61. }
  62. if got.RoleId != roleId || got.PermId != permId {
  63. t.Fatalf("FindOne mismatch: %+v", got)
  64. }
  65. byPair, err := m.FindOneByRoleIdPermId(ctx, roleId, permId)
  66. if err != nil {
  67. t.Fatalf("FindOneByRoleIdPermId: %v", err)
  68. }
  69. if byPair.Id != id {
  70. t.Fatalf("FindOneByRoleIdPermId id want %d got %d", id, byPair.Id)
  71. }
  72. newTs := ts + 1
  73. got.UpdateTime = newTs
  74. got.PermId = permId
  75. if err := m.Update(ctx, got); err != nil {
  76. t.Fatalf("Update: %v", err)
  77. }
  78. updated, err := m.FindOne(ctx, id)
  79. if err != nil {
  80. t.Fatalf("FindOne after update: %v", err)
  81. }
  82. if updated.UpdateTime != newTs {
  83. t.Fatalf("UpdateTime want %d got %d", newTs, updated.UpdateTime)
  84. }
  85. if err := m.Delete(ctx, id); err != nil {
  86. t.Fatalf("Delete: %v", err)
  87. }
  88. if _, err := m.FindOne(ctx, id); err != ErrNotFound {
  89. t.Fatalf("after Delete want ErrNotFound got %v", err)
  90. }
  91. }
  92. // TC-0424: 正常查询
  93. func TestSysRolePermModel_FindPermIdsByRoleId(t *testing.T) {
  94. ctx := context.Background()
  95. conn := testutil.GetTestSqlConn()
  96. m := NewSysRolePermModel(conn, testutil.GetTestCacheConf(), testutil.GetTestCachePrefix())
  97. roleId := randRolePermId()
  98. p1, p2 := randRolePermId(), randRolePermId()
  99. ts := time.Now().Unix()
  100. var ids []int64
  101. for _, permId := range []int64{p1, p2} {
  102. res, err := m.Insert(ctx, &SysRolePerm{RoleId: roleId, PermId: permId, CreateTime: ts, UpdateTime: ts})
  103. if err != nil {
  104. t.Fatalf("Insert: %v", err)
  105. }
  106. id, _ := res.LastInsertId()
  107. ids = append(ids, id)
  108. }
  109. defer func() {
  110. for _, id := range ids {
  111. testutil.CleanTable(ctx, conn, "sys_role_perm", id)
  112. }
  113. }()
  114. got, err := m.FindPermIdsByRoleId(ctx, roleId)
  115. if err != nil {
  116. t.Fatalf("FindPermIdsByRoleId: %v", err)
  117. }
  118. if !int64SliceEqualIgnoreOrder(got, []int64{p1, p2}) {
  119. t.Fatalf("FindPermIdsByRoleId got %v want %v", got, []int64{p1, p2})
  120. }
  121. }
  122. // TC-0426: 正常查询
  123. func TestSysRolePermModel_FindPermIdsByRoleIds(t *testing.T) {
  124. ctx := context.Background()
  125. conn := testutil.GetTestSqlConn()
  126. m := NewSysRolePermModel(conn, testutil.GetTestCacheConf(), testutil.GetTestCachePrefix())
  127. sharedPerm := randRolePermId()
  128. r1, r2 := randRolePermId(), randRolePermId()
  129. otherPerm := randRolePermId()
  130. ts := time.Now().Unix()
  131. rows := []struct {
  132. roleId, permId int64
  133. }{
  134. {r1, sharedPerm},
  135. {r2, sharedPerm},
  136. {r1, otherPerm},
  137. }
  138. var ids []int64
  139. for i, row := range rows {
  140. res, err := m.Insert(ctx, &SysRolePerm{
  141. Id: int64(910000000 + i),
  142. RoleId: row.roleId,
  143. PermId: row.permId,
  144. CreateTime: ts,
  145. UpdateTime: ts,
  146. })
  147. if err != nil {
  148. t.Fatalf("Insert: %v", err)
  149. }
  150. id, _ := res.LastInsertId()
  151. ids = append(ids, id)
  152. }
  153. defer func() {
  154. for _, id := range ids {
  155. testutil.CleanTable(ctx, conn, "sys_role_perm", id)
  156. }
  157. }()
  158. empty, err := m.FindPermIdsByRoleIds(ctx, nil)
  159. if err != nil {
  160. t.Fatalf("empty nil slice: %v", err)
  161. }
  162. if empty != nil {
  163. t.Fatalf("empty nil slice want nil got %#v", empty)
  164. }
  165. empty2, err := m.FindPermIdsByRoleIds(ctx, []int64{})
  166. if err != nil {
  167. t.Fatalf("empty slice: %v", err)
  168. }
  169. if empty2 != nil {
  170. t.Fatalf("empty slice want nil got %#v", empty2)
  171. }
  172. got, err := m.FindPermIdsByRoleIds(ctx, []int64{r1, r2})
  173. if err != nil {
  174. t.Fatalf("FindPermIdsByRoleIds: %v", err)
  175. }
  176. want := []int64{sharedPerm, otherPerm}
  177. if !int64SliceEqualIgnoreOrder(got, want) {
  178. t.Fatalf("FindPermIdsByRoleIds got %v want %v (distinct shared perm)", got, want)
  179. }
  180. }
  181. // TC-0429: 正常删除
  182. func TestSysRolePermModel_DeleteByRoleId(t *testing.T) {
  183. ctx := context.Background()
  184. conn := testutil.GetTestSqlConn()
  185. m := NewSysRolePermModel(conn, testutil.GetTestCacheConf(), testutil.GetTestCachePrefix())
  186. roleId := randRolePermId()
  187. keepRole := randRolePermId()
  188. permId := randRolePermId()
  189. ts := time.Now().Unix()
  190. res1, err := m.Insert(ctx, &SysRolePerm{RoleId: roleId, PermId: permId, CreateTime: ts, UpdateTime: ts})
  191. if err != nil {
  192. t.Fatalf("Insert: %v", err)
  193. }
  194. id1, _ := res1.LastInsertId()
  195. res2, err := m.Insert(ctx, &SysRolePerm{RoleId: keepRole, PermId: permId, CreateTime: ts, UpdateTime: ts})
  196. if err != nil {
  197. t.Fatalf("Insert: %v", err)
  198. }
  199. id2, _ := res2.LastInsertId()
  200. defer func() {
  201. testutil.CleanTable(ctx, conn, "sys_role_perm", id1, id2)
  202. }()
  203. if err := m.DeleteByRoleId(ctx, roleId); err != nil {
  204. t.Fatalf("DeleteByRoleId: %v", err)
  205. }
  206. if _, err := m.FindOne(ctx, id1); err != ErrNotFound {
  207. t.Fatalf("row1 should be deleted: %v", err)
  208. }
  209. if _, err := m.FindOne(ctx, id2); err != nil {
  210. t.Fatalf("row2 should remain: %v", err)
  211. }
  212. }
  213. // TC-0431: 正常事务内删除
  214. func TestSysRolePermModel_DeleteByRoleIdTx(t *testing.T) {
  215. ctx := context.Background()
  216. conn := testutil.GetTestSqlConn()
  217. m := NewSysRolePermModel(conn, testutil.GetTestCacheConf(), testutil.GetTestCachePrefix())
  218. roleId := randRolePermId()
  219. permId := randRolePermId()
  220. ts := time.Now().Unix()
  221. res, err := m.Insert(ctx, &SysRolePerm{RoleId: roleId, PermId: permId, CreateTime: ts, UpdateTime: ts})
  222. if err != nil {
  223. t.Fatalf("Insert: %v", err)
  224. }
  225. id, _ := res.LastInsertId()
  226. defer testutil.CleanTable(ctx, conn, "sys_role_perm", id)
  227. err = m.TransactCtx(ctx, func(c context.Context, session sqlx.Session) error {
  228. return m.DeleteByRoleIdTx(c, session, roleId)
  229. })
  230. if err != nil {
  231. t.Fatalf("TransactCtx DeleteByRoleIdTx: %v", err)
  232. }
  233. if _, err := m.FindOne(ctx, id); err != ErrNotFound {
  234. t.Fatalf("after tx delete want ErrNotFound got %v", err)
  235. }
  236. }
  237. // TC-0307: 多条记录(3条)
  238. func TestSysRolePermModel_BatchInsert(t *testing.T) {
  239. ctx := context.Background()
  240. conn := testutil.GetTestSqlConn()
  241. m := NewSysRolePermModel(conn, testutil.GetTestCacheConf(), testutil.GetTestCachePrefix())
  242. roleId := randRolePermId()
  243. p1, p2 := randRolePermId(), randRolePermId()
  244. ts := time.Now().Unix()
  245. list := []*SysRolePerm{
  246. {Id: 920000001, RoleId: roleId, PermId: p1, CreateTime: ts, UpdateTime: ts},
  247. {Id: 920000002, RoleId: roleId, PermId: p2, CreateTime: ts, UpdateTime: ts},
  248. }
  249. if err := m.BatchInsert(ctx, list); err != nil {
  250. t.Fatalf("BatchInsert: %v", err)
  251. }
  252. got, err := m.FindPermIdsByRoleId(ctx, roleId)
  253. if err != nil {
  254. t.Fatalf("FindPermIdsByRoleId: %v", err)
  255. }
  256. if !int64SliceEqualIgnoreOrder(got, []int64{p1, p2}) {
  257. t.Fatalf("got %v want %v", got, []int64{p1, p2})
  258. }
  259. var rows []struct {
  260. Id int64 `db:"id"`
  261. }
  262. q := "SELECT `id` FROM `sys_role_perm` WHERE `roleId` = ? ORDER BY `id`"
  263. if err := conn.QueryRowsCtx(ctx, &rows, q, roleId); err != nil {
  264. t.Fatalf("query ids: %v", err)
  265. }
  266. defer func() {
  267. for _, r := range rows {
  268. testutil.CleanTable(ctx, conn, "sys_role_perm", r.Id)
  269. }
  270. }()
  271. if len(rows) != 2 {
  272. t.Fatalf("want 2 rows got %d", len(rows))
  273. }
  274. }
  275. // TC-0290: 记录不存在
  276. func TestSysRolePermModel_FindOne_NotFound(t *testing.T) {
  277. conn := testutil.GetTestSqlConn()
  278. m := NewSysRolePermModel(conn, testutil.GetTestCacheConf(), testutil.GetTestCachePrefix())
  279. _, err := m.FindOne(context.Background(), 999999999999)
  280. if err != ErrNotFound {
  281. t.Fatalf("want ErrNotFound got %v", err)
  282. }
  283. }
  284. // TC-0351: FindOneByRoleIdPermId
  285. func TestSysRolePermModel_FindOneByRoleIdPermId_NotFound(t *testing.T) {
  286. conn := testutil.GetTestSqlConn()
  287. m := NewSysRolePermModel(conn, testutil.GetTestCacheConf(), testutil.GetTestCachePrefix())
  288. _, err := m.FindOneByRoleIdPermId(context.Background(), 999999999, 999999999)
  289. if err != ErrNotFound {
  290. t.Fatalf("want ErrNotFound got %v", err)
  291. }
  292. }
  293. // TC-0425: 无绑定
  294. func TestSysRolePermModel_FindPermIdsByRoleId_Empty(t *testing.T) {
  295. conn := testutil.GetTestSqlConn()
  296. m := NewSysRolePermModel(conn, testutil.GetTestCacheConf(), testutil.GetTestCachePrefix())
  297. got, err := m.FindPermIdsByRoleId(context.Background(), 999999999)
  298. if err != nil {
  299. t.Fatalf("err: %v", err)
  300. }
  301. if len(got) != 0 {
  302. t.Fatalf("want empty got %v", got)
  303. }
  304. }
  305. // TC-0430: 无绑定
  306. func TestSysRolePermModel_DeleteByRoleId_NoRows(t *testing.T) {
  307. conn := testutil.GetTestSqlConn()
  308. m := NewSysRolePermModel(conn, testutil.GetTestCacheConf(), testutil.GetTestCachePrefix())
  309. if err := m.DeleteByRoleId(context.Background(), 999999999); err != nil {
  310. t.Fatalf("DeleteByRoleId on no rows: %v", err)
  311. }
  312. }
  313. // TC-0305: 空列表
  314. func TestSysRolePermModel_BatchInsert_Empty(t *testing.T) {
  315. conn := testutil.GetTestSqlConn()
  316. m := NewSysRolePermModel(conn, testutil.GetTestCacheConf(), testutil.GetTestCachePrefix())
  317. if err := m.BatchInsert(context.Background(), nil); err != nil {
  318. t.Fatalf("nil: %v", err)
  319. }
  320. if err := m.BatchInsert(context.Background(), []*SysRolePerm{}); err != nil {
  321. t.Fatalf("empty: %v", err)
  322. }
  323. }
  324. // TC-0324: 空ids
  325. func TestSysRolePermModel_BatchDelete_Empty(t *testing.T) {
  326. conn := testutil.GetTestSqlConn()
  327. m := NewSysRolePermModel(conn, testutil.GetTestCacheConf(), testutil.GetTestCachePrefix())
  328. if err := m.BatchDelete(context.Background(), nil); err != nil {
  329. t.Fatalf("nil: %v", err)
  330. }
  331. if err := m.BatchDelete(context.Background(), []int64{}); err != nil {
  332. t.Fatalf("empty: %v", err)
  333. }
  334. }
  335. // TC-0283: 唯一索引冲突
  336. func TestSysRolePermModel_Insert_UniqueConflict(t *testing.T) {
  337. ctx := context.Background()
  338. conn := testutil.GetTestSqlConn()
  339. m := NewSysRolePermModel(conn, testutil.GetTestCacheConf(), testutil.GetTestCachePrefix())
  340. roleId := randRolePermId()
  341. permId := randRolePermId()
  342. ts := time.Now().Unix()
  343. res, err := m.Insert(ctx, &SysRolePerm{RoleId: roleId, PermId: permId, CreateTime: ts, UpdateTime: ts})
  344. if err != nil {
  345. t.Fatalf("Insert: %v", err)
  346. }
  347. id, _ := res.LastInsertId()
  348. defer testutil.CleanTable(ctx, conn, "sys_role_perm", id)
  349. _, err = m.Insert(ctx, &SysRolePerm{RoleId: roleId, PermId: permId, CreateTime: ts, UpdateTime: ts})
  350. if err == nil {
  351. t.Fatal("second Insert want error")
  352. }
  353. var me *mysql.MySQLError
  354. if !errors.As(err, &me) || me.Number != 1062 {
  355. t.Fatalf("want duplicate key 1062, got %v", err)
  356. }
  357. }
  358. // TC-0285: 事务内插入
  359. func TestSysRolePermModel_InsertWithTx_Normal(t *testing.T) {
  360. ctx := context.Background()
  361. conn := testutil.GetTestSqlConn()
  362. m := NewSysRolePermModel(conn, testutil.GetTestCacheConf(), testutil.GetTestCachePrefix())
  363. roleId := randRolePermId()
  364. permId := randRolePermId()
  365. ts := time.Now().Unix()
  366. var insertedId int64
  367. err := m.TransactCtx(ctx, func(c context.Context, session sqlx.Session) error {
  368. res, err := m.InsertWithTx(c, session, &SysRolePerm{RoleId: roleId, PermId: permId, CreateTime: ts, UpdateTime: ts})
  369. if err != nil {
  370. return err
  371. }
  372. insertedId, _ = res.LastInsertId()
  373. return nil
  374. })
  375. if err != nil {
  376. t.Fatalf("TransactCtx: %v", err)
  377. }
  378. defer testutil.CleanTable(ctx, conn, "sys_role_perm", insertedId)
  379. got, err := m.FindOne(ctx, insertedId)
  380. if err != nil {
  381. t.Fatalf("FindOne: %v", err)
  382. }
  383. if got.RoleId != roleId || got.PermId != permId {
  384. t.Fatalf("mismatch: %+v", got)
  385. }
  386. }
  387. // TC-0287: 事务回滚后无数据
  388. func TestSysRolePermModel_InsertWithTx_Rollback(t *testing.T) {
  389. ctx := context.Background()
  390. conn := testutil.GetTestSqlConn()
  391. m := NewSysRolePermModel(conn, testutil.GetTestCacheConf(), testutil.GetTestCachePrefix())
  392. roleId := randRolePermId()
  393. permId := randRolePermId()
  394. ts := time.Now().Unix()
  395. err := m.TransactCtx(ctx, func(c context.Context, session sqlx.Session) error {
  396. _, err := m.InsertWithTx(c, session, &SysRolePerm{RoleId: roleId, PermId: permId, CreateTime: ts, UpdateTime: ts})
  397. if err != nil {
  398. return err
  399. }
  400. return errors.New("rollback")
  401. })
  402. if err == nil || err.Error() != "rollback" {
  403. t.Fatalf("want rollback error got %v", err)
  404. }
  405. _, err = m.FindOneByRoleIdPermId(ctx, roleId, permId)
  406. if err != ErrNotFound {
  407. t.Fatalf("after rollback want ErrNotFound got %v", err)
  408. }
  409. }
  410. // TC-0297: 记录不存在
  411. func TestSysRolePermModel_Update_NotFound(t *testing.T) {
  412. conn := testutil.GetTestSqlConn()
  413. m := NewSysRolePermModel(conn, testutil.GetTestCacheConf(), testutil.GetTestCachePrefix())
  414. ts := time.Now().Unix()
  415. err := m.Update(context.Background(), &SysRolePerm{
  416. Id: 999999999, RoleId: 1, PermId: 1, CreateTime: ts, UpdateTime: ts,
  417. })
  418. if err != ErrNotFound {
  419. t.Fatalf("want ErrNotFound got %v", err)
  420. }
  421. }
  422. // TC-0298: 事务内更新
  423. func TestSysRolePermModel_UpdateWithTx(t *testing.T) {
  424. ctx := context.Background()
  425. conn := testutil.GetTestSqlConn()
  426. m := NewSysRolePermModel(conn, testutil.GetTestCacheConf(), testutil.GetTestCachePrefix())
  427. roleId := randRolePermId()
  428. permId := randRolePermId()
  429. ts := time.Now().Unix()
  430. res, err := m.Insert(ctx, &SysRolePerm{RoleId: roleId, PermId: permId, CreateTime: ts, UpdateTime: ts})
  431. if err != nil {
  432. t.Fatalf("Insert: %v", err)
  433. }
  434. id, _ := res.LastInsertId()
  435. defer testutil.CleanTable(ctx, conn, "sys_role_perm", id)
  436. newTs := ts + 100
  437. err = m.TransactCtx(ctx, func(c context.Context, session sqlx.Session) error {
  438. return m.UpdateWithTx(c, session, &SysRolePerm{
  439. Id: id, RoleId: roleId, PermId: permId, CreateTime: ts, UpdateTime: newTs,
  440. })
  441. })
  442. if err != nil {
  443. t.Fatalf("UpdateWithTx: %v", err)
  444. }
  445. got, err := m.FindOne(ctx, id)
  446. if err != nil {
  447. t.Fatalf("FindOne: %v", err)
  448. }
  449. if got.UpdateTime != newTs {
  450. t.Fatalf("UpdateTime want %d got %d", newTs, got.UpdateTime)
  451. }
  452. }
  453. // TC-0300: 记录不存在
  454. func TestSysRolePermModel_Delete_NotFound(t *testing.T) {
  455. conn := testutil.GetTestSqlConn()
  456. m := NewSysRolePermModel(conn, testutil.GetTestCacheConf(), testutil.GetTestCachePrefix())
  457. err := m.Delete(context.Background(), 999999999)
  458. if err != ErrNotFound {
  459. t.Fatalf("want ErrNotFound got %v", err)
  460. }
  461. }
  462. // TC-0301: 事务内删除
  463. func TestSysRolePermModel_DeleteWithTx(t *testing.T) {
  464. ctx := context.Background()
  465. conn := testutil.GetTestSqlConn()
  466. m := NewSysRolePermModel(conn, testutil.GetTestCacheConf(), testutil.GetTestCachePrefix())
  467. roleId := randRolePermId()
  468. permId := randRolePermId()
  469. ts := time.Now().Unix()
  470. res, err := m.Insert(ctx, &SysRolePerm{RoleId: roleId, PermId: permId, CreateTime: ts, UpdateTime: ts})
  471. if err != nil {
  472. t.Fatalf("Insert: %v", err)
  473. }
  474. id, _ := res.LastInsertId()
  475. defer testutil.CleanTable(ctx, conn, "sys_role_perm", id)
  476. err = m.TransactCtx(ctx, func(c context.Context, session sqlx.Session) error {
  477. return m.DeleteWithTx(c, session, id)
  478. })
  479. if err != nil {
  480. t.Fatalf("DeleteWithTx: %v", err)
  481. }
  482. if _, err := m.FindOne(ctx, id); err != ErrNotFound {
  483. t.Fatalf("after DeleteWithTx want ErrNotFound got %v", err)
  484. }
  485. }
  486. // TC-0303: fn返回错误
  487. func TestSysRolePermModel_TransactCtx_Rollback(t *testing.T) {
  488. ctx := context.Background()
  489. conn := testutil.GetTestSqlConn()
  490. m := NewSysRolePermModel(conn, testutil.GetTestCacheConf(), testutil.GetTestCachePrefix())
  491. roleId := randRolePermId()
  492. permId := randRolePermId()
  493. ts := time.Now().Unix()
  494. res, err := m.Insert(ctx, &SysRolePerm{RoleId: roleId, PermId: permId, CreateTime: ts, UpdateTime: ts})
  495. if err != nil {
  496. t.Fatalf("Insert: %v", err)
  497. }
  498. id, _ := res.LastInsertId()
  499. defer testutil.CleanTable(ctx, conn, "sys_role_perm", id)
  500. err = m.TransactCtx(ctx, func(c context.Context, session sqlx.Session) error {
  501. if err := m.DeleteWithTx(c, session, id); err != nil {
  502. return err
  503. }
  504. return errors.New("rollback")
  505. })
  506. if err == nil || err.Error() != "rollback" {
  507. t.Fatalf("want rollback error got %v", err)
  508. }
  509. got, err := m.FindOne(ctx, id)
  510. if err != nil {
  511. t.Fatalf("after rollback FindOne: %v", err)
  512. }
  513. if got.Id != id {
  514. t.Fatalf("row should still exist")
  515. }
  516. }
  517. // TC-0304: 获取表名
  518. func TestSysRolePermModel_TableName(t *testing.T) {
  519. conn := testutil.GetTestSqlConn()
  520. m := NewSysRolePermModel(conn, testutil.GetTestCacheConf(), testutil.GetTestCachePrefix())
  521. if m.TableName() != "`sys_role_perm`" {
  522. t.Fatalf("want `sys_role_perm` got %s", m.TableName())
  523. }
  524. }
  525. // TC-0306: 单条记录
  526. func TestSysRolePermModel_BatchInsert_Single(t *testing.T) {
  527. ctx := context.Background()
  528. conn := testutil.GetTestSqlConn()
  529. m := NewSysRolePermModel(conn, testutil.GetTestCacheConf(), testutil.GetTestCachePrefix())
  530. roleId := randRolePermId()
  531. permId := randRolePermId()
  532. ts := time.Now().Unix()
  533. if err := m.BatchInsert(ctx, []*SysRolePerm{
  534. {RoleId: roleId, PermId: permId, CreateTime: ts, UpdateTime: ts},
  535. }); err != nil {
  536. t.Fatalf("BatchInsert: %v", err)
  537. }
  538. got, err := m.FindOneByRoleIdPermId(ctx, roleId, permId)
  539. if err != nil {
  540. t.Fatalf("FindOneByRoleIdPermId: %v", err)
  541. }
  542. defer testutil.CleanTable(ctx, conn, "sys_role_perm", got.Id)
  543. if got.RoleId != roleId || got.PermId != permId {
  544. t.Fatalf("mismatch: %+v", got)
  545. }
  546. }
  547. // TC-0309: 唯一索引冲突
  548. func TestSysRolePermModel_BatchInsert_UniqueConflict(t *testing.T) {
  549. ctx := context.Background()
  550. conn := testutil.GetTestSqlConn()
  551. m := NewSysRolePermModel(conn, testutil.GetTestCacheConf(), testutil.GetTestCachePrefix())
  552. roleId := randRolePermId()
  553. permId := randRolePermId()
  554. ts := time.Now().Unix()
  555. err := m.BatchInsert(ctx, []*SysRolePerm{
  556. {RoleId: roleId, PermId: permId, CreateTime: ts, UpdateTime: ts},
  557. {RoleId: roleId, PermId: permId, CreateTime: ts, UpdateTime: ts},
  558. })
  559. if err == nil {
  560. t.Fatal("want error for duplicate")
  561. }
  562. var me *mysql.MySQLError
  563. if !errors.As(err, &me) || me.Number != 1062 {
  564. t.Fatalf("want duplicate key 1062, got %v", err)
  565. }
  566. }
  567. // TC-0314: 空列表
  568. func TestSysRolePermModel_BatchUpdate_Empty(t *testing.T) {
  569. conn := testutil.GetTestSqlConn()
  570. m := NewSysRolePermModel(conn, testutil.GetTestCacheConf(), testutil.GetTestCachePrefix())
  571. if err := m.BatchUpdate(context.Background(), nil); err != nil {
  572. t.Fatalf("nil: %v", err)
  573. }
  574. if err := m.BatchUpdate(context.Background(), []*SysRolePerm{}); err != nil {
  575. t.Fatalf("empty: %v", err)
  576. }
  577. }
  578. // TC-0316: 多条记录(3条)
  579. func TestSysRolePermModel_BatchUpdate_Multi(t *testing.T) {
  580. ctx := context.Background()
  581. conn := testutil.GetTestSqlConn()
  582. m := NewSysRolePermModel(conn, testutil.GetTestCacheConf(), testutil.GetTestCachePrefix())
  583. roleId := randRolePermId()
  584. p1, p2 := randRolePermId(), randRolePermId()
  585. ts := time.Now().Unix()
  586. res1, err := m.Insert(ctx, &SysRolePerm{RoleId: roleId, PermId: p1, CreateTime: ts, UpdateTime: ts})
  587. if err != nil {
  588. t.Fatalf("Insert1: %v", err)
  589. }
  590. id1, _ := res1.LastInsertId()
  591. res2, err := m.Insert(ctx, &SysRolePerm{RoleId: roleId, PermId: p2, CreateTime: ts, UpdateTime: ts})
  592. if err != nil {
  593. t.Fatalf("Insert2: %v", err)
  594. }
  595. id2, _ := res2.LastInsertId()
  596. defer testutil.CleanTable(ctx, conn, "sys_role_perm", id1, id2)
  597. newTs := ts + 100
  598. newP1, newP2 := randRolePermId(), randRolePermId()
  599. err = m.BatchUpdate(ctx, []*SysRolePerm{
  600. {Id: id1, RoleId: roleId, PermId: newP1, CreateTime: ts, UpdateTime: newTs},
  601. {Id: id2, RoleId: roleId, PermId: newP2, CreateTime: ts, UpdateTime: newTs},
  602. })
  603. if err != nil {
  604. t.Fatalf("BatchUpdate: %v", err)
  605. }
  606. got1, err := m.FindOne(ctx, id1)
  607. if err != nil {
  608. t.Fatalf("FindOne1: %v", err)
  609. }
  610. if got1.UpdateTime != newTs || got1.PermId != newP1 {
  611. t.Fatalf("got1 mismatch: %+v", got1)
  612. }
  613. got2, err := m.FindOne(ctx, id2)
  614. if err != nil {
  615. t.Fatalf("FindOne2: %v", err)
  616. }
  617. if got2.UpdateTime != newTs || got2.PermId != newP2 {
  618. t.Fatalf("got2 mismatch: %+v", got2)
  619. }
  620. }
  621. // TC-0326: 多个id(3个)
  622. func TestSysRolePermModel_BatchDelete_Multi(t *testing.T) {
  623. ctx := context.Background()
  624. conn := testutil.GetTestSqlConn()
  625. m := NewSysRolePermModel(conn, testutil.GetTestCacheConf(), testutil.GetTestCachePrefix())
  626. roleId := randRolePermId()
  627. p1, p2, p3 := randRolePermId(), randRolePermId(), randRolePermId()
  628. ts := time.Now().Unix()
  629. var ids []int64
  630. for _, permId := range []int64{p1, p2, p3} {
  631. res, err := m.Insert(ctx, &SysRolePerm{RoleId: roleId, PermId: permId, CreateTime: ts, UpdateTime: ts})
  632. if err != nil {
  633. t.Fatalf("Insert: %v", err)
  634. }
  635. id, _ := res.LastInsertId()
  636. ids = append(ids, id)
  637. }
  638. defer func() {
  639. for _, id := range ids {
  640. testutil.CleanTable(ctx, conn, "sys_role_perm", id)
  641. }
  642. }()
  643. if err := m.BatchDelete(ctx, ids); err != nil {
  644. t.Fatalf("BatchDelete: %v", err)
  645. }
  646. for _, id := range ids {
  647. if _, err := m.FindOne(ctx, id); err != ErrNotFound {
  648. t.Fatalf("id %d should be deleted: %v", id, err)
  649. }
  650. }
  651. }
  652. // TC-0325: 单个id
  653. func TestSysRolePermModel_BatchDelete_Single(t *testing.T) {
  654. ctx := context.Background()
  655. conn := testutil.GetTestSqlConn()
  656. m := NewSysRolePermModel(conn, testutil.GetTestCacheConf(), testutil.GetTestCachePrefix())
  657. roleId := randRolePermId()
  658. permId := randRolePermId()
  659. ts := time.Now().Unix()
  660. res, err := m.Insert(ctx, &SysRolePerm{RoleId: roleId, PermId: permId, CreateTime: ts, UpdateTime: ts})
  661. if err != nil {
  662. t.Fatalf("Insert: %v", err)
  663. }
  664. id, _ := res.LastInsertId()
  665. defer testutil.CleanTable(ctx, conn, "sys_role_perm", id)
  666. if err := m.BatchDelete(ctx, []int64{id}); err != nil {
  667. t.Fatalf("BatchDelete: %v", err)
  668. }
  669. if _, err := m.FindOne(ctx, id); err != ErrNotFound {
  670. t.Fatalf("want ErrNotFound got %v", err)
  671. }
  672. }
  673. // TC-0327: 包含不存在id
  674. func TestSysRolePermModel_BatchDelete_ContainsNonExist(t *testing.T) {
  675. ctx := context.Background()
  676. conn := testutil.GetTestSqlConn()
  677. m := NewSysRolePermModel(conn, testutil.GetTestCacheConf(), testutil.GetTestCachePrefix())
  678. roleId := randRolePermId()
  679. permId := randRolePermId()
  680. ts := time.Now().Unix()
  681. res, err := m.Insert(ctx, &SysRolePerm{RoleId: roleId, PermId: permId, CreateTime: ts, UpdateTime: ts})
  682. if err != nil {
  683. t.Fatalf("Insert: %v", err)
  684. }
  685. id, _ := res.LastInsertId()
  686. defer testutil.CleanTable(ctx, conn, "sys_role_perm", id)
  687. if err := m.BatchDelete(ctx, []int64{id, 999999999}); err != nil {
  688. t.Fatalf("BatchDelete: %v", err)
  689. }
  690. if _, err := m.FindOne(ctx, id); err != ErrNotFound {
  691. t.Fatalf("want ErrNotFound got %v", err)
  692. }
  693. }
  694. // TC-0312: 正常多条
  695. func TestSysRolePermModel_BatchInsertWithTx_Normal(t *testing.T) {
  696. ctx := context.Background()
  697. conn := testutil.GetTestSqlConn()
  698. m := NewSysRolePermModel(conn, testutil.GetTestCacheConf(), testutil.GetTestCachePrefix())
  699. roleId := randRolePermId()
  700. p1, p2 := randRolePermId(), randRolePermId()
  701. ts := time.Now().Unix()
  702. err := m.TransactCtx(ctx, func(c context.Context, session sqlx.Session) error {
  703. return m.BatchInsertWithTx(c, session, []*SysRolePerm{
  704. {RoleId: roleId, PermId: p1, CreateTime: ts, UpdateTime: ts},
  705. {RoleId: roleId, PermId: p2, CreateTime: ts, UpdateTime: ts},
  706. })
  707. })
  708. if err != nil {
  709. t.Fatalf("BatchInsertWithTx: %v", err)
  710. }
  711. got1, err := m.FindOneByRoleIdPermId(ctx, roleId, p1)
  712. if err != nil {
  713. t.Fatalf("FindOne p1: %v", err)
  714. }
  715. got2, err := m.FindOneByRoleIdPermId(ctx, roleId, p2)
  716. if err != nil {
  717. t.Fatalf("FindOne p2: %v", err)
  718. }
  719. defer testutil.CleanTable(ctx, conn, "sys_role_perm", got1.Id, got2.Id)
  720. }
  721. // TC-0311: 空列表
  722. func TestSysRolePermModel_BatchInsertWithTx_Empty(t *testing.T) {
  723. ctx := context.Background()
  724. conn := testutil.GetTestSqlConn()
  725. m := NewSysRolePermModel(conn, testutil.GetTestCacheConf(), testutil.GetTestCachePrefix())
  726. err := m.TransactCtx(ctx, func(c context.Context, session sqlx.Session) error {
  727. if err := m.BatchInsertWithTx(c, session, nil); err != nil {
  728. return err
  729. }
  730. return m.BatchInsertWithTx(c, session, []*SysRolePerm{})
  731. })
  732. if err != nil {
  733. t.Fatalf("BatchInsertWithTx empty: %v", err)
  734. }
  735. }
  736. // TC-0313: 事务回滚
  737. func TestSysRolePermModel_BatchInsertWithTx_Rollback(t *testing.T) {
  738. ctx := context.Background()
  739. conn := testutil.GetTestSqlConn()
  740. m := NewSysRolePermModel(conn, testutil.GetTestCacheConf(), testutil.GetTestCachePrefix())
  741. roleId := randRolePermId()
  742. p1 := randRolePermId()
  743. ts := time.Now().Unix()
  744. err := m.TransactCtx(ctx, func(c context.Context, session sqlx.Session) error {
  745. if err := m.BatchInsertWithTx(c, session, []*SysRolePerm{
  746. {RoleId: roleId, PermId: p1, CreateTime: ts, UpdateTime: ts},
  747. }); err != nil {
  748. return err
  749. }
  750. return errors.New("rollback")
  751. })
  752. if err == nil || err.Error() != "rollback" {
  753. t.Fatalf("want rollback error got %v", err)
  754. }
  755. _, err = m.FindOneByRoleIdPermId(ctx, roleId, p1)
  756. if err != ErrNotFound {
  757. t.Fatalf("after rollback want ErrNotFound got %v", err)
  758. }
  759. }
  760. // TC-0320: 正常多条
  761. func TestSysRolePermModel_BatchUpdateWithTx_Normal(t *testing.T) {
  762. ctx := context.Background()
  763. conn := testutil.GetTestSqlConn()
  764. m := NewSysRolePermModel(conn, testutil.GetTestCacheConf(), testutil.GetTestCachePrefix())
  765. roleId := randRolePermId()
  766. p1, p2 := randRolePermId(), randRolePermId()
  767. ts := time.Now().Unix()
  768. res1, err := m.Insert(ctx, &SysRolePerm{RoleId: roleId, PermId: p1, CreateTime: ts, UpdateTime: ts})
  769. if err != nil {
  770. t.Fatalf("Insert1: %v", err)
  771. }
  772. id1, _ := res1.LastInsertId()
  773. res2, err := m.Insert(ctx, &SysRolePerm{RoleId: roleId, PermId: p2, CreateTime: ts, UpdateTime: ts})
  774. if err != nil {
  775. t.Fatalf("Insert2: %v", err)
  776. }
  777. id2, _ := res2.LastInsertId()
  778. defer testutil.CleanTable(ctx, conn, "sys_role_perm", id1, id2)
  779. newTs := ts + 200
  780. err = m.TransactCtx(ctx, func(c context.Context, session sqlx.Session) error {
  781. return m.BatchUpdateWithTx(c, session, []*SysRolePerm{
  782. {Id: id1, RoleId: roleId, PermId: p1, CreateTime: ts, UpdateTime: newTs},
  783. {Id: id2, RoleId: roleId, PermId: p2, CreateTime: ts, UpdateTime: newTs},
  784. })
  785. })
  786. if err != nil {
  787. t.Fatalf("BatchUpdateWithTx: %v", err)
  788. }
  789. got1, err := m.FindOne(ctx, id1)
  790. if err != nil {
  791. t.Fatalf("FindOne1: %v", err)
  792. }
  793. if got1.UpdateTime != newTs {
  794. t.Fatalf("got1 UpdateTime want %d got %d", newTs, got1.UpdateTime)
  795. }
  796. }
  797. // TC-0319: 空列表
  798. func TestSysRolePermModel_BatchUpdateWithTx_Empty(t *testing.T) {
  799. ctx := context.Background()
  800. conn := testutil.GetTestSqlConn()
  801. m := NewSysRolePermModel(conn, testutil.GetTestCacheConf(), testutil.GetTestCachePrefix())
  802. err := m.TransactCtx(ctx, func(c context.Context, session sqlx.Session) error {
  803. if err := m.BatchUpdateWithTx(c, session, nil); err != nil {
  804. return err
  805. }
  806. return m.BatchUpdateWithTx(c, session, []*SysRolePerm{})
  807. })
  808. if err != nil {
  809. t.Fatalf("BatchUpdateWithTx empty: %v", err)
  810. }
  811. }
  812. // TC-0329: 正常多条
  813. func TestSysRolePermModel_BatchDeleteWithTx_Normal(t *testing.T) {
  814. ctx := context.Background()
  815. conn := testutil.GetTestSqlConn()
  816. m := NewSysRolePermModel(conn, testutil.GetTestCacheConf(), testutil.GetTestCachePrefix())
  817. roleId := randRolePermId()
  818. p1, p2 := randRolePermId(), randRolePermId()
  819. ts := time.Now().Unix()
  820. res1, err := m.Insert(ctx, &SysRolePerm{RoleId: roleId, PermId: p1, CreateTime: ts, UpdateTime: ts})
  821. if err != nil {
  822. t.Fatalf("Insert1: %v", err)
  823. }
  824. id1, _ := res1.LastInsertId()
  825. res2, err := m.Insert(ctx, &SysRolePerm{RoleId: roleId, PermId: p2, CreateTime: ts, UpdateTime: ts})
  826. if err != nil {
  827. t.Fatalf("Insert2: %v", err)
  828. }
  829. id2, _ := res2.LastInsertId()
  830. defer testutil.CleanTable(ctx, conn, "sys_role_perm", id1, id2)
  831. err = m.TransactCtx(ctx, func(c context.Context, session sqlx.Session) error {
  832. return m.BatchDeleteWithTx(c, session, []int64{id1, id2})
  833. })
  834. if err != nil {
  835. t.Fatalf("BatchDeleteWithTx: %v", err)
  836. }
  837. for _, id := range []int64{id1, id2} {
  838. if _, err := m.FindOne(ctx, id); err != ErrNotFound {
  839. t.Fatalf("id %d should be deleted: %v", id, err)
  840. }
  841. }
  842. }
  843. // TC-0328: 空ids
  844. func TestSysRolePermModel_BatchDeleteWithTx_Empty(t *testing.T) {
  845. ctx := context.Background()
  846. conn := testutil.GetTestSqlConn()
  847. m := NewSysRolePermModel(conn, testutil.GetTestCacheConf(), testutil.GetTestCachePrefix())
  848. err := m.TransactCtx(ctx, func(c context.Context, session sqlx.Session) error {
  849. if err := m.BatchDeleteWithTx(c, session, nil); err != nil {
  850. return err
  851. }
  852. return m.BatchDeleteWithTx(c, session, []int64{})
  853. })
  854. if err != nil {
  855. t.Fatalf("BatchDeleteWithTx empty: %v", err)
  856. }
  857. }
  858. // TC-0294: 事务内可见性
  859. func TestSysRolePermModel_FindOneWithTx_InsertThenFind(t *testing.T) {
  860. ctx := context.Background()
  861. conn := testutil.GetTestSqlConn()
  862. m := NewSysRolePermModel(conn, testutil.GetTestCacheConf(), testutil.GetTestCachePrefix())
  863. roleId := randRolePermId()
  864. permId := randRolePermId()
  865. ts := time.Now().Unix()
  866. var insertedId int64
  867. err := m.TransactCtx(ctx, func(c context.Context, session sqlx.Session) error {
  868. res, err := m.InsertWithTx(c, session, &SysRolePerm{RoleId: roleId, PermId: permId, CreateTime: ts, UpdateTime: ts})
  869. if err != nil {
  870. return err
  871. }
  872. insertedId, err = res.LastInsertId()
  873. if err != nil {
  874. return err
  875. }
  876. got, err := m.FindOneWithTx(c, session, insertedId)
  877. if err != nil {
  878. return err
  879. }
  880. assert.Equal(t, roleId, got.RoleId)
  881. assert.Equal(t, permId, got.PermId)
  882. return nil
  883. })
  884. require.NoError(t, err)
  885. defer testutil.CleanTable(ctx, conn, "sys_role_perm", insertedId)
  886. }
  887. // TC-0293: 事务内记录不存在
  888. func TestSysRolePermModel_FindOneWithTx_NotFound(t *testing.T) {
  889. ctx := context.Background()
  890. conn := testutil.GetTestSqlConn()
  891. m := NewSysRolePermModel(conn, testutil.GetTestCacheConf(), testutil.GetTestCachePrefix())
  892. err := m.TransactCtx(ctx, func(c context.Context, session sqlx.Session) error {
  893. _, err := m.FindOneWithTx(c, session, 999999999999)
  894. require.ErrorIs(t, err, ErrNotFound)
  895. return nil
  896. })
  897. require.NoError(t, err)
  898. }
  899. // TC-0352: FindOneByRoleIdPermIdWithTx
  900. func TestSysRolePermModel_FindOneByRoleIdPermIdWithTx_InsertThenFind(t *testing.T) {
  901. ctx := context.Background()
  902. conn := testutil.GetTestSqlConn()
  903. m := NewSysRolePermModel(conn, testutil.GetTestCacheConf(), testutil.GetTestCachePrefix())
  904. roleId := randRolePermId()
  905. permId := randRolePermId()
  906. ts := time.Now().Unix()
  907. var insertedId int64
  908. err := m.TransactCtx(ctx, func(c context.Context, session sqlx.Session) error {
  909. res, err := m.InsertWithTx(c, session, &SysRolePerm{RoleId: roleId, PermId: permId, CreateTime: ts, UpdateTime: ts})
  910. if err != nil {
  911. return err
  912. }
  913. insertedId, err = res.LastInsertId()
  914. if err != nil {
  915. return err
  916. }
  917. got, err := m.FindOneByRoleIdPermIdWithTx(c, session, roleId, permId)
  918. if err != nil {
  919. return err
  920. }
  921. assert.Equal(t, insertedId, got.Id)
  922. assert.Equal(t, roleId, got.RoleId)
  923. assert.Equal(t, permId, got.PermId)
  924. return nil
  925. })
  926. require.NoError(t, err)
  927. defer testutil.CleanTable(ctx, conn, "sys_role_perm", insertedId)
  928. }
  929. // TC-0353: FindOneByRoleIdPermIdWithTx
  930. func TestSysRolePermModel_FindOneByRoleIdPermIdWithTx_NotFound(t *testing.T) {
  931. ctx := context.Background()
  932. conn := testutil.GetTestSqlConn()
  933. m := NewSysRolePermModel(conn, testutil.GetTestCacheConf(), testutil.GetTestCachePrefix())
  934. err := m.TransactCtx(ctx, func(c context.Context, session sqlx.Session) error {
  935. _, err := m.FindOneByRoleIdPermIdWithTx(c, session, 999999999, 999999999)
  936. require.ErrorIs(t, err, ErrNotFound)
  937. return nil
  938. })
  939. require.NoError(t, err)
  940. }
  941. // TC-0428: FindPermIdsByRoleIds 去重验证
  942. func TestSysRolePermModel_FindPermIdsByRoleIds_Dedup(t *testing.T) {
  943. ctx := context.Background()
  944. conn := testutil.GetTestSqlConn()
  945. m := NewSysRolePermModel(conn, testutil.GetTestCacheConf(), testutil.GetTestCachePrefix())
  946. sharedPerm := randRolePermId()
  947. r1, r2 := randRolePermId(), randRolePermId()
  948. ts := time.Now().Unix()
  949. var ids []int64
  950. for _, row := range []struct{ roleId, permId int64 }{{r1, sharedPerm}, {r2, sharedPerm}} {
  951. res, err := m.Insert(ctx, &SysRolePerm{RoleId: row.roleId, PermId: row.permId, CreateTime: ts, UpdateTime: ts})
  952. require.NoError(t, err)
  953. id, _ := res.LastInsertId()
  954. ids = append(ids, id)
  955. }
  956. t.Cleanup(func() {
  957. for _, id := range ids {
  958. testutil.CleanTable(ctx, conn, "sys_role_perm", id)
  959. }
  960. })
  961. got, err := m.FindPermIdsByRoleIds(ctx, []int64{r1, r2})
  962. require.NoError(t, err)
  963. require.Len(t, got, 1)
  964. assert.Equal(t, sharedPerm, got[0])
  965. }