sysRolePermModel_test.go 31 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056
  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-0310: 正常插入
  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-0455: 正常查询
  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-0457: 正常查询
  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-0460: 正常事务内删除
  182. func TestSysRolePermModel_DeleteByRoleIdTx(t *testing.T) {
  183. ctx := context.Background()
  184. conn := testutil.GetTestSqlConn()
  185. m := NewSysRolePermModel(conn, testutil.GetTestCacheConf(), testutil.GetTestCachePrefix())
  186. roleId := randRolePermId()
  187. permId := randRolePermId()
  188. ts := time.Now().Unix()
  189. res, err := m.Insert(ctx, &SysRolePerm{RoleId: roleId, PermId: permId, CreateTime: ts, UpdateTime: ts})
  190. if err != nil {
  191. t.Fatalf("Insert: %v", err)
  192. }
  193. id, _ := res.LastInsertId()
  194. defer testutil.CleanTable(ctx, conn, "sys_role_perm", id)
  195. err = m.TransactCtx(ctx, func(c context.Context, session sqlx.Session) error {
  196. return m.DeleteByRoleIdTx(c, session, roleId)
  197. })
  198. if err != nil {
  199. t.Fatalf("TransactCtx DeleteByRoleIdTx: %v", err)
  200. }
  201. if _, err := m.FindOne(ctx, id); err != ErrNotFound {
  202. t.Fatalf("after tx delete want ErrNotFound got %v", err)
  203. }
  204. }
  205. // TC-0336: 多条记录(3条)
  206. func TestSysRolePermModel_BatchInsert(t *testing.T) {
  207. ctx := context.Background()
  208. conn := testutil.GetTestSqlConn()
  209. m := NewSysRolePermModel(conn, testutil.GetTestCacheConf(), testutil.GetTestCachePrefix())
  210. roleId := randRolePermId()
  211. p1, p2 := randRolePermId(), randRolePermId()
  212. ts := time.Now().Unix()
  213. list := []*SysRolePerm{
  214. {Id: 920000001, RoleId: roleId, PermId: p1, CreateTime: ts, UpdateTime: ts},
  215. {Id: 920000002, RoleId: roleId, PermId: p2, CreateTime: ts, UpdateTime: ts},
  216. }
  217. if err := m.BatchInsert(ctx, list); err != nil {
  218. t.Fatalf("BatchInsert: %v", err)
  219. }
  220. got, err := m.FindPermIdsByRoleId(ctx, roleId)
  221. if err != nil {
  222. t.Fatalf("FindPermIdsByRoleId: %v", err)
  223. }
  224. if !int64SliceEqualIgnoreOrder(got, []int64{p1, p2}) {
  225. t.Fatalf("got %v want %v", got, []int64{p1, p2})
  226. }
  227. var rows []struct {
  228. Id int64 `db:"id"`
  229. }
  230. q := "SELECT `id` FROM `sys_role_perm` WHERE `roleId` = ? ORDER BY `id`"
  231. if err := conn.QueryRowsCtx(ctx, &rows, q, roleId); err != nil {
  232. t.Fatalf("query ids: %v", err)
  233. }
  234. defer func() {
  235. for _, r := range rows {
  236. testutil.CleanTable(ctx, conn, "sys_role_perm", r.Id)
  237. }
  238. }()
  239. if len(rows) != 2 {
  240. t.Fatalf("want 2 rows got %d", len(rows))
  241. }
  242. }
  243. // TC-0319: 记录不存在
  244. func TestSysRolePermModel_FindOne_NotFound(t *testing.T) {
  245. conn := testutil.GetTestSqlConn()
  246. m := NewSysRolePermModel(conn, testutil.GetTestCacheConf(), testutil.GetTestCachePrefix())
  247. _, err := m.FindOne(context.Background(), 999999999999)
  248. if err != ErrNotFound {
  249. t.Fatalf("want ErrNotFound got %v", err)
  250. }
  251. }
  252. // TC-0380: FindOneByRoleIdPermId
  253. func TestSysRolePermModel_FindOneByRoleIdPermId_NotFound(t *testing.T) {
  254. conn := testutil.GetTestSqlConn()
  255. m := NewSysRolePermModel(conn, testutil.GetTestCacheConf(), testutil.GetTestCachePrefix())
  256. _, err := m.FindOneByRoleIdPermId(context.Background(), 999999999, 999999999)
  257. if err != ErrNotFound {
  258. t.Fatalf("want ErrNotFound got %v", err)
  259. }
  260. }
  261. // TC-0456: 无绑定
  262. func TestSysRolePermModel_FindPermIdsByRoleId_Empty(t *testing.T) {
  263. conn := testutil.GetTestSqlConn()
  264. m := NewSysRolePermModel(conn, testutil.GetTestCacheConf(), testutil.GetTestCachePrefix())
  265. got, err := m.FindPermIdsByRoleId(context.Background(), 999999999)
  266. if err != nil {
  267. t.Fatalf("err: %v", err)
  268. }
  269. if len(got) != 0 {
  270. t.Fatalf("want empty got %v", got)
  271. }
  272. }
  273. // TC-0461: 事务内无绑定
  274. func TestSysRolePermModel_DeleteByRoleIdTx_NoRows(t *testing.T) {
  275. conn := testutil.GetTestSqlConn()
  276. m := NewSysRolePermModel(conn, testutil.GetTestCacheConf(), testutil.GetTestCachePrefix())
  277. err := m.TransactCtx(context.Background(), func(c context.Context, session sqlx.Session) error {
  278. return m.DeleteByRoleIdTx(c, session, 999999999)
  279. })
  280. if err != nil {
  281. t.Fatalf("DeleteByRoleIdTx on no rows: %v", err)
  282. }
  283. }
  284. // TC-0334: 空列表
  285. func TestSysRolePermModel_BatchInsert_Empty(t *testing.T) {
  286. conn := testutil.GetTestSqlConn()
  287. m := NewSysRolePermModel(conn, testutil.GetTestCacheConf(), testutil.GetTestCachePrefix())
  288. if err := m.BatchInsert(context.Background(), nil); err != nil {
  289. t.Fatalf("nil: %v", err)
  290. }
  291. if err := m.BatchInsert(context.Background(), []*SysRolePerm{}); err != nil {
  292. t.Fatalf("empty: %v", err)
  293. }
  294. }
  295. // TC-0353: 空ids
  296. func TestSysRolePermModel_BatchDelete_Empty(t *testing.T) {
  297. conn := testutil.GetTestSqlConn()
  298. m := NewSysRolePermModel(conn, testutil.GetTestCacheConf(), testutil.GetTestCachePrefix())
  299. if err := m.BatchDelete(context.Background(), nil); err != nil {
  300. t.Fatalf("nil: %v", err)
  301. }
  302. if err := m.BatchDelete(context.Background(), []int64{}); err != nil {
  303. t.Fatalf("empty: %v", err)
  304. }
  305. }
  306. // TC-0312: 唯一索引冲突
  307. func TestSysRolePermModel_Insert_UniqueConflict(t *testing.T) {
  308. ctx := context.Background()
  309. conn := testutil.GetTestSqlConn()
  310. m := NewSysRolePermModel(conn, testutil.GetTestCacheConf(), testutil.GetTestCachePrefix())
  311. roleId := randRolePermId()
  312. permId := randRolePermId()
  313. ts := time.Now().Unix()
  314. res, err := m.Insert(ctx, &SysRolePerm{RoleId: roleId, PermId: permId, CreateTime: ts, UpdateTime: ts})
  315. if err != nil {
  316. t.Fatalf("Insert: %v", err)
  317. }
  318. id, _ := res.LastInsertId()
  319. defer testutil.CleanTable(ctx, conn, "sys_role_perm", id)
  320. _, err = m.Insert(ctx, &SysRolePerm{RoleId: roleId, PermId: permId, CreateTime: ts, UpdateTime: ts})
  321. if err == nil {
  322. t.Fatal("second Insert want error")
  323. }
  324. var me *mysql.MySQLError
  325. if !errors.As(err, &me) || me.Number != 1062 {
  326. t.Fatalf("want duplicate key 1062, got %v", err)
  327. }
  328. }
  329. // TC-0314: 事务内插入
  330. func TestSysRolePermModel_InsertWithTx_Normal(t *testing.T) {
  331. ctx := context.Background()
  332. conn := testutil.GetTestSqlConn()
  333. m := NewSysRolePermModel(conn, testutil.GetTestCacheConf(), testutil.GetTestCachePrefix())
  334. roleId := randRolePermId()
  335. permId := randRolePermId()
  336. ts := time.Now().Unix()
  337. var insertedId int64
  338. err := m.TransactCtx(ctx, func(c context.Context, session sqlx.Session) error {
  339. res, err := m.InsertWithTx(c, session, &SysRolePerm{RoleId: roleId, PermId: permId, CreateTime: ts, UpdateTime: ts})
  340. if err != nil {
  341. return err
  342. }
  343. insertedId, _ = res.LastInsertId()
  344. return nil
  345. })
  346. if err != nil {
  347. t.Fatalf("TransactCtx: %v", err)
  348. }
  349. defer testutil.CleanTable(ctx, conn, "sys_role_perm", insertedId)
  350. got, err := m.FindOne(ctx, insertedId)
  351. if err != nil {
  352. t.Fatalf("FindOne: %v", err)
  353. }
  354. if got.RoleId != roleId || got.PermId != permId {
  355. t.Fatalf("mismatch: %+v", got)
  356. }
  357. }
  358. // TC-0316: 事务回滚后无数据
  359. func TestSysRolePermModel_InsertWithTx_Rollback(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. err := m.TransactCtx(ctx, func(c context.Context, session sqlx.Session) error {
  367. _, err := m.InsertWithTx(c, session, &SysRolePerm{RoleId: roleId, PermId: permId, CreateTime: ts, UpdateTime: ts})
  368. if err != nil {
  369. return err
  370. }
  371. return errors.New("rollback")
  372. })
  373. if err == nil || err.Error() != "rollback" {
  374. t.Fatalf("want rollback error got %v", err)
  375. }
  376. _, err = m.FindOneByRoleIdPermId(ctx, roleId, permId)
  377. if err != ErrNotFound {
  378. t.Fatalf("after rollback want ErrNotFound got %v", err)
  379. }
  380. }
  381. // TC-0326: 记录不存在
  382. func TestSysRolePermModel_Update_NotFound(t *testing.T) {
  383. conn := testutil.GetTestSqlConn()
  384. m := NewSysRolePermModel(conn, testutil.GetTestCacheConf(), testutil.GetTestCachePrefix())
  385. ts := time.Now().Unix()
  386. err := m.Update(context.Background(), &SysRolePerm{
  387. Id: 999999999, RoleId: 1, PermId: 1, CreateTime: ts, UpdateTime: ts,
  388. })
  389. if err != ErrNotFound {
  390. t.Fatalf("want ErrNotFound got %v", err)
  391. }
  392. }
  393. // TC-0327: 事务内更新
  394. func TestSysRolePermModel_UpdateWithTx(t *testing.T) {
  395. ctx := context.Background()
  396. conn := testutil.GetTestSqlConn()
  397. m := NewSysRolePermModel(conn, testutil.GetTestCacheConf(), testutil.GetTestCachePrefix())
  398. roleId := randRolePermId()
  399. permId := randRolePermId()
  400. ts := time.Now().Unix()
  401. res, err := m.Insert(ctx, &SysRolePerm{RoleId: roleId, PermId: permId, CreateTime: ts, UpdateTime: ts})
  402. if err != nil {
  403. t.Fatalf("Insert: %v", err)
  404. }
  405. id, _ := res.LastInsertId()
  406. defer testutil.CleanTable(ctx, conn, "sys_role_perm", id)
  407. newTs := ts + 100
  408. err = m.TransactCtx(ctx, func(c context.Context, session sqlx.Session) error {
  409. return m.UpdateWithTx(c, session, &SysRolePerm{
  410. Id: id, RoleId: roleId, PermId: permId, CreateTime: ts, UpdateTime: newTs,
  411. })
  412. })
  413. if err != nil {
  414. t.Fatalf("UpdateWithTx: %v", err)
  415. }
  416. got, err := m.FindOne(ctx, id)
  417. if err != nil {
  418. t.Fatalf("FindOne: %v", err)
  419. }
  420. if got.UpdateTime != newTs {
  421. t.Fatalf("UpdateTime want %d got %d", newTs, got.UpdateTime)
  422. }
  423. }
  424. // TC-0329: 记录不存在
  425. func TestSysRolePermModel_Delete_NotFound(t *testing.T) {
  426. conn := testutil.GetTestSqlConn()
  427. m := NewSysRolePermModel(conn, testutil.GetTestCacheConf(), testutil.GetTestCachePrefix())
  428. err := m.Delete(context.Background(), 999999999)
  429. if err != ErrNotFound {
  430. t.Fatalf("want ErrNotFound got %v", err)
  431. }
  432. }
  433. // TC-0330: 事务内删除
  434. func TestSysRolePermModel_DeleteWithTx(t *testing.T) {
  435. ctx := context.Background()
  436. conn := testutil.GetTestSqlConn()
  437. m := NewSysRolePermModel(conn, testutil.GetTestCacheConf(), testutil.GetTestCachePrefix())
  438. roleId := randRolePermId()
  439. permId := randRolePermId()
  440. ts := time.Now().Unix()
  441. res, err := m.Insert(ctx, &SysRolePerm{RoleId: roleId, PermId: permId, CreateTime: ts, UpdateTime: ts})
  442. if err != nil {
  443. t.Fatalf("Insert: %v", err)
  444. }
  445. id, _ := res.LastInsertId()
  446. defer testutil.CleanTable(ctx, conn, "sys_role_perm", id)
  447. err = m.TransactCtx(ctx, func(c context.Context, session sqlx.Session) error {
  448. return m.DeleteWithTx(c, session, id)
  449. })
  450. if err != nil {
  451. t.Fatalf("DeleteWithTx: %v", err)
  452. }
  453. if _, err := m.FindOne(ctx, id); err != ErrNotFound {
  454. t.Fatalf("after DeleteWithTx want ErrNotFound got %v", err)
  455. }
  456. }
  457. // TC-0332: fn返回错误
  458. func TestSysRolePermModel_TransactCtx_Rollback(t *testing.T) {
  459. ctx := context.Background()
  460. conn := testutil.GetTestSqlConn()
  461. m := NewSysRolePermModel(conn, testutil.GetTestCacheConf(), testutil.GetTestCachePrefix())
  462. roleId := randRolePermId()
  463. permId := randRolePermId()
  464. ts := time.Now().Unix()
  465. res, err := m.Insert(ctx, &SysRolePerm{RoleId: roleId, PermId: permId, CreateTime: ts, UpdateTime: ts})
  466. if err != nil {
  467. t.Fatalf("Insert: %v", err)
  468. }
  469. id, _ := res.LastInsertId()
  470. defer testutil.CleanTable(ctx, conn, "sys_role_perm", id)
  471. err = m.TransactCtx(ctx, func(c context.Context, session sqlx.Session) error {
  472. if err := m.DeleteWithTx(c, session, id); err != nil {
  473. return err
  474. }
  475. return errors.New("rollback")
  476. })
  477. if err == nil || err.Error() != "rollback" {
  478. t.Fatalf("want rollback error got %v", err)
  479. }
  480. got, err := m.FindOne(ctx, id)
  481. if err != nil {
  482. t.Fatalf("after rollback FindOne: %v", err)
  483. }
  484. if got.Id != id {
  485. t.Fatalf("row should still exist")
  486. }
  487. }
  488. // TC-0333: 获取表名
  489. func TestSysRolePermModel_TableName(t *testing.T) {
  490. conn := testutil.GetTestSqlConn()
  491. m := NewSysRolePermModel(conn, testutil.GetTestCacheConf(), testutil.GetTestCachePrefix())
  492. if m.TableName() != "`sys_role_perm`" {
  493. t.Fatalf("want `sys_role_perm` got %s", m.TableName())
  494. }
  495. }
  496. // TC-0335: 单条记录
  497. func TestSysRolePermModel_BatchInsert_Single(t *testing.T) {
  498. ctx := context.Background()
  499. conn := testutil.GetTestSqlConn()
  500. m := NewSysRolePermModel(conn, testutil.GetTestCacheConf(), testutil.GetTestCachePrefix())
  501. roleId := randRolePermId()
  502. permId := randRolePermId()
  503. ts := time.Now().Unix()
  504. if err := m.BatchInsert(ctx, []*SysRolePerm{
  505. {RoleId: roleId, PermId: permId, CreateTime: ts, UpdateTime: ts},
  506. }); err != nil {
  507. t.Fatalf("BatchInsert: %v", err)
  508. }
  509. got, err := m.FindOneByRoleIdPermId(ctx, roleId, permId)
  510. if err != nil {
  511. t.Fatalf("FindOneByRoleIdPermId: %v", err)
  512. }
  513. defer testutil.CleanTable(ctx, conn, "sys_role_perm", got.Id)
  514. if got.RoleId != roleId || got.PermId != permId {
  515. t.Fatalf("mismatch: %+v", got)
  516. }
  517. }
  518. // TC-0338: 唯一索引冲突
  519. func TestSysRolePermModel_BatchInsert_UniqueConflict(t *testing.T) {
  520. ctx := context.Background()
  521. conn := testutil.GetTestSqlConn()
  522. m := NewSysRolePermModel(conn, testutil.GetTestCacheConf(), testutil.GetTestCachePrefix())
  523. roleId := randRolePermId()
  524. permId := randRolePermId()
  525. ts := time.Now().Unix()
  526. err := m.BatchInsert(ctx, []*SysRolePerm{
  527. {RoleId: roleId, PermId: permId, CreateTime: ts, UpdateTime: ts},
  528. {RoleId: roleId, PermId: permId, CreateTime: ts, UpdateTime: ts},
  529. })
  530. if err == nil {
  531. t.Fatal("want error for duplicate")
  532. }
  533. var me *mysql.MySQLError
  534. if !errors.As(err, &me) || me.Number != 1062 {
  535. t.Fatalf("want duplicate key 1062, got %v", err)
  536. }
  537. }
  538. // TC-0343: 空列表
  539. func TestSysRolePermModel_BatchUpdate_Empty(t *testing.T) {
  540. conn := testutil.GetTestSqlConn()
  541. m := NewSysRolePermModel(conn, testutil.GetTestCacheConf(), testutil.GetTestCachePrefix())
  542. if err := m.BatchUpdate(context.Background(), nil); err != nil {
  543. t.Fatalf("nil: %v", err)
  544. }
  545. if err := m.BatchUpdate(context.Background(), []*SysRolePerm{}); err != nil {
  546. t.Fatalf("empty: %v", err)
  547. }
  548. }
  549. // TC-0345: 多条记录(3条)
  550. func TestSysRolePermModel_BatchUpdate_Multi(t *testing.T) {
  551. ctx := context.Background()
  552. conn := testutil.GetTestSqlConn()
  553. m := NewSysRolePermModel(conn, testutil.GetTestCacheConf(), testutil.GetTestCachePrefix())
  554. roleId := randRolePermId()
  555. p1, p2 := randRolePermId(), randRolePermId()
  556. ts := time.Now().Unix()
  557. res1, err := m.Insert(ctx, &SysRolePerm{RoleId: roleId, PermId: p1, CreateTime: ts, UpdateTime: ts})
  558. if err != nil {
  559. t.Fatalf("Insert1: %v", err)
  560. }
  561. id1, _ := res1.LastInsertId()
  562. res2, err := m.Insert(ctx, &SysRolePerm{RoleId: roleId, PermId: p2, CreateTime: ts, UpdateTime: ts})
  563. if err != nil {
  564. t.Fatalf("Insert2: %v", err)
  565. }
  566. id2, _ := res2.LastInsertId()
  567. defer testutil.CleanTable(ctx, conn, "sys_role_perm", id1, id2)
  568. newTs := ts + 100
  569. newP1, newP2 := randRolePermId(), randRolePermId()
  570. err = m.BatchUpdate(ctx, []*SysRolePerm{
  571. {Id: id1, RoleId: roleId, PermId: newP1, CreateTime: ts, UpdateTime: newTs},
  572. {Id: id2, RoleId: roleId, PermId: newP2, CreateTime: ts, UpdateTime: newTs},
  573. })
  574. if err != nil {
  575. t.Fatalf("BatchUpdate: %v", err)
  576. }
  577. got1, err := m.FindOne(ctx, id1)
  578. if err != nil {
  579. t.Fatalf("FindOne1: %v", err)
  580. }
  581. if got1.UpdateTime != newTs || got1.PermId != newP1 {
  582. t.Fatalf("got1 mismatch: %+v", got1)
  583. }
  584. got2, err := m.FindOne(ctx, id2)
  585. if err != nil {
  586. t.Fatalf("FindOne2: %v", err)
  587. }
  588. if got2.UpdateTime != newTs || got2.PermId != newP2 {
  589. t.Fatalf("got2 mismatch: %+v", got2)
  590. }
  591. }
  592. // TC-0355: 多个id(3个)
  593. func TestSysRolePermModel_BatchDelete_Multi(t *testing.T) {
  594. ctx := context.Background()
  595. conn := testutil.GetTestSqlConn()
  596. m := NewSysRolePermModel(conn, testutil.GetTestCacheConf(), testutil.GetTestCachePrefix())
  597. roleId := randRolePermId()
  598. p1, p2, p3 := randRolePermId(), randRolePermId(), randRolePermId()
  599. ts := time.Now().Unix()
  600. var ids []int64
  601. for _, permId := range []int64{p1, p2, p3} {
  602. res, err := m.Insert(ctx, &SysRolePerm{RoleId: roleId, PermId: permId, CreateTime: ts, UpdateTime: ts})
  603. if err != nil {
  604. t.Fatalf("Insert: %v", err)
  605. }
  606. id, _ := res.LastInsertId()
  607. ids = append(ids, id)
  608. }
  609. defer func() {
  610. for _, id := range ids {
  611. testutil.CleanTable(ctx, conn, "sys_role_perm", id)
  612. }
  613. }()
  614. if err := m.BatchDelete(ctx, ids); err != nil {
  615. t.Fatalf("BatchDelete: %v", err)
  616. }
  617. for _, id := range ids {
  618. if _, err := m.FindOne(ctx, id); err != ErrNotFound {
  619. t.Fatalf("id %d should be deleted: %v", id, err)
  620. }
  621. }
  622. }
  623. // TC-0354: 单个id
  624. func TestSysRolePermModel_BatchDelete_Single(t *testing.T) {
  625. ctx := context.Background()
  626. conn := testutil.GetTestSqlConn()
  627. m := NewSysRolePermModel(conn, testutil.GetTestCacheConf(), testutil.GetTestCachePrefix())
  628. roleId := randRolePermId()
  629. permId := randRolePermId()
  630. ts := time.Now().Unix()
  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. defer testutil.CleanTable(ctx, conn, "sys_role_perm", id)
  637. if err := m.BatchDelete(ctx, []int64{id}); err != nil {
  638. t.Fatalf("BatchDelete: %v", err)
  639. }
  640. if _, err := m.FindOne(ctx, id); err != ErrNotFound {
  641. t.Fatalf("want ErrNotFound got %v", err)
  642. }
  643. }
  644. // TC-0356: 包含不存在id
  645. func TestSysRolePermModel_BatchDelete_ContainsNonExist(t *testing.T) {
  646. ctx := context.Background()
  647. conn := testutil.GetTestSqlConn()
  648. m := NewSysRolePermModel(conn, testutil.GetTestCacheConf(), testutil.GetTestCachePrefix())
  649. roleId := randRolePermId()
  650. permId := randRolePermId()
  651. ts := time.Now().Unix()
  652. res, err := m.Insert(ctx, &SysRolePerm{RoleId: roleId, PermId: permId, CreateTime: ts, UpdateTime: ts})
  653. if err != nil {
  654. t.Fatalf("Insert: %v", err)
  655. }
  656. id, _ := res.LastInsertId()
  657. defer testutil.CleanTable(ctx, conn, "sys_role_perm", id)
  658. if err := m.BatchDelete(ctx, []int64{id, 999999999}); err != nil {
  659. t.Fatalf("BatchDelete: %v", err)
  660. }
  661. if _, err := m.FindOne(ctx, id); err != ErrNotFound {
  662. t.Fatalf("want ErrNotFound got %v", err)
  663. }
  664. }
  665. // TC-0341: 正常多条
  666. func TestSysRolePermModel_BatchInsertWithTx_Normal(t *testing.T) {
  667. ctx := context.Background()
  668. conn := testutil.GetTestSqlConn()
  669. m := NewSysRolePermModel(conn, testutil.GetTestCacheConf(), testutil.GetTestCachePrefix())
  670. roleId := randRolePermId()
  671. p1, p2 := randRolePermId(), randRolePermId()
  672. ts := time.Now().Unix()
  673. err := m.TransactCtx(ctx, func(c context.Context, session sqlx.Session) error {
  674. return m.BatchInsertWithTx(c, session, []*SysRolePerm{
  675. {RoleId: roleId, PermId: p1, CreateTime: ts, UpdateTime: ts},
  676. {RoleId: roleId, PermId: p2, CreateTime: ts, UpdateTime: ts},
  677. })
  678. })
  679. if err != nil {
  680. t.Fatalf("BatchInsertWithTx: %v", err)
  681. }
  682. got1, err := m.FindOneByRoleIdPermId(ctx, roleId, p1)
  683. if err != nil {
  684. t.Fatalf("FindOne p1: %v", err)
  685. }
  686. got2, err := m.FindOneByRoleIdPermId(ctx, roleId, p2)
  687. if err != nil {
  688. t.Fatalf("FindOne p2: %v", err)
  689. }
  690. defer testutil.CleanTable(ctx, conn, "sys_role_perm", got1.Id, got2.Id)
  691. }
  692. // TC-0340: 空列表
  693. func TestSysRolePermModel_BatchInsertWithTx_Empty(t *testing.T) {
  694. ctx := context.Background()
  695. conn := testutil.GetTestSqlConn()
  696. m := NewSysRolePermModel(conn, testutil.GetTestCacheConf(), testutil.GetTestCachePrefix())
  697. err := m.TransactCtx(ctx, func(c context.Context, session sqlx.Session) error {
  698. if err := m.BatchInsertWithTx(c, session, nil); err != nil {
  699. return err
  700. }
  701. return m.BatchInsertWithTx(c, session, []*SysRolePerm{})
  702. })
  703. if err != nil {
  704. t.Fatalf("BatchInsertWithTx empty: %v", err)
  705. }
  706. }
  707. // TC-0342: 事务回滚
  708. func TestSysRolePermModel_BatchInsertWithTx_Rollback(t *testing.T) {
  709. ctx := context.Background()
  710. conn := testutil.GetTestSqlConn()
  711. m := NewSysRolePermModel(conn, testutil.GetTestCacheConf(), testutil.GetTestCachePrefix())
  712. roleId := randRolePermId()
  713. p1 := randRolePermId()
  714. ts := time.Now().Unix()
  715. err := m.TransactCtx(ctx, func(c context.Context, session sqlx.Session) error {
  716. if err := m.BatchInsertWithTx(c, session, []*SysRolePerm{
  717. {RoleId: roleId, PermId: p1, CreateTime: ts, UpdateTime: ts},
  718. }); err != nil {
  719. return err
  720. }
  721. return errors.New("rollback")
  722. })
  723. if err == nil || err.Error() != "rollback" {
  724. t.Fatalf("want rollback error got %v", err)
  725. }
  726. _, err = m.FindOneByRoleIdPermId(ctx, roleId, p1)
  727. if err != ErrNotFound {
  728. t.Fatalf("after rollback want ErrNotFound got %v", err)
  729. }
  730. }
  731. // TC-0349: 正常多条
  732. func TestSysRolePermModel_BatchUpdateWithTx_Normal(t *testing.T) {
  733. ctx := context.Background()
  734. conn := testutil.GetTestSqlConn()
  735. m := NewSysRolePermModel(conn, testutil.GetTestCacheConf(), testutil.GetTestCachePrefix())
  736. roleId := randRolePermId()
  737. p1, p2 := randRolePermId(), randRolePermId()
  738. ts := time.Now().Unix()
  739. res1, err := m.Insert(ctx, &SysRolePerm{RoleId: roleId, PermId: p1, CreateTime: ts, UpdateTime: ts})
  740. if err != nil {
  741. t.Fatalf("Insert1: %v", err)
  742. }
  743. id1, _ := res1.LastInsertId()
  744. res2, err := m.Insert(ctx, &SysRolePerm{RoleId: roleId, PermId: p2, CreateTime: ts, UpdateTime: ts})
  745. if err != nil {
  746. t.Fatalf("Insert2: %v", err)
  747. }
  748. id2, _ := res2.LastInsertId()
  749. defer testutil.CleanTable(ctx, conn, "sys_role_perm", id1, id2)
  750. newTs := ts + 200
  751. err = m.TransactCtx(ctx, func(c context.Context, session sqlx.Session) error {
  752. return m.BatchUpdateWithTx(c, session, []*SysRolePerm{
  753. {Id: id1, RoleId: roleId, PermId: p1, CreateTime: ts, UpdateTime: newTs},
  754. {Id: id2, RoleId: roleId, PermId: p2, CreateTime: ts, UpdateTime: newTs},
  755. })
  756. })
  757. if err != nil {
  758. t.Fatalf("BatchUpdateWithTx: %v", err)
  759. }
  760. got1, err := m.FindOne(ctx, id1)
  761. if err != nil {
  762. t.Fatalf("FindOne1: %v", err)
  763. }
  764. if got1.UpdateTime != newTs {
  765. t.Fatalf("got1 UpdateTime want %d got %d", newTs, got1.UpdateTime)
  766. }
  767. }
  768. // TC-0348: 空列表
  769. func TestSysRolePermModel_BatchUpdateWithTx_Empty(t *testing.T) {
  770. ctx := context.Background()
  771. conn := testutil.GetTestSqlConn()
  772. m := NewSysRolePermModel(conn, testutil.GetTestCacheConf(), testutil.GetTestCachePrefix())
  773. err := m.TransactCtx(ctx, func(c context.Context, session sqlx.Session) error {
  774. if err := m.BatchUpdateWithTx(c, session, nil); err != nil {
  775. return err
  776. }
  777. return m.BatchUpdateWithTx(c, session, []*SysRolePerm{})
  778. })
  779. if err != nil {
  780. t.Fatalf("BatchUpdateWithTx empty: %v", err)
  781. }
  782. }
  783. // TC-0358: 正常多条
  784. func TestSysRolePermModel_BatchDeleteWithTx_Normal(t *testing.T) {
  785. ctx := context.Background()
  786. conn := testutil.GetTestSqlConn()
  787. m := NewSysRolePermModel(conn, testutil.GetTestCacheConf(), testutil.GetTestCachePrefix())
  788. roleId := randRolePermId()
  789. p1, p2 := randRolePermId(), randRolePermId()
  790. ts := time.Now().Unix()
  791. res1, err := m.Insert(ctx, &SysRolePerm{RoleId: roleId, PermId: p1, CreateTime: ts, UpdateTime: ts})
  792. if err != nil {
  793. t.Fatalf("Insert1: %v", err)
  794. }
  795. id1, _ := res1.LastInsertId()
  796. res2, err := m.Insert(ctx, &SysRolePerm{RoleId: roleId, PermId: p2, CreateTime: ts, UpdateTime: ts})
  797. if err != nil {
  798. t.Fatalf("Insert2: %v", err)
  799. }
  800. id2, _ := res2.LastInsertId()
  801. defer testutil.CleanTable(ctx, conn, "sys_role_perm", id1, id2)
  802. err = m.TransactCtx(ctx, func(c context.Context, session sqlx.Session) error {
  803. return m.BatchDeleteWithTx(c, session, []int64{id1, id2})
  804. })
  805. if err != nil {
  806. t.Fatalf("BatchDeleteWithTx: %v", err)
  807. }
  808. for _, id := range []int64{id1, id2} {
  809. if _, err := m.FindOne(ctx, id); err != ErrNotFound {
  810. t.Fatalf("id %d should be deleted: %v", id, err)
  811. }
  812. }
  813. }
  814. // TC-0357: 空ids
  815. func TestSysRolePermModel_BatchDeleteWithTx_Empty(t *testing.T) {
  816. ctx := context.Background()
  817. conn := testutil.GetTestSqlConn()
  818. m := NewSysRolePermModel(conn, testutil.GetTestCacheConf(), testutil.GetTestCachePrefix())
  819. err := m.TransactCtx(ctx, func(c context.Context, session sqlx.Session) error {
  820. if err := m.BatchDeleteWithTx(c, session, nil); err != nil {
  821. return err
  822. }
  823. return m.BatchDeleteWithTx(c, session, []int64{})
  824. })
  825. if err != nil {
  826. t.Fatalf("BatchDeleteWithTx empty: %v", err)
  827. }
  828. }
  829. // TC-0323: 事务内可见性
  830. func TestSysRolePermModel_FindOneWithTx_InsertThenFind(t *testing.T) {
  831. ctx := context.Background()
  832. conn := testutil.GetTestSqlConn()
  833. m := NewSysRolePermModel(conn, testutil.GetTestCacheConf(), testutil.GetTestCachePrefix())
  834. roleId := randRolePermId()
  835. permId := randRolePermId()
  836. ts := time.Now().Unix()
  837. var insertedId int64
  838. err := m.TransactCtx(ctx, func(c context.Context, session sqlx.Session) error {
  839. res, err := m.InsertWithTx(c, session, &SysRolePerm{RoleId: roleId, PermId: permId, CreateTime: ts, UpdateTime: ts})
  840. if err != nil {
  841. return err
  842. }
  843. insertedId, err = res.LastInsertId()
  844. if err != nil {
  845. return err
  846. }
  847. got, err := m.FindOneWithTx(c, session, insertedId)
  848. if err != nil {
  849. return err
  850. }
  851. assert.Equal(t, roleId, got.RoleId)
  852. assert.Equal(t, permId, got.PermId)
  853. return nil
  854. })
  855. require.NoError(t, err)
  856. defer testutil.CleanTable(ctx, conn, "sys_role_perm", insertedId)
  857. }
  858. // TC-0322: 事务内记录不存在
  859. func TestSysRolePermModel_FindOneWithTx_NotFound(t *testing.T) {
  860. ctx := context.Background()
  861. conn := testutil.GetTestSqlConn()
  862. m := NewSysRolePermModel(conn, testutil.GetTestCacheConf(), testutil.GetTestCachePrefix())
  863. err := m.TransactCtx(ctx, func(c context.Context, session sqlx.Session) error {
  864. _, err := m.FindOneWithTx(c, session, 999999999999)
  865. require.ErrorIs(t, err, ErrNotFound)
  866. return nil
  867. })
  868. require.NoError(t, err)
  869. }
  870. // TC-0381: FindOneByRoleIdPermIdWithTx
  871. func TestSysRolePermModel_FindOneByRoleIdPermIdWithTx_InsertThenFind(t *testing.T) {
  872. ctx := context.Background()
  873. conn := testutil.GetTestSqlConn()
  874. m := NewSysRolePermModel(conn, testutil.GetTestCacheConf(), testutil.GetTestCachePrefix())
  875. roleId := randRolePermId()
  876. permId := randRolePermId()
  877. ts := time.Now().Unix()
  878. var insertedId int64
  879. err := m.TransactCtx(ctx, func(c context.Context, session sqlx.Session) error {
  880. res, err := m.InsertWithTx(c, session, &SysRolePerm{RoleId: roleId, PermId: permId, CreateTime: ts, UpdateTime: ts})
  881. if err != nil {
  882. return err
  883. }
  884. insertedId, err = res.LastInsertId()
  885. if err != nil {
  886. return err
  887. }
  888. got, err := m.FindOneByRoleIdPermIdWithTx(c, session, roleId, permId)
  889. if err != nil {
  890. return err
  891. }
  892. assert.Equal(t, insertedId, got.Id)
  893. assert.Equal(t, roleId, got.RoleId)
  894. assert.Equal(t, permId, got.PermId)
  895. return nil
  896. })
  897. require.NoError(t, err)
  898. defer testutil.CleanTable(ctx, conn, "sys_role_perm", insertedId)
  899. }
  900. // TC-0382: FindOneByRoleIdPermIdWithTx
  901. func TestSysRolePermModel_FindOneByRoleIdPermIdWithTx_NotFound(t *testing.T) {
  902. ctx := context.Background()
  903. conn := testutil.GetTestSqlConn()
  904. m := NewSysRolePermModel(conn, testutil.GetTestCacheConf(), testutil.GetTestCachePrefix())
  905. err := m.TransactCtx(ctx, func(c context.Context, session sqlx.Session) error {
  906. _, err := m.FindOneByRoleIdPermIdWithTx(c, session, 999999999, 999999999)
  907. require.ErrorIs(t, err, ErrNotFound)
  908. return nil
  909. })
  910. require.NoError(t, err)
  911. }
  912. // TC-0459: FindPermIdsByRoleIds 去重验证
  913. func TestSysRolePermModel_FindPermIdsByRoleIds_Dedup(t *testing.T) {
  914. ctx := context.Background()
  915. conn := testutil.GetTestSqlConn()
  916. m := NewSysRolePermModel(conn, testutil.GetTestCacheConf(), testutil.GetTestCachePrefix())
  917. sharedPerm := randRolePermId()
  918. r1, r2 := randRolePermId(), randRolePermId()
  919. ts := time.Now().Unix()
  920. var ids []int64
  921. for _, row := range []struct{ roleId, permId int64 }{{r1, sharedPerm}, {r2, sharedPerm}} {
  922. res, err := m.Insert(ctx, &SysRolePerm{RoleId: row.roleId, PermId: row.permId, CreateTime: ts, UpdateTime: ts})
  923. require.NoError(t, err)
  924. id, _ := res.LastInsertId()
  925. ids = append(ids, id)
  926. }
  927. t.Cleanup(func() {
  928. for _, id := range ids {
  929. testutil.CleanTable(ctx, conn, "sys_role_perm", id)
  930. }
  931. })
  932. got, err := m.FindPermIdsByRoleIds(ctx, []int64{r1, r2})
  933. require.NoError(t, err)
  934. require.Len(t, got, 1)
  935. assert.Equal(t, sharedPerm, got[0])
  936. }