sysUserPermModel_test.go 35 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132
  1. package userperm
  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 randUserPermId() 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. func insertTestPerm(t *testing.T, ctx context.Context, conn sqlx.SqlConn, productCode, code string) int64 {
  36. t.Helper()
  37. ts := time.Now().Unix()
  38. q := "INSERT INTO `sys_perm` (`productCode`, `name`, `code`, `status`, `createTime`, `updateTime`) VALUES (?, ?, ?, 1, ?, ?)"
  39. res, err := conn.ExecCtx(ctx, q, productCode, "t", code, ts, ts)
  40. if err != nil {
  41. t.Fatalf("insert sys_perm: %v", err)
  42. }
  43. id, err := res.LastInsertId()
  44. if err != nil {
  45. t.Fatalf("perm LastInsertId: %v", err)
  46. }
  47. return id
  48. }
  49. // TC-0267: 正常插入
  50. func TestSysUserPermModel_CRUD(t *testing.T) {
  51. ctx := context.Background()
  52. conn := testutil.GetTestSqlConn()
  53. m := NewSysUserPermModel(conn, testutil.GetTestCacheConf(), testutil.GetTestCachePrefix())
  54. userId := randUserPermId()
  55. permId := randUserPermId()
  56. ts := time.Now().Unix()
  57. data := &SysUserPerm{
  58. UserId: userId,
  59. PermId: permId,
  60. Effect: "ALLOW",
  61. CreateTime: ts,
  62. UpdateTime: ts,
  63. }
  64. res, err := m.Insert(ctx, data)
  65. if err != nil {
  66. t.Fatalf("Insert: %v", err)
  67. }
  68. id, err := res.LastInsertId()
  69. if err != nil {
  70. t.Fatalf("LastInsertId: %v", err)
  71. }
  72. defer testutil.CleanTable(ctx, conn, "sys_user_perm", id)
  73. got, err := m.FindOne(ctx, id)
  74. if err != nil {
  75. t.Fatalf("FindOne: %v", err)
  76. }
  77. if got.UserId != userId || got.PermId != permId || got.Effect != "ALLOW" {
  78. t.Fatalf("FindOne mismatch: %+v", got)
  79. }
  80. byPair, err := m.FindOneByUserIdPermId(ctx, userId, permId)
  81. if err != nil {
  82. t.Fatalf("FindOneByUserIdPermId: %v", err)
  83. }
  84. if byPair.Id != id {
  85. t.Fatalf("FindOneByUserIdPermId id want %d got %d", id, byPair.Id)
  86. }
  87. newTs := ts + 1
  88. got.Effect = "DENY"
  89. got.UpdateTime = newTs
  90. if err := m.Update(ctx, got); err != nil {
  91. t.Fatalf("Update: %v", err)
  92. }
  93. updated, err := m.FindOne(ctx, id)
  94. if err != nil {
  95. t.Fatalf("FindOne after update: %v", err)
  96. }
  97. if updated.Effect != "DENY" || updated.UpdateTime != newTs {
  98. t.Fatalf("after Update: %+v", updated)
  99. }
  100. if err := m.Delete(ctx, id); err != nil {
  101. t.Fatalf("Delete: %v", err)
  102. }
  103. if _, err := m.FindOne(ctx, id); err != ErrNotFound {
  104. t.Fatalf("after Delete want ErrNotFound got %v", err)
  105. }
  106. }
  107. // TC-0407: 正常查询
  108. func TestSysUserPermModel_FindByUserId(t *testing.T) {
  109. ctx := context.Background()
  110. conn := testutil.GetTestSqlConn()
  111. m := NewSysUserPermModel(conn, testutil.GetTestCacheConf(), testutil.GetTestCachePrefix())
  112. userId := randUserPermId()
  113. p1, p2 := randUserPermId(), randUserPermId()
  114. ts := time.Now().Unix()
  115. var ids []int64
  116. for _, permId := range []int64{p1, p2} {
  117. res, err := m.Insert(ctx, &SysUserPerm{UserId: userId, PermId: permId, Effect: "ALLOW", CreateTime: ts, UpdateTime: ts})
  118. if err != nil {
  119. t.Fatalf("Insert: %v", err)
  120. }
  121. id, _ := res.LastInsertId()
  122. ids = append(ids, id)
  123. }
  124. defer func() {
  125. for _, id := range ids {
  126. testutil.CleanTable(ctx, conn, "sys_user_perm", id)
  127. }
  128. }()
  129. list, err := m.FindByUserId(ctx, userId)
  130. if err != nil {
  131. t.Fatalf("FindByUserId: %v", err)
  132. }
  133. if len(list) != 2 {
  134. t.Fatalf("len want 2 got %d", len(list))
  135. }
  136. }
  137. // TC-0409: ALLOW
  138. func TestSysUserPermModel_FindPermIdsByUserIdAndEffect(t *testing.T) {
  139. ctx := context.Background()
  140. conn := testutil.GetTestSqlConn()
  141. m := NewSysUserPermModel(conn, testutil.GetTestCacheConf(), testutil.GetTestCachePrefix())
  142. userId := randUserPermId()
  143. pAllow, pDeny := randUserPermId(), randUserPermId()
  144. ts := time.Now().Unix()
  145. resA, err := m.Insert(ctx, &SysUserPerm{UserId: userId, PermId: pAllow, Effect: "ALLOW", CreateTime: ts, UpdateTime: ts})
  146. if err != nil {
  147. t.Fatalf("Insert ALLOW: %v", err)
  148. }
  149. idA, _ := resA.LastInsertId()
  150. resD, err := m.Insert(ctx, &SysUserPerm{UserId: userId, PermId: pDeny, Effect: "DENY", CreateTime: ts, UpdateTime: ts})
  151. if err != nil {
  152. t.Fatalf("Insert DENY: %v", err)
  153. }
  154. idD, _ := resD.LastInsertId()
  155. defer func() {
  156. testutil.CleanTable(ctx, conn, "sys_user_perm", idA, idD)
  157. }()
  158. allowIds, err := m.FindPermIdsByUserIdAndEffect(ctx, userId, "ALLOW")
  159. if err != nil {
  160. t.Fatalf("ALLOW: %v", err)
  161. }
  162. if !int64SliceEqualIgnoreOrder(allowIds, []int64{pAllow}) {
  163. t.Fatalf("ALLOW ids got %v", allowIds)
  164. }
  165. denyIds, err := m.FindPermIdsByUserIdAndEffect(ctx, userId, "DENY")
  166. if err != nil {
  167. t.Fatalf("DENY: %v", err)
  168. }
  169. if !int64SliceEqualIgnoreOrder(denyIds, []int64{pDeny}) {
  170. t.Fatalf("DENY ids got %v", denyIds)
  171. }
  172. }
  173. // TC-0412: 正常删除
  174. func TestSysUserPermModel_DeleteByUserId(t *testing.T) {
  175. ctx := context.Background()
  176. conn := testutil.GetTestSqlConn()
  177. m := NewSysUserPermModel(conn, testutil.GetTestCacheConf(), testutil.GetTestCachePrefix())
  178. u1, u2 := randUserPermId(), randUserPermId()
  179. permId := randUserPermId()
  180. ts := time.Now().Unix()
  181. res1, err := m.Insert(ctx, &SysUserPerm{UserId: u1, PermId: permId, Effect: "ALLOW", CreateTime: ts, UpdateTime: ts})
  182. if err != nil {
  183. t.Fatalf("Insert: %v", err)
  184. }
  185. id1, _ := res1.LastInsertId()
  186. res2, err := m.Insert(ctx, &SysUserPerm{UserId: u2, PermId: permId, Effect: "ALLOW", CreateTime: ts, UpdateTime: ts})
  187. if err != nil {
  188. t.Fatalf("Insert: %v", err)
  189. }
  190. id2, _ := res2.LastInsertId()
  191. defer func() {
  192. testutil.CleanTable(ctx, conn, "sys_user_perm", id1, id2)
  193. }()
  194. if err := m.DeleteByUserId(ctx, u1); err != nil {
  195. t.Fatalf("DeleteByUserId: %v", err)
  196. }
  197. if _, err := m.FindOne(ctx, id1); err != ErrNotFound {
  198. t.Fatalf("u1 row gone: %v", err)
  199. }
  200. if _, err := m.FindOne(ctx, id2); err != nil {
  201. t.Fatalf("u2 row remain: %v", err)
  202. }
  203. }
  204. // TC-0414: 正常删除
  205. func TestSysUserPermModel_DeleteByUserIdForProduct(t *testing.T) {
  206. ctx := context.Background()
  207. conn := testutil.GetTestSqlConn()
  208. m := NewSysUserPermModel(conn, testutil.GetTestCacheConf(), testutil.GetTestCachePrefix())
  209. pcA := "t_pc_a_" + testutil.UniqueId()
  210. pcB := "t_pc_b_" + testutil.UniqueId()
  211. codeA := "c_a_" + testutil.UniqueId()
  212. codeB := "c_b_" + testutil.UniqueId()
  213. permA := insertTestPerm(t, ctx, conn, pcA, codeA)
  214. permB := insertTestPerm(t, ctx, conn, pcB, codeB)
  215. defer func() {
  216. testutil.CleanTable(ctx, conn, "sys_perm", permA, permB)
  217. }()
  218. userId := randUserPermId()
  219. ts := time.Now().Unix()
  220. resA, err := m.Insert(ctx, &SysUserPerm{UserId: userId, PermId: permA, Effect: "ALLOW", CreateTime: ts, UpdateTime: ts})
  221. if err != nil {
  222. t.Fatalf("Insert A: %v", err)
  223. }
  224. idA, _ := resA.LastInsertId()
  225. resB, err := m.Insert(ctx, &SysUserPerm{UserId: userId, PermId: permB, Effect: "ALLOW", CreateTime: ts, UpdateTime: ts})
  226. if err != nil {
  227. t.Fatalf("Insert B: %v", err)
  228. }
  229. idB, _ := resB.LastInsertId()
  230. defer func() {
  231. testutil.CleanTable(ctx, conn, "sys_user_perm", idA, idB)
  232. }()
  233. if err := m.DeleteByUserIdForProduct(ctx, userId, pcA); err != nil {
  234. t.Fatalf("DeleteByUserIdForProduct: %v", err)
  235. }
  236. if _, err := m.FindOne(ctx, idA); err != ErrNotFound {
  237. t.Fatalf("permA row should delete: %v", err)
  238. }
  239. if _, err := m.FindOne(ctx, idB); err != nil {
  240. t.Fatalf("permB row should remain: %v", err)
  241. }
  242. }
  243. // TC-0274: 记录不存在
  244. func TestSysUserPermModel_FindOne_NotFound(t *testing.T) {
  245. conn := testutil.GetTestSqlConn()
  246. m := NewSysUserPermModel(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-0336: FindOneByUserIdPermId
  253. func TestSysUserPermModel_FindOneByUserIdPermId_NotFound(t *testing.T) {
  254. conn := testutil.GetTestSqlConn()
  255. m := NewSysUserPermModel(conn, testutil.GetTestCacheConf(), testutil.GetTestCachePrefix())
  256. _, err := m.FindOneByUserIdPermId(context.Background(), 999999999, 999999999)
  257. if err != ErrNotFound {
  258. t.Fatalf("want ErrNotFound got %v", err)
  259. }
  260. }
  261. // TC-0408: 无记录
  262. func TestSysUserPermModel_FindByUserId_Empty(t *testing.T) {
  263. conn := testutil.GetTestSqlConn()
  264. m := NewSysUserPermModel(conn, testutil.GetTestCacheConf(), testutil.GetTestCachePrefix())
  265. list, err := m.FindByUserId(context.Background(), 999999999)
  266. if err != nil {
  267. t.Fatalf("err: %v", err)
  268. }
  269. if len(list) != 0 {
  270. t.Fatalf("want empty got %d", len(list))
  271. }
  272. }
  273. // TC-0411: 无记录
  274. func TestSysUserPermModel_FindPermIdsByUserIdAndEffect_Empty(t *testing.T) {
  275. conn := testutil.GetTestSqlConn()
  276. m := NewSysUserPermModel(conn, testutil.GetTestCacheConf(), testutil.GetTestCachePrefix())
  277. ids, err := m.FindPermIdsByUserIdAndEffect(context.Background(), 999999999, "ALLOW")
  278. if err != nil {
  279. t.Fatalf("err: %v", err)
  280. }
  281. if len(ids) != 0 {
  282. t.Fatalf("want empty got %v", ids)
  283. }
  284. }
  285. // TC-0413: 事务内删除
  286. func TestSysUserPermModel_DeleteByUserIdTx(t *testing.T) {
  287. ctx := context.Background()
  288. conn := testutil.GetTestSqlConn()
  289. m := NewSysUserPermModel(conn, testutil.GetTestCacheConf(), testutil.GetTestCachePrefix())
  290. userId := randUserPermId()
  291. permId := randUserPermId()
  292. ts := time.Now().Unix()
  293. res, err := m.Insert(ctx, &SysUserPerm{UserId: userId, PermId: permId, Effect: "ALLOW", CreateTime: ts, UpdateTime: ts})
  294. if err != nil {
  295. t.Fatalf("Insert: %v", err)
  296. }
  297. id, _ := res.LastInsertId()
  298. defer testutil.CleanTable(ctx, conn, "sys_user_perm", id)
  299. err = m.TransactCtx(ctx, func(c context.Context, session sqlx.Session) error {
  300. return m.DeleteByUserIdTx(c, session, userId)
  301. })
  302. if err != nil {
  303. t.Fatalf("DeleteByUserIdTx: %v", err)
  304. }
  305. if _, err := m.FindOne(ctx, id); err != ErrNotFound {
  306. t.Fatalf("after tx delete want ErrNotFound got %v", err)
  307. }
  308. }
  309. // TC-0416: 事务内跨产品删除
  310. func TestSysUserPermModel_DeleteByUserIdForProductTx(t *testing.T) {
  311. ctx := context.Background()
  312. conn := testutil.GetTestSqlConn()
  313. m := NewSysUserPermModel(conn, testutil.GetTestCacheConf(), testutil.GetTestCachePrefix())
  314. pcA := "t_upt_a_" + testutil.UniqueId()
  315. pcB := "t_upt_b_" + testutil.UniqueId()
  316. codeA := "c_ta_" + testutil.UniqueId()
  317. codeB := "c_tb_" + testutil.UniqueId()
  318. permA := insertTestPerm(t, ctx, conn, pcA, codeA)
  319. permB := insertTestPerm(t, ctx, conn, pcB, codeB)
  320. defer testutil.CleanTable(ctx, conn, "sys_perm", permA, permB)
  321. userId := randUserPermId()
  322. ts := time.Now().Unix()
  323. resA, err := m.Insert(ctx, &SysUserPerm{UserId: userId, PermId: permA, Effect: "ALLOW", CreateTime: ts, UpdateTime: ts})
  324. if err != nil {
  325. t.Fatalf("Insert A: %v", err)
  326. }
  327. idA, _ := resA.LastInsertId()
  328. resB, err := m.Insert(ctx, &SysUserPerm{UserId: userId, PermId: permB, Effect: "ALLOW", CreateTime: ts, UpdateTime: ts})
  329. if err != nil {
  330. t.Fatalf("Insert B: %v", err)
  331. }
  332. idB, _ := resB.LastInsertId()
  333. defer testutil.CleanTable(ctx, conn, "sys_user_perm", idA, idB)
  334. err = m.TransactCtx(ctx, func(c context.Context, session sqlx.Session) error {
  335. return m.DeleteByUserIdForProductTx(c, session, userId, pcA)
  336. })
  337. if err != nil {
  338. t.Fatalf("DeleteByUserIdForProductTx: %v", err)
  339. }
  340. if _, err := m.FindOne(ctx, idA); err != ErrNotFound {
  341. t.Fatalf("pcA row should delete: %v", err)
  342. }
  343. if _, err := m.FindOne(ctx, idB); err != nil {
  344. t.Fatalf("pcB row should remain: %v", err)
  345. }
  346. }
  347. // TC-0288: 空列表
  348. func TestSysUserPermModel_BatchInsert_Empty(t *testing.T) {
  349. conn := testutil.GetTestSqlConn()
  350. m := NewSysUserPermModel(conn, testutil.GetTestCacheConf(), testutil.GetTestCachePrefix())
  351. if err := m.BatchInsert(context.Background(), nil); err != nil {
  352. t.Fatalf("nil: %v", err)
  353. }
  354. if err := m.BatchInsert(context.Background(), []*SysUserPerm{}); err != nil {
  355. t.Fatalf("empty: %v", err)
  356. }
  357. }
  358. // TC-0305: 空ids
  359. func TestSysUserPermModel_BatchDelete_Empty(t *testing.T) {
  360. conn := testutil.GetTestSqlConn()
  361. m := NewSysUserPermModel(conn, testutil.GetTestCacheConf(), testutil.GetTestCachePrefix())
  362. if err := m.BatchDelete(context.Background(), nil); err != nil {
  363. t.Fatalf("nil: %v", err)
  364. }
  365. if err := m.BatchDelete(context.Background(), []int64{}); err != nil {
  366. t.Fatalf("empty: %v", err)
  367. }
  368. }
  369. // TC-0268: 唯一索引冲突
  370. func TestSysUserPermModel_Insert_UniqueConflict(t *testing.T) {
  371. ctx := context.Background()
  372. conn := testutil.GetTestSqlConn()
  373. m := NewSysUserPermModel(conn, testutil.GetTestCacheConf(), testutil.GetTestCachePrefix())
  374. userId := randUserPermId()
  375. permId := randUserPermId()
  376. ts := time.Now().Unix()
  377. res, err := m.Insert(ctx, &SysUserPerm{UserId: userId, PermId: permId, Effect: "ALLOW", CreateTime: ts, UpdateTime: ts})
  378. if err != nil {
  379. t.Fatalf("Insert: %v", err)
  380. }
  381. id, _ := res.LastInsertId()
  382. defer testutil.CleanTable(ctx, conn, "sys_user_perm", id)
  383. _, err = m.Insert(ctx, &SysUserPerm{UserId: userId, PermId: permId, Effect: "DENY", CreateTime: ts, UpdateTime: ts})
  384. if err == nil {
  385. t.Fatal("second Insert want error")
  386. }
  387. var me *mysql.MySQLError
  388. if !errors.As(err, &me) || me.Number != 1062 {
  389. t.Fatalf("want duplicate key 1062, got %v", err)
  390. }
  391. }
  392. // TC-0270: 事务内插入
  393. func TestSysUserPermModel_InsertWithTx_Normal(t *testing.T) {
  394. ctx := context.Background()
  395. conn := testutil.GetTestSqlConn()
  396. m := NewSysUserPermModel(conn, testutil.GetTestCacheConf(), testutil.GetTestCachePrefix())
  397. userId := randUserPermId()
  398. permId := randUserPermId()
  399. ts := time.Now().Unix()
  400. var insertedId int64
  401. err := m.TransactCtx(ctx, func(c context.Context, session sqlx.Session) error {
  402. res, err := m.InsertWithTx(c, session, &SysUserPerm{UserId: userId, PermId: permId, Effect: "ALLOW", CreateTime: ts, UpdateTime: ts})
  403. if err != nil {
  404. return err
  405. }
  406. insertedId, _ = res.LastInsertId()
  407. return nil
  408. })
  409. if err != nil {
  410. t.Fatalf("TransactCtx: %v", err)
  411. }
  412. defer testutil.CleanTable(ctx, conn, "sys_user_perm", insertedId)
  413. got, err := m.FindOne(ctx, insertedId)
  414. if err != nil {
  415. t.Fatalf("FindOne: %v", err)
  416. }
  417. if got.UserId != userId || got.PermId != permId || got.Effect != "ALLOW" {
  418. t.Fatalf("mismatch: %+v", got)
  419. }
  420. }
  421. // TC-0271: 事务回滚后无数据
  422. func TestSysUserPermModel_InsertWithTx_Rollback(t *testing.T) {
  423. ctx := context.Background()
  424. conn := testutil.GetTestSqlConn()
  425. m := NewSysUserPermModel(conn, testutil.GetTestCacheConf(), testutil.GetTestCachePrefix())
  426. userId := randUserPermId()
  427. permId := randUserPermId()
  428. ts := time.Now().Unix()
  429. err := m.TransactCtx(ctx, func(c context.Context, session sqlx.Session) error {
  430. _, err := m.InsertWithTx(c, session, &SysUserPerm{UserId: userId, PermId: permId, Effect: "ALLOW", CreateTime: ts, UpdateTime: ts})
  431. if err != nil {
  432. return err
  433. }
  434. return errors.New("rollback")
  435. })
  436. if err == nil || err.Error() != "rollback" {
  437. t.Fatalf("want rollback error got %v", err)
  438. }
  439. _, err = m.FindOneByUserIdPermId(ctx, userId, permId)
  440. if err != ErrNotFound {
  441. t.Fatalf("after rollback want ErrNotFound got %v", err)
  442. }
  443. }
  444. // TC-0280: 记录不存在
  445. func TestSysUserPermModel_Update_NotFound(t *testing.T) {
  446. conn := testutil.GetTestSqlConn()
  447. m := NewSysUserPermModel(conn, testutil.GetTestCacheConf(), testutil.GetTestCachePrefix())
  448. ts := time.Now().Unix()
  449. err := m.Update(context.Background(), &SysUserPerm{
  450. Id: 999999999, UserId: 1, PermId: 1, Effect: "ALLOW", CreateTime: ts, UpdateTime: ts,
  451. })
  452. if err != ErrNotFound {
  453. t.Fatalf("want ErrNotFound got %v", err)
  454. }
  455. }
  456. // TC-0281: 事务内更新
  457. func TestSysUserPermModel_UpdateWithTx(t *testing.T) {
  458. ctx := context.Background()
  459. conn := testutil.GetTestSqlConn()
  460. m := NewSysUserPermModel(conn, testutil.GetTestCacheConf(), testutil.GetTestCachePrefix())
  461. userId := randUserPermId()
  462. permId := randUserPermId()
  463. ts := time.Now().Unix()
  464. res, err := m.Insert(ctx, &SysUserPerm{UserId: userId, PermId: permId, Effect: "ALLOW", CreateTime: ts, UpdateTime: ts})
  465. if err != nil {
  466. t.Fatalf("Insert: %v", err)
  467. }
  468. id, _ := res.LastInsertId()
  469. defer testutil.CleanTable(ctx, conn, "sys_user_perm", id)
  470. newTs := ts + 100
  471. err = m.TransactCtx(ctx, func(c context.Context, session sqlx.Session) error {
  472. return m.UpdateWithTx(c, session, &SysUserPerm{
  473. Id: id, UserId: userId, PermId: permId, Effect: "DENY", CreateTime: ts, UpdateTime: newTs,
  474. })
  475. })
  476. if err != nil {
  477. t.Fatalf("UpdateWithTx: %v", err)
  478. }
  479. got, err := m.FindOne(ctx, id)
  480. if err != nil {
  481. t.Fatalf("FindOne: %v", err)
  482. }
  483. if got.Effect != "DENY" || got.UpdateTime != newTs {
  484. t.Fatalf("mismatch: %+v", got)
  485. }
  486. }
  487. // TC-0283: 记录不存在
  488. func TestSysUserPermModel_Delete_NotFound(t *testing.T) {
  489. conn := testutil.GetTestSqlConn()
  490. m := NewSysUserPermModel(conn, testutil.GetTestCacheConf(), testutil.GetTestCachePrefix())
  491. err := m.Delete(context.Background(), 999999999)
  492. if err != ErrNotFound {
  493. t.Fatalf("want ErrNotFound got %v", err)
  494. }
  495. }
  496. // TC-0284: 事务内删除
  497. func TestSysUserPermModel_DeleteWithTx(t *testing.T) {
  498. ctx := context.Background()
  499. conn := testutil.GetTestSqlConn()
  500. m := NewSysUserPermModel(conn, testutil.GetTestCacheConf(), testutil.GetTestCachePrefix())
  501. userId := randUserPermId()
  502. permId := randUserPermId()
  503. ts := time.Now().Unix()
  504. res, err := m.Insert(ctx, &SysUserPerm{UserId: userId, PermId: permId, Effect: "ALLOW", CreateTime: ts, UpdateTime: ts})
  505. if err != nil {
  506. t.Fatalf("Insert: %v", err)
  507. }
  508. id, _ := res.LastInsertId()
  509. defer testutil.CleanTable(ctx, conn, "sys_user_perm", id)
  510. err = m.TransactCtx(ctx, func(c context.Context, session sqlx.Session) error {
  511. return m.DeleteWithTx(c, session, id)
  512. })
  513. if err != nil {
  514. t.Fatalf("DeleteWithTx: %v", err)
  515. }
  516. if _, err := m.FindOne(ctx, id); err != ErrNotFound {
  517. t.Fatalf("after DeleteWithTx want ErrNotFound got %v", err)
  518. }
  519. }
  520. // TC-0286: fn返回错误
  521. func TestSysUserPermModel_TransactCtx_Rollback(t *testing.T) {
  522. ctx := context.Background()
  523. conn := testutil.GetTestSqlConn()
  524. m := NewSysUserPermModel(conn, testutil.GetTestCacheConf(), testutil.GetTestCachePrefix())
  525. userId := randUserPermId()
  526. permId := randUserPermId()
  527. ts := time.Now().Unix()
  528. res, err := m.Insert(ctx, &SysUserPerm{UserId: userId, PermId: permId, Effect: "ALLOW", CreateTime: ts, UpdateTime: ts})
  529. if err != nil {
  530. t.Fatalf("Insert: %v", err)
  531. }
  532. id, _ := res.LastInsertId()
  533. defer testutil.CleanTable(ctx, conn, "sys_user_perm", id)
  534. err = m.TransactCtx(ctx, func(c context.Context, session sqlx.Session) error {
  535. if err := m.DeleteWithTx(c, session, id); err != nil {
  536. return err
  537. }
  538. return errors.New("rollback")
  539. })
  540. if err == nil || err.Error() != "rollback" {
  541. t.Fatalf("want rollback error got %v", err)
  542. }
  543. got, err := m.FindOne(ctx, id)
  544. if err != nil {
  545. t.Fatalf("after rollback FindOne: %v", err)
  546. }
  547. if got.Id != id {
  548. t.Fatalf("row should still exist")
  549. }
  550. }
  551. // TC-0287: 获取表名
  552. func TestSysUserPermModel_TableName(t *testing.T) {
  553. conn := testutil.GetTestSqlConn()
  554. m := NewSysUserPermModel(conn, testutil.GetTestCacheConf(), testutil.GetTestCachePrefix())
  555. if m.TableName() != "`sys_user_perm`" {
  556. t.Fatalf("want `sys_user_perm` got %s", m.TableName())
  557. }
  558. }
  559. // TC-0289: 单条记录
  560. func TestSysUserPermModel_BatchInsert_Single(t *testing.T) {
  561. ctx := context.Background()
  562. conn := testutil.GetTestSqlConn()
  563. m := NewSysUserPermModel(conn, testutil.GetTestCacheConf(), testutil.GetTestCachePrefix())
  564. userId := randUserPermId()
  565. permId := randUserPermId()
  566. ts := time.Now().Unix()
  567. if err := m.BatchInsert(ctx, []*SysUserPerm{
  568. {UserId: userId, PermId: permId, Effect: "ALLOW", CreateTime: ts, UpdateTime: ts},
  569. }); err != nil {
  570. t.Fatalf("BatchInsert: %v", err)
  571. }
  572. got, err := m.FindOneByUserIdPermId(ctx, userId, permId)
  573. if err != nil {
  574. t.Fatalf("FindOneByUserIdPermId: %v", err)
  575. }
  576. defer testutil.CleanTable(ctx, conn, "sys_user_perm", got.Id)
  577. if got.Effect != "ALLOW" {
  578. t.Fatalf("mismatch: %+v", got)
  579. }
  580. }
  581. // TC-0290: 多条记录(3条)
  582. func TestSysUserPermModel_BatchInsert_Multi(t *testing.T) {
  583. ctx := context.Background()
  584. conn := testutil.GetTestSqlConn()
  585. m := NewSysUserPermModel(conn, testutil.GetTestCacheConf(), testutil.GetTestCachePrefix())
  586. u1, u2, u3 := randUserPermId(), randUserPermId(), randUserPermId()
  587. p1, p2, p3 := randUserPermId(), randUserPermId(), randUserPermId()
  588. ts := time.Now().Unix()
  589. if err := m.BatchInsert(ctx, []*SysUserPerm{
  590. {UserId: u1, PermId: p1, Effect: "ALLOW", CreateTime: ts, UpdateTime: ts},
  591. {UserId: u2, PermId: p2, Effect: "DENY", CreateTime: ts, UpdateTime: ts},
  592. {UserId: u3, PermId: p3, Effect: "ALLOW", CreateTime: ts, UpdateTime: ts},
  593. }); err != nil {
  594. t.Fatalf("BatchInsert: %v", err)
  595. }
  596. var ids []int64
  597. for _, pair := range [][2]int64{{u1, p1}, {u2, p2}, {u3, p3}} {
  598. got, err := m.FindOneByUserIdPermId(ctx, pair[0], pair[1])
  599. if err != nil {
  600. t.Fatalf("FindOneByUserIdPermId(%d,%d): %v", pair[0], pair[1], err)
  601. }
  602. ids = append(ids, got.Id)
  603. }
  604. defer func() {
  605. for _, id := range ids {
  606. testutil.CleanTable(ctx, conn, "sys_user_perm", id)
  607. }
  608. }()
  609. if len(ids) != 3 {
  610. t.Fatalf("want 3 rows got %d", len(ids))
  611. }
  612. }
  613. // TC-0291: 唯一索引冲突
  614. func TestSysUserPermModel_BatchInsert_UniqueConflict(t *testing.T) {
  615. ctx := context.Background()
  616. conn := testutil.GetTestSqlConn()
  617. m := NewSysUserPermModel(conn, testutil.GetTestCacheConf(), testutil.GetTestCachePrefix())
  618. userId := randUserPermId()
  619. permId := randUserPermId()
  620. ts := time.Now().Unix()
  621. err := m.BatchInsert(ctx, []*SysUserPerm{
  622. {UserId: userId, PermId: permId, Effect: "ALLOW", CreateTime: ts, UpdateTime: ts},
  623. {UserId: userId, PermId: permId, Effect: "DENY", CreateTime: ts, UpdateTime: ts},
  624. })
  625. if err == nil {
  626. t.Fatal("want error for duplicate")
  627. }
  628. var me *mysql.MySQLError
  629. if !errors.As(err, &me) || me.Number != 1062 {
  630. t.Fatalf("want duplicate key 1062, got %v", err)
  631. }
  632. }
  633. // TC-0296: 空列表
  634. func TestSysUserPermModel_BatchUpdate_Empty(t *testing.T) {
  635. conn := testutil.GetTestSqlConn()
  636. m := NewSysUserPermModel(conn, testutil.GetTestCacheConf(), testutil.GetTestCachePrefix())
  637. if err := m.BatchUpdate(context.Background(), nil); err != nil {
  638. t.Fatalf("nil: %v", err)
  639. }
  640. if err := m.BatchUpdate(context.Background(), []*SysUserPerm{}); err != nil {
  641. t.Fatalf("empty: %v", err)
  642. }
  643. }
  644. // TC-0298: 多条记录(3条)
  645. func TestSysUserPermModel_BatchUpdate_Multi(t *testing.T) {
  646. ctx := context.Background()
  647. conn := testutil.GetTestSqlConn()
  648. m := NewSysUserPermModel(conn, testutil.GetTestCacheConf(), testutil.GetTestCachePrefix())
  649. u1, u2 := randUserPermId(), randUserPermId()
  650. p1, p2 := randUserPermId(), randUserPermId()
  651. ts := time.Now().Unix()
  652. res1, err := m.Insert(ctx, &SysUserPerm{UserId: u1, PermId: p1, Effect: "ALLOW", CreateTime: ts, UpdateTime: ts})
  653. if err != nil {
  654. t.Fatalf("Insert1: %v", err)
  655. }
  656. id1, _ := res1.LastInsertId()
  657. res2, err := m.Insert(ctx, &SysUserPerm{UserId: u2, PermId: p2, Effect: "ALLOW", CreateTime: ts, UpdateTime: ts})
  658. if err != nil {
  659. t.Fatalf("Insert2: %v", err)
  660. }
  661. id2, _ := res2.LastInsertId()
  662. defer testutil.CleanTable(ctx, conn, "sys_user_perm", id1, id2)
  663. newTs := ts + 100
  664. err = m.BatchUpdate(ctx, []*SysUserPerm{
  665. {Id: id1, UserId: u1, PermId: p1, Effect: "DENY", CreateTime: ts, UpdateTime: newTs},
  666. {Id: id2, UserId: u2, PermId: p2, Effect: "DENY", CreateTime: ts, UpdateTime: newTs},
  667. })
  668. if err != nil {
  669. t.Fatalf("BatchUpdate: %v", err)
  670. }
  671. got1, err := m.FindOne(ctx, id1)
  672. if err != nil {
  673. t.Fatalf("FindOne1: %v", err)
  674. }
  675. if got1.Effect != "DENY" || got1.UpdateTime != newTs {
  676. t.Fatalf("got1 mismatch: %+v", got1)
  677. }
  678. got2, err := m.FindOne(ctx, id2)
  679. if err != nil {
  680. t.Fatalf("FindOne2: %v", err)
  681. }
  682. if got2.Effect != "DENY" || got2.UpdateTime != newTs {
  683. t.Fatalf("got2 mismatch: %+v", got2)
  684. }
  685. }
  686. // TC-0307: 多个id(3个)
  687. func TestSysUserPermModel_BatchDelete_Multi(t *testing.T) {
  688. ctx := context.Background()
  689. conn := testutil.GetTestSqlConn()
  690. m := NewSysUserPermModel(conn, testutil.GetTestCacheConf(), testutil.GetTestCachePrefix())
  691. ts := time.Now().Unix()
  692. var ids []int64
  693. for i := 0; i < 3; i++ {
  694. res, err := m.Insert(ctx, &SysUserPerm{
  695. UserId: randUserPermId(), PermId: randUserPermId(), Effect: "ALLOW", CreateTime: ts, UpdateTime: ts,
  696. })
  697. if err != nil {
  698. t.Fatalf("Insert: %v", err)
  699. }
  700. id, _ := res.LastInsertId()
  701. ids = append(ids, id)
  702. }
  703. defer func() {
  704. for _, id := range ids {
  705. testutil.CleanTable(ctx, conn, "sys_user_perm", id)
  706. }
  707. }()
  708. if err := m.BatchDelete(ctx, ids); err != nil {
  709. t.Fatalf("BatchDelete: %v", err)
  710. }
  711. for _, id := range ids {
  712. if _, err := m.FindOne(ctx, id); err != ErrNotFound {
  713. t.Fatalf("id %d should be deleted: %v", id, err)
  714. }
  715. }
  716. }
  717. // TC-0306: 单个id
  718. func TestSysUserPermModel_BatchDelete_Single(t *testing.T) {
  719. ctx := context.Background()
  720. conn := testutil.GetTestSqlConn()
  721. m := NewSysUserPermModel(conn, testutil.GetTestCacheConf(), testutil.GetTestCachePrefix())
  722. userId := randUserPermId()
  723. permId := randUserPermId()
  724. ts := time.Now().Unix()
  725. res, err := m.Insert(ctx, &SysUserPerm{UserId: userId, PermId: permId, Effect: "ALLOW", CreateTime: ts, UpdateTime: ts})
  726. if err != nil {
  727. t.Fatalf("Insert: %v", err)
  728. }
  729. id, _ := res.LastInsertId()
  730. defer testutil.CleanTable(ctx, conn, "sys_user_perm", id)
  731. if err := m.BatchDelete(ctx, []int64{id}); err != nil {
  732. t.Fatalf("BatchDelete: %v", err)
  733. }
  734. if _, err := m.FindOne(ctx, id); err != ErrNotFound {
  735. t.Fatalf("want ErrNotFound got %v", err)
  736. }
  737. }
  738. // TC-0308: 包含不存在id
  739. func TestSysUserPermModel_BatchDelete_ContainsNonExist(t *testing.T) {
  740. ctx := context.Background()
  741. conn := testutil.GetTestSqlConn()
  742. m := NewSysUserPermModel(conn, testutil.GetTestCacheConf(), testutil.GetTestCachePrefix())
  743. userId := randUserPermId()
  744. permId := randUserPermId()
  745. ts := time.Now().Unix()
  746. res, err := m.Insert(ctx, &SysUserPerm{UserId: userId, PermId: permId, Effect: "ALLOW", CreateTime: ts, UpdateTime: ts})
  747. if err != nil {
  748. t.Fatalf("Insert: %v", err)
  749. }
  750. id, _ := res.LastInsertId()
  751. defer testutil.CleanTable(ctx, conn, "sys_user_perm", id)
  752. if err := m.BatchDelete(ctx, []int64{id, 999999999}); err != nil {
  753. t.Fatalf("BatchDelete: %v", err)
  754. }
  755. if _, err := m.FindOne(ctx, id); err != ErrNotFound {
  756. t.Fatalf("want ErrNotFound got %v", err)
  757. }
  758. }
  759. // TC-0294: 正常多条
  760. func TestSysUserPermModel_BatchInsertWithTx_Normal(t *testing.T) {
  761. ctx := context.Background()
  762. conn := testutil.GetTestSqlConn()
  763. m := NewSysUserPermModel(conn, testutil.GetTestCacheConf(), testutil.GetTestCachePrefix())
  764. u1, u2 := randUserPermId(), randUserPermId()
  765. p1, p2 := randUserPermId(), randUserPermId()
  766. ts := time.Now().Unix()
  767. err := m.TransactCtx(ctx, func(c context.Context, session sqlx.Session) error {
  768. return m.BatchInsertWithTx(c, session, []*SysUserPerm{
  769. {UserId: u1, PermId: p1, Effect: "ALLOW", CreateTime: ts, UpdateTime: ts},
  770. {UserId: u2, PermId: p2, Effect: "DENY", CreateTime: ts, UpdateTime: ts},
  771. })
  772. })
  773. if err != nil {
  774. t.Fatalf("BatchInsertWithTx: %v", err)
  775. }
  776. got1, err := m.FindOneByUserIdPermId(ctx, u1, p1)
  777. if err != nil {
  778. t.Fatalf("FindOne u1p1: %v", err)
  779. }
  780. got2, err := m.FindOneByUserIdPermId(ctx, u2, p2)
  781. if err != nil {
  782. t.Fatalf("FindOne u2p2: %v", err)
  783. }
  784. defer testutil.CleanTable(ctx, conn, "sys_user_perm", got1.Id, got2.Id)
  785. }
  786. // TC-0293: 空列表
  787. func TestSysUserPermModel_BatchInsertWithTx_Empty(t *testing.T) {
  788. ctx := context.Background()
  789. conn := testutil.GetTestSqlConn()
  790. m := NewSysUserPermModel(conn, testutil.GetTestCacheConf(), testutil.GetTestCachePrefix())
  791. err := m.TransactCtx(ctx, func(c context.Context, session sqlx.Session) error {
  792. if err := m.BatchInsertWithTx(c, session, nil); err != nil {
  793. return err
  794. }
  795. return m.BatchInsertWithTx(c, session, []*SysUserPerm{})
  796. })
  797. if err != nil {
  798. t.Fatalf("BatchInsertWithTx empty: %v", err)
  799. }
  800. }
  801. // TC-0295: 事务回滚
  802. func TestSysUserPermModel_BatchInsertWithTx_Rollback(t *testing.T) {
  803. ctx := context.Background()
  804. conn := testutil.GetTestSqlConn()
  805. m := NewSysUserPermModel(conn, testutil.GetTestCacheConf(), testutil.GetTestCachePrefix())
  806. userId := randUserPermId()
  807. permId := randUserPermId()
  808. ts := time.Now().Unix()
  809. err := m.TransactCtx(ctx, func(c context.Context, session sqlx.Session) error {
  810. if err := m.BatchInsertWithTx(c, session, []*SysUserPerm{
  811. {UserId: userId, PermId: permId, Effect: "ALLOW", CreateTime: ts, UpdateTime: ts},
  812. }); err != nil {
  813. return err
  814. }
  815. return errors.New("rollback")
  816. })
  817. if err == nil || err.Error() != "rollback" {
  818. t.Fatalf("want rollback error got %v", err)
  819. }
  820. _, err = m.FindOneByUserIdPermId(ctx, userId, permId)
  821. if err != ErrNotFound {
  822. t.Fatalf("after rollback want ErrNotFound got %v", err)
  823. }
  824. }
  825. // TC-0301: 正常多条
  826. func TestSysUserPermModel_BatchUpdateWithTx_Normal(t *testing.T) {
  827. ctx := context.Background()
  828. conn := testutil.GetTestSqlConn()
  829. m := NewSysUserPermModel(conn, testutil.GetTestCacheConf(), testutil.GetTestCachePrefix())
  830. u1, u2 := randUserPermId(), randUserPermId()
  831. p1, p2 := randUserPermId(), randUserPermId()
  832. ts := time.Now().Unix()
  833. res1, err := m.Insert(ctx, &SysUserPerm{UserId: u1, PermId: p1, Effect: "ALLOW", CreateTime: ts, UpdateTime: ts})
  834. if err != nil {
  835. t.Fatalf("Insert1: %v", err)
  836. }
  837. id1, _ := res1.LastInsertId()
  838. res2, err := m.Insert(ctx, &SysUserPerm{UserId: u2, PermId: p2, Effect: "ALLOW", CreateTime: ts, UpdateTime: ts})
  839. if err != nil {
  840. t.Fatalf("Insert2: %v", err)
  841. }
  842. id2, _ := res2.LastInsertId()
  843. defer testutil.CleanTable(ctx, conn, "sys_user_perm", id1, id2)
  844. newTs := ts + 200
  845. err = m.TransactCtx(ctx, func(c context.Context, session sqlx.Session) error {
  846. return m.BatchUpdateWithTx(c, session, []*SysUserPerm{
  847. {Id: id1, UserId: u1, PermId: p1, Effect: "DENY", CreateTime: ts, UpdateTime: newTs},
  848. {Id: id2, UserId: u2, PermId: p2, Effect: "DENY", CreateTime: ts, UpdateTime: newTs},
  849. })
  850. })
  851. if err != nil {
  852. t.Fatalf("BatchUpdateWithTx: %v", err)
  853. }
  854. got1, err := m.FindOne(ctx, id1)
  855. if err != nil {
  856. t.Fatalf("FindOne1: %v", err)
  857. }
  858. if got1.Effect != "DENY" || got1.UpdateTime != newTs {
  859. t.Fatalf("got1 mismatch: %+v", got1)
  860. }
  861. }
  862. // TC-0300: 空列表
  863. func TestSysUserPermModel_BatchUpdateWithTx_Empty(t *testing.T) {
  864. ctx := context.Background()
  865. conn := testutil.GetTestSqlConn()
  866. m := NewSysUserPermModel(conn, testutil.GetTestCacheConf(), testutil.GetTestCachePrefix())
  867. err := m.TransactCtx(ctx, func(c context.Context, session sqlx.Session) error {
  868. if err := m.BatchUpdateWithTx(c, session, nil); err != nil {
  869. return err
  870. }
  871. return m.BatchUpdateWithTx(c, session, []*SysUserPerm{})
  872. })
  873. if err != nil {
  874. t.Fatalf("BatchUpdateWithTx empty: %v", err)
  875. }
  876. }
  877. // TC-0310: 正常多条
  878. func TestSysUserPermModel_BatchDeleteWithTx_Normal(t *testing.T) {
  879. ctx := context.Background()
  880. conn := testutil.GetTestSqlConn()
  881. m := NewSysUserPermModel(conn, testutil.GetTestCacheConf(), testutil.GetTestCachePrefix())
  882. ts := time.Now().Unix()
  883. var ids []int64
  884. for i := 0; i < 2; i++ {
  885. res, err := m.Insert(ctx, &SysUserPerm{
  886. UserId: randUserPermId(), PermId: randUserPermId(), Effect: "ALLOW", CreateTime: ts, UpdateTime: ts,
  887. })
  888. if err != nil {
  889. t.Fatalf("Insert: %v", err)
  890. }
  891. id, _ := res.LastInsertId()
  892. ids = append(ids, id)
  893. }
  894. defer func() {
  895. for _, id := range ids {
  896. testutil.CleanTable(ctx, conn, "sys_user_perm", id)
  897. }
  898. }()
  899. err := m.TransactCtx(ctx, func(c context.Context, session sqlx.Session) error {
  900. return m.BatchDeleteWithTx(c, session, ids)
  901. })
  902. if err != nil {
  903. t.Fatalf("BatchDeleteWithTx: %v", err)
  904. }
  905. for _, id := range ids {
  906. if _, err := m.FindOne(ctx, id); err != ErrNotFound {
  907. t.Fatalf("id %d should be deleted: %v", id, err)
  908. }
  909. }
  910. }
  911. // TC-0309: 空ids
  912. func TestSysUserPermModel_BatchDeleteWithTx_Empty(t *testing.T) {
  913. ctx := context.Background()
  914. conn := testutil.GetTestSqlConn()
  915. m := NewSysUserPermModel(conn, testutil.GetTestCacheConf(), testutil.GetTestCachePrefix())
  916. err := m.TransactCtx(ctx, func(c context.Context, session sqlx.Session) error {
  917. if err := m.BatchDeleteWithTx(c, session, nil); err != nil {
  918. return err
  919. }
  920. return m.BatchDeleteWithTx(c, session, []int64{})
  921. })
  922. if err != nil {
  923. t.Fatalf("BatchDeleteWithTx empty: %v", err)
  924. }
  925. }
  926. // TC-0278: 事务内可见性
  927. func TestSysUserPermModel_FindOneWithTx_InsertThenFind(t *testing.T) {
  928. ctx := context.Background()
  929. conn := testutil.GetTestSqlConn()
  930. m := NewSysUserPermModel(conn, testutil.GetTestCacheConf(), testutil.GetTestCachePrefix())
  931. userId := randUserPermId()
  932. permId := randUserPermId()
  933. ts := time.Now().Unix()
  934. var insertedId int64
  935. err := m.TransactCtx(ctx, func(c context.Context, session sqlx.Session) error {
  936. res, err := m.InsertWithTx(c, session, &SysUserPerm{UserId: userId, PermId: permId, Effect: "ALLOW", CreateTime: ts, UpdateTime: ts})
  937. if err != nil {
  938. return err
  939. }
  940. insertedId, err = res.LastInsertId()
  941. if err != nil {
  942. return err
  943. }
  944. got, err := m.FindOneWithTx(c, session, insertedId)
  945. require.NoError(t, err)
  946. assert.Equal(t, insertedId, got.Id)
  947. assert.Equal(t, userId, got.UserId)
  948. assert.Equal(t, permId, got.PermId)
  949. assert.Equal(t, "ALLOW", got.Effect)
  950. return nil
  951. })
  952. require.NoError(t, err)
  953. defer testutil.CleanTable(ctx, conn, "sys_user_perm", insertedId)
  954. }
  955. // TC-0277: 事务内记录不存在
  956. func TestSysUserPermModel_FindOneWithTx_NotFound(t *testing.T) {
  957. ctx := context.Background()
  958. m := NewSysUserPermModel(testutil.GetTestSqlConn(), testutil.GetTestCacheConf(), testutil.GetTestCachePrefix())
  959. err := m.TransactCtx(ctx, func(c context.Context, session sqlx.Session) error {
  960. _, err := m.FindOneWithTx(c, session, 999999999999)
  961. require.ErrorIs(t, err, ErrNotFound)
  962. return nil
  963. })
  964. require.NoError(t, err)
  965. }
  966. // TC-0337: FindOneByUserIdPermIdWithTx
  967. func TestSysUserPermModel_FindOneByUserIdPermIdWithTx_InsertThenFind(t *testing.T) {
  968. ctx := context.Background()
  969. conn := testutil.GetTestSqlConn()
  970. m := NewSysUserPermModel(conn, testutil.GetTestCacheConf(), testutil.GetTestCachePrefix())
  971. userId := randUserPermId()
  972. permId := randUserPermId()
  973. ts := time.Now().Unix()
  974. var insertedId int64
  975. err := m.TransactCtx(ctx, func(c context.Context, session sqlx.Session) error {
  976. res, err := m.InsertWithTx(c, session, &SysUserPerm{UserId: userId, PermId: permId, Effect: "ALLOW", CreateTime: ts, UpdateTime: ts})
  977. if err != nil {
  978. return err
  979. }
  980. insertedId, err = res.LastInsertId()
  981. if err != nil {
  982. return err
  983. }
  984. got, err := m.FindOneByUserIdPermIdWithTx(c, session, userId, permId)
  985. require.NoError(t, err)
  986. assert.Equal(t, insertedId, got.Id)
  987. assert.Equal(t, userId, got.UserId)
  988. assert.Equal(t, permId, got.PermId)
  989. return nil
  990. })
  991. require.NoError(t, err)
  992. defer testutil.CleanTable(ctx, conn, "sys_user_perm", insertedId)
  993. }
  994. // TC-0338: FindOneByUserIdPermIdWithTx
  995. func TestSysUserPermModel_FindOneByUserIdPermIdWithTx_NotFound(t *testing.T) {
  996. ctx := context.Background()
  997. m := NewSysUserPermModel(testutil.GetTestSqlConn(), testutil.GetTestCacheConf(), testutil.GetTestCachePrefix())
  998. err := m.TransactCtx(ctx, func(c context.Context, session sqlx.Session) error {
  999. _, err := m.FindOneByUserIdPermIdWithTx(c, session, 999999999, 999999999)
  1000. require.ErrorIs(t, err, ErrNotFound)
  1001. return nil
  1002. })
  1003. require.NoError(t, err)
  1004. }