sysRoleModel_test.go 37 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135
  1. package role
  2. import (
  3. "context"
  4. "errors"
  5. "math"
  6. "strings"
  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. // TC-0281: 正常插入
  16. func TestSysRoleModel_CRUD(t *testing.T) {
  17. ctx := context.Background()
  18. conn := testutil.GetTestSqlConn()
  19. m := NewSysRoleModel(conn, testutil.GetTestCacheConf(), testutil.GetTestCachePrefix())
  20. tbl := m.TableName()
  21. now := time.Now().Unix()
  22. pc := "pc_crud_" + testutil.UniqueId()
  23. data := &SysRole{
  24. ProductCode: pc,
  25. Name: "role_crud_" + testutil.UniqueId(),
  26. Remark: "r",
  27. Status: 1,
  28. PermsLevel: 1,
  29. CreateTime: now,
  30. UpdateTime: now,
  31. }
  32. res, err := m.Insert(ctx, data)
  33. require.NoError(t, err)
  34. id, err := res.LastInsertId()
  35. require.NoError(t, err)
  36. t.Cleanup(func() { testutil.CleanTable(ctx, conn, tbl, id) })
  37. found, err := m.FindOne(ctx, id)
  38. require.NoError(t, err)
  39. require.NotNil(t, found)
  40. assert.Equal(t, id, found.Id)
  41. assert.Equal(t, data.Name, found.Name)
  42. found.Remark = "updated"
  43. found.UpdateTime = now + 1
  44. require.NoError(t, m.Update(ctx, found))
  45. after, err := m.FindOne(ctx, id)
  46. require.NoError(t, err)
  47. assert.Equal(t, "updated", after.Remark)
  48. require.NoError(t, m.Delete(ctx, id))
  49. _, err = m.FindOne(ctx, id)
  50. require.Error(t, err)
  51. assert.True(t, errors.Is(err, ErrNotFound))
  52. }
  53. // TC-0346: FindOneByProductCodeName
  54. func TestSysRoleModel_FindOneByProductCodeName_FoundAndNotFound(t *testing.T) {
  55. ctx := context.Background()
  56. conn := testutil.GetTestSqlConn()
  57. m := NewSysRoleModel(conn, testutil.GetTestCacheConf(), testutil.GetTestCachePrefix())
  58. tbl := m.TableName()
  59. now := time.Now().Unix()
  60. pc := "pc_fn_" + testutil.UniqueId()
  61. name := "name_fn_" + testutil.UniqueId()
  62. data := &SysRole{
  63. ProductCode: pc,
  64. Name: name,
  65. Remark: "",
  66. Status: 1,
  67. PermsLevel: 1,
  68. CreateTime: now,
  69. UpdateTime: now,
  70. }
  71. res, err := m.Insert(ctx, data)
  72. require.NoError(t, err)
  73. id, err := res.LastInsertId()
  74. require.NoError(t, err)
  75. t.Cleanup(func() { testutil.CleanTable(ctx, conn, tbl, id) })
  76. got, err := m.FindOneByProductCodeName(ctx, pc, name)
  77. require.NoError(t, err)
  78. require.NotNil(t, got)
  79. assert.Equal(t, id, got.Id)
  80. _, err = m.FindOneByProductCodeName(ctx, pc, "no_such_"+testutil.UniqueId())
  81. require.Error(t, err)
  82. assert.True(t, errors.Is(err, ErrNotFound))
  83. }
  84. // TC-0418: 正常分页
  85. func TestSysRoleModel_FindListByProductCode_Pagination(t *testing.T) {
  86. ctx := context.Background()
  87. conn := testutil.GetTestSqlConn()
  88. m := NewSysRoleModel(conn, testutil.GetTestCacheConf(), testutil.GetTestCachePrefix())
  89. tbl := m.TableName()
  90. pc := "pc_page_" + testutil.UniqueId()
  91. now := time.Now().Unix()
  92. var ids []int64
  93. for i := range 5 {
  94. r := &SysRole{
  95. ProductCode: pc,
  96. Name: "p_" + testutil.UniqueId() + "_" + string(rune('a'+i)),
  97. Remark: "",
  98. Status: 1,
  99. PermsLevel: int64(i + 1),
  100. CreateTime: now,
  101. UpdateTime: now,
  102. }
  103. res, err := m.Insert(ctx, r)
  104. require.NoError(t, err)
  105. id, err := res.LastInsertId()
  106. require.NoError(t, err)
  107. ids = append(ids, id)
  108. }
  109. t.Cleanup(func() { testutil.CleanTable(ctx, conn, tbl, ids...) })
  110. list, total, err := m.FindListByProductCode(ctx, pc, 1, 2)
  111. require.NoError(t, err)
  112. assert.Equal(t, int64(5), total)
  113. require.Len(t, list, 2)
  114. list2, total2, err := m.FindListByProductCode(ctx, pc, 2, 2)
  115. require.NoError(t, err)
  116. assert.Equal(t, int64(5), total2)
  117. require.Len(t, list2, 2)
  118. list3, total3, err := m.FindListByProductCode(ctx, pc, 3, 2)
  119. require.NoError(t, err)
  120. assert.Equal(t, int64(5), total3)
  121. require.Len(t, list3, 1)
  122. }
  123. // TC-0420: 正常
  124. func TestSysRoleModel_FindByIds_NormalEmptyPartial(t *testing.T) {
  125. ctx := context.Background()
  126. conn := testutil.GetTestSqlConn()
  127. m := NewSysRoleModel(conn, testutil.GetTestCacheConf(), testutil.GetTestCachePrefix())
  128. tbl := m.TableName()
  129. empty, err := m.FindByIds(ctx, nil)
  130. require.NoError(t, err)
  131. assert.Nil(t, empty)
  132. empty2, err := m.FindByIds(ctx, []int64{})
  133. require.NoError(t, err)
  134. assert.Nil(t, empty2)
  135. now := time.Now().Unix()
  136. pc := "pc_ids_" + testutil.UniqueId()
  137. r1 := &SysRole{ProductCode: pc, Name: "i1_" + testutil.UniqueId(), Remark: "", Status: 1, PermsLevel: 1, CreateTime: now, UpdateTime: now}
  138. r2 := &SysRole{ProductCode: pc, Name: "i2_" + testutil.UniqueId(), Remark: "", Status: 1, PermsLevel: 2, CreateTime: now, UpdateTime: now}
  139. res1, err := m.Insert(ctx, r1)
  140. require.NoError(t, err)
  141. id1, _ := res1.LastInsertId()
  142. res2, err := m.Insert(ctx, r2)
  143. require.NoError(t, err)
  144. id2, _ := res2.LastInsertId()
  145. t.Cleanup(func() { testutil.CleanTable(ctx, conn, tbl, id1, id2) })
  146. list, err := m.FindByIds(ctx, []int64{id1, id2})
  147. require.NoError(t, err)
  148. require.Len(t, list, 2)
  149. byID := map[int64]struct{}{list[0].Id: {}, list[1].Id: {}}
  150. assert.Contains(t, byID, id1)
  151. assert.Contains(t, byID, id2)
  152. partial, err := m.FindByIds(ctx, []int64{id1, math.MaxInt64})
  153. require.NoError(t, err)
  154. require.Len(t, partial, 1)
  155. assert.Equal(t, id1, partial[0].Id)
  156. }
  157. // TC-0307: 多条记录(3条)
  158. func TestSysRoleModel_BatchInsert_BatchDelete(t *testing.T) {
  159. ctx := context.Background()
  160. conn := testutil.GetTestSqlConn()
  161. m := NewSysRoleModel(conn, testutil.GetTestCacheConf(), testutil.GetTestCachePrefix())
  162. tbl := m.TableName()
  163. now := time.Now().Unix()
  164. pc := "pc_bi_" + testutil.UniqueId()
  165. tag := testutil.UniqueId()
  166. batch := []*SysRole{
  167. {ProductCode: pc, Name: "bi1_" + tag, Remark: "", Status: 1, PermsLevel: 1, CreateTime: now, UpdateTime: now},
  168. {ProductCode: pc, Name: "bi2_" + tag, Remark: "", Status: 1, PermsLevel: 2, CreateTime: now, UpdateTime: now},
  169. }
  170. require.NoError(t, m.BatchInsert(ctx, batch))
  171. list, _, err := m.FindListByProductCode(ctx, pc, 1, 10)
  172. require.NoError(t, err)
  173. require.GreaterOrEqual(t, len(list), 2)
  174. var ids []int64
  175. names := map[string]struct{}{"bi1_" + tag: {}, "bi2_" + tag: {}}
  176. for _, r := range list {
  177. if _, ok := names[r.Name]; ok {
  178. ids = append(ids, r.Id)
  179. }
  180. }
  181. require.Len(t, ids, 2)
  182. t.Cleanup(func() { testutil.CleanTable(ctx, conn, tbl, ids...) })
  183. require.NoError(t, m.BatchDelete(ctx, ids))
  184. for _, id := range ids {
  185. _, err := m.FindOne(ctx, id)
  186. require.Error(t, err)
  187. assert.True(t, errors.Is(err, ErrNotFound))
  188. }
  189. }
  190. // TC-0283: 唯一索引冲突
  191. func TestSysRoleModel_Insert_DuplicateProductCodeName(t *testing.T) {
  192. ctx := context.Background()
  193. conn := testutil.GetTestSqlConn()
  194. m := NewSysRoleModel(conn, testutil.GetTestCacheConf(), testutil.GetTestCachePrefix())
  195. tbl := m.TableName()
  196. now := time.Now().Unix()
  197. pc := "pc_dup_" + testutil.UniqueId()
  198. name := "dup_name_" + testutil.UniqueId()
  199. first := &SysRole{
  200. ProductCode: pc,
  201. Name: name,
  202. Remark: "",
  203. Status: 1,
  204. PermsLevel: 1,
  205. CreateTime: now,
  206. UpdateTime: now,
  207. }
  208. res, err := m.Insert(ctx, first)
  209. require.NoError(t, err)
  210. id, err := res.LastInsertId()
  211. require.NoError(t, err)
  212. t.Cleanup(func() { testutil.CleanTable(ctx, conn, tbl, id) })
  213. dup := &SysRole{
  214. ProductCode: pc,
  215. Name: name,
  216. Remark: "x",
  217. Status: 1,
  218. PermsLevel: 2,
  219. CreateTime: now,
  220. UpdateTime: now,
  221. }
  222. _, err = m.Insert(ctx, dup)
  223. require.Error(t, err)
  224. var me *mysql.MySQLError
  225. require.True(t, errors.As(err, &me))
  226. assert.Equal(t, uint16(1062), me.Number)
  227. }
  228. // TC-0304: 获取表名
  229. func TestSysRoleModel_TableName(t *testing.T) {
  230. conn := testutil.GetTestSqlConn()
  231. m := NewSysRoleModel(conn, testutil.GetTestCacheConf(), testutil.GetTestCachePrefix())
  232. assert.Equal(t, "`sys_role`", m.TableName())
  233. }
  234. // TC-0290: 记录不存在
  235. func TestSysRoleModel_FindOne_NotFound(t *testing.T) {
  236. conn := testutil.GetTestSqlConn()
  237. m := NewSysRoleModel(conn, testutil.GetTestCacheConf(), testutil.GetTestCachePrefix())
  238. _, err := m.FindOne(context.Background(), 999999999999)
  239. require.ErrorIs(t, err, ErrNotFound)
  240. }
  241. // TC-0297: 记录不存在
  242. func TestSysRoleModel_Update_NotFound(t *testing.T) {
  243. conn := testutil.GetTestSqlConn()
  244. m := NewSysRoleModel(conn, testutil.GetTestCacheConf(), testutil.GetTestCachePrefix())
  245. err := m.Update(context.Background(), &SysRole{
  246. Id: 999999999999, ProductCode: "x", Name: "n", Status: 1, PermsLevel: 1,
  247. CreateTime: time.Now().Unix(), UpdateTime: time.Now().Unix(),
  248. })
  249. require.ErrorIs(t, err, ErrNotFound)
  250. }
  251. // TC-0300: 记录不存在
  252. func TestSysRoleModel_Delete_NotFound(t *testing.T) {
  253. conn := testutil.GetTestSqlConn()
  254. m := NewSysRoleModel(conn, testutil.GetTestCacheConf(), testutil.GetTestCachePrefix())
  255. err := m.Delete(context.Background(), 999999999999)
  256. require.ErrorIs(t, err, ErrNotFound)
  257. }
  258. // TC-0305: 空列表
  259. func TestSysRoleModel_BatchInsert_Empty(t *testing.T) {
  260. conn := testutil.GetTestSqlConn()
  261. m := NewSysRoleModel(conn, testutil.GetTestCacheConf(), testutil.GetTestCachePrefix())
  262. require.NoError(t, m.BatchInsert(context.Background(), nil))
  263. require.NoError(t, m.BatchInsert(context.Background(), []*SysRole{}))
  264. }
  265. // TC-0324: 空ids
  266. func TestSysRoleModel_BatchDelete_Empty(t *testing.T) {
  267. conn := testutil.GetTestSqlConn()
  268. m := NewSysRoleModel(conn, testutil.GetTestCacheConf(), testutil.GetTestCachePrefix())
  269. require.NoError(t, m.BatchDelete(context.Background(), nil))
  270. require.NoError(t, m.BatchDelete(context.Background(), []int64{}))
  271. }
  272. // TC-0419: 空结果
  273. func TestSysRoleModel_FindListByProductCode_Empty(t *testing.T) {
  274. conn := testutil.GetTestSqlConn()
  275. m := NewSysRoleModel(conn, testutil.GetTestCacheConf(), testutil.GetTestCachePrefix())
  276. list, total, err := m.FindListByProductCode(context.Background(), "empty_"+testutil.UniqueId(), 1, 10)
  277. require.NoError(t, err)
  278. require.Equal(t, int64(0), total)
  279. require.Len(t, list, 0)
  280. }
  281. // TC-0285: 事务内插入
  282. func TestSysRoleModel_InsertWithTx_Normal(t *testing.T) {
  283. ctx := context.Background()
  284. conn := testutil.GetTestSqlConn()
  285. m := NewSysRoleModel(conn, testutil.GetTestCacheConf(), testutil.GetTestCachePrefix())
  286. tbl := m.TableName()
  287. now := time.Now().Unix()
  288. pc := "pc_itx_" + testutil.UniqueId()
  289. name := "itx_" + testutil.UniqueId()
  290. data := &SysRole{
  291. ProductCode: pc,
  292. Name: name,
  293. Remark: "",
  294. Status: 1,
  295. PermsLevel: 1,
  296. CreateTime: now,
  297. UpdateTime: now,
  298. }
  299. var insertedID int64
  300. err := m.TransactCtx(ctx, func(c context.Context, session sqlx.Session) error {
  301. res, err := m.InsertWithTx(c, session, data)
  302. if err != nil {
  303. return err
  304. }
  305. insertedID, err = res.LastInsertId()
  306. return err
  307. })
  308. require.NoError(t, err)
  309. require.Greater(t, insertedID, int64(0))
  310. t.Cleanup(func() { testutil.CleanTable(ctx, conn, tbl, insertedID) })
  311. got, err := m.FindOne(ctx, insertedID)
  312. require.NoError(t, err)
  313. assert.Equal(t, pc, got.ProductCode)
  314. assert.Equal(t, name, got.Name)
  315. }
  316. // TC-0287: 事务回滚后无数据
  317. func TestSysRoleModel_InsertWithTx_Rollback(t *testing.T) {
  318. ctx := context.Background()
  319. conn := testutil.GetTestSqlConn()
  320. m := NewSysRoleModel(conn, testutil.GetTestCacheConf(), testutil.GetTestCachePrefix())
  321. now := time.Now().Unix()
  322. pc := "pc_irb_" + testutil.UniqueId()
  323. name := "irb_" + testutil.UniqueId()
  324. data := &SysRole{
  325. ProductCode: pc,
  326. Name: name,
  327. Status: 1,
  328. PermsLevel: 1,
  329. CreateTime: now,
  330. UpdateTime: now,
  331. }
  332. err := m.TransactCtx(ctx, func(c context.Context, session sqlx.Session) error {
  333. if _, e := m.InsertWithTx(c, session, data); e != nil {
  334. return e
  335. }
  336. return errors.New("force rollback")
  337. })
  338. require.Error(t, err)
  339. _, err = m.FindOneByProductCodeName(ctx, pc, name)
  340. require.ErrorIs(t, err, ErrNotFound)
  341. }
  342. // TC-0298: 事务内更新
  343. func TestSysRoleModel_UpdateWithTx(t *testing.T) {
  344. ctx := context.Background()
  345. conn := testutil.GetTestSqlConn()
  346. m := NewSysRoleModel(conn, testutil.GetTestCacheConf(), testutil.GetTestCachePrefix())
  347. tbl := m.TableName()
  348. now := time.Now().Unix()
  349. pc := "pc_utx_" + testutil.UniqueId()
  350. name := "utx_" + testutil.UniqueId()
  351. data := &SysRole{
  352. ProductCode: pc,
  353. Name: name,
  354. Remark: "before",
  355. Status: 1,
  356. PermsLevel: 1,
  357. CreateTime: now,
  358. UpdateTime: now,
  359. }
  360. res, err := m.Insert(ctx, data)
  361. require.NoError(t, err)
  362. id, _ := res.LastInsertId()
  363. t.Cleanup(func() { testutil.CleanTable(ctx, conn, tbl, id) })
  364. err = m.TransactCtx(ctx, func(c context.Context, session sqlx.Session) error {
  365. data.Id = id
  366. data.Remark = "after_tx"
  367. data.UpdateTime = time.Now().Unix()
  368. return m.UpdateWithTx(c, session, data)
  369. })
  370. require.NoError(t, err)
  371. got, err := m.FindOne(ctx, id)
  372. require.NoError(t, err)
  373. assert.Equal(t, "after_tx", got.Remark)
  374. }
  375. // TC-0301: 事务内删除
  376. func TestSysRoleModel_DeleteWithTx(t *testing.T) {
  377. ctx := context.Background()
  378. conn := testutil.GetTestSqlConn()
  379. m := NewSysRoleModel(conn, testutil.GetTestCacheConf(), testutil.GetTestCachePrefix())
  380. tbl := m.TableName()
  381. now := time.Now().Unix()
  382. pc := "pc_dtx_" + testutil.UniqueId()
  383. data := &SysRole{
  384. ProductCode: pc,
  385. Name: "dtx_" + testutil.UniqueId(),
  386. Status: 1,
  387. PermsLevel: 1,
  388. CreateTime: now,
  389. UpdateTime: now,
  390. }
  391. res, err := m.Insert(ctx, data)
  392. require.NoError(t, err)
  393. id, _ := res.LastInsertId()
  394. t.Cleanup(func() { testutil.CleanTable(ctx, conn, tbl, id) })
  395. err = m.TransactCtx(ctx, func(c context.Context, session sqlx.Session) error {
  396. return m.DeleteWithTx(c, session, id)
  397. })
  398. require.NoError(t, err)
  399. _, err = m.FindOne(ctx, id)
  400. require.ErrorIs(t, err, ErrNotFound)
  401. }
  402. // TC-0302: 正常事务
  403. func TestSysRoleModel_TransactCtx_CommitAndRollback(t *testing.T) {
  404. ctx := context.Background()
  405. conn := testutil.GetTestSqlConn()
  406. m := NewSysRoleModel(conn, testutil.GetTestCacheConf(), testutil.GetTestCachePrefix())
  407. tbl := m.TableName()
  408. now := time.Now().Unix()
  409. pc1 := "pc_txc_" + testutil.UniqueId()
  410. name1 := "txc_" + testutil.UniqueId()
  411. var id1 int64
  412. err := m.TransactCtx(ctx, func(c context.Context, session sqlx.Session) error {
  413. res, err := m.InsertWithTx(c, session, &SysRole{
  414. ProductCode: pc1, Name: name1, Status: 1, PermsLevel: 1, CreateTime: now, UpdateTime: now,
  415. })
  416. if err != nil {
  417. return err
  418. }
  419. id1, err = res.LastInsertId()
  420. return err
  421. })
  422. require.NoError(t, err)
  423. t.Cleanup(func() { testutil.CleanTable(ctx, conn, tbl, id1) })
  424. _, err = m.FindOne(ctx, id1)
  425. require.NoError(t, err)
  426. pc2 := "pc_txr_" + testutil.UniqueId()
  427. name2 := "txr_" + testutil.UniqueId()
  428. err = m.TransactCtx(ctx, func(c context.Context, session sqlx.Session) error {
  429. if _, e := m.InsertWithTx(c, session, &SysRole{
  430. ProductCode: pc2, Name: name2, Status: 1, PermsLevel: 1, CreateTime: now, UpdateTime: now,
  431. }); e != nil {
  432. return e
  433. }
  434. return errors.New("force rollback")
  435. })
  436. require.Error(t, err)
  437. _, err = m.FindOneByProductCodeName(ctx, pc2, name2)
  438. require.ErrorIs(t, err, ErrNotFound)
  439. }
  440. // TC-0306: 单条记录
  441. func TestSysRoleModel_BatchInsert_Single(t *testing.T) {
  442. ctx := context.Background()
  443. conn := testutil.GetTestSqlConn()
  444. m := NewSysRoleModel(conn, testutil.GetTestCacheConf(), testutil.GetTestCachePrefix())
  445. tbl := m.TableName()
  446. now := time.Now().Unix()
  447. pc := "pc_bis_" + testutil.UniqueId()
  448. name := "bis_" + testutil.UniqueId()
  449. require.NoError(t, m.BatchInsert(ctx, []*SysRole{
  450. {ProductCode: pc, Name: name, Status: 1, PermsLevel: 1, CreateTime: now, UpdateTime: now},
  451. }))
  452. found, err := m.FindOneByProductCodeName(ctx, pc, name)
  453. require.NoError(t, err)
  454. t.Cleanup(func() { testutil.CleanTable(ctx, conn, tbl, found.Id) })
  455. assert.Equal(t, name, found.Name)
  456. }
  457. // TC-0309: 唯一索引冲突
  458. func TestSysRoleModel_BatchInsert_UniqueConflict(t *testing.T) {
  459. ctx := context.Background()
  460. conn := testutil.GetTestSqlConn()
  461. m := NewSysRoleModel(conn, testutil.GetTestCacheConf(), testutil.GetTestCachePrefix())
  462. tbl := m.TableName()
  463. now := time.Now().Unix()
  464. pc := "pc_biu_" + testutil.UniqueId()
  465. name := "biu_" + testutil.UniqueId()
  466. list := []*SysRole{
  467. {ProductCode: pc, Name: name, Status: 1, PermsLevel: 1, CreateTime: now, UpdateTime: now},
  468. {ProductCode: pc, Name: name, Status: 1, PermsLevel: 2, CreateTime: now, UpdateTime: now},
  469. }
  470. err := m.BatchInsert(ctx, list)
  471. require.Error(t, err)
  472. t.Cleanup(func() {
  473. if found, e := m.FindOneByProductCodeName(ctx, pc, name); e == nil {
  474. testutil.CleanTable(ctx, conn, tbl, found.Id)
  475. }
  476. })
  477. var me *mysql.MySQLError
  478. if errors.As(err, &me) {
  479. assert.Equal(t, uint16(1062), me.Number)
  480. }
  481. }
  482. // TC-0314: 空列表
  483. func TestSysRoleModel_BatchUpdate_Empty(t *testing.T) {
  484. conn := testutil.GetTestSqlConn()
  485. m := NewSysRoleModel(conn, testutil.GetTestCacheConf(), testutil.GetTestCachePrefix())
  486. require.NoError(t, m.BatchUpdate(context.Background(), nil))
  487. require.NoError(t, m.BatchUpdate(context.Background(), []*SysRole{}))
  488. }
  489. // TC-0316: 多条记录(3条)
  490. func TestSysRoleModel_BatchUpdate_Multi(t *testing.T) {
  491. ctx := context.Background()
  492. conn := testutil.GetTestSqlConn()
  493. m := NewSysRoleModel(conn, testutil.GetTestCacheConf(), testutil.GetTestCachePrefix())
  494. tbl := m.TableName()
  495. now := time.Now().Unix()
  496. pc := "pc_bum_" + testutil.UniqueId()
  497. r1 := &SysRole{ProductCode: pc, Name: "bum1_" + testutil.UniqueId(), Remark: "old", Status: 1, PermsLevel: 1, CreateTime: now, UpdateTime: now}
  498. r2 := &SysRole{ProductCode: pc, Name: "bum2_" + testutil.UniqueId(), Remark: "old", Status: 1, PermsLevel: 2, CreateTime: now, UpdateTime: now}
  499. res1, err := m.Insert(ctx, r1)
  500. require.NoError(t, err)
  501. id1, _ := res1.LastInsertId()
  502. res2, err := m.Insert(ctx, r2)
  503. require.NoError(t, err)
  504. id2, _ := res2.LastInsertId()
  505. t.Cleanup(func() { testutil.CleanTable(ctx, conn, tbl, id1, id2) })
  506. now2 := time.Now().Unix()
  507. upd := []*SysRole{
  508. {Id: id1, ProductCode: pc, Name: r1.Name, Remark: "new1", Status: 1, PermsLevel: 1, CreateTime: now, UpdateTime: now2},
  509. {Id: id2, ProductCode: pc, Name: r2.Name, Remark: "new2", Status: 2, PermsLevel: 2, CreateTime: now, UpdateTime: now2},
  510. }
  511. require.NoError(t, m.BatchUpdate(ctx, upd))
  512. g1, err := m.FindOne(ctx, id1)
  513. require.NoError(t, err)
  514. assert.Equal(t, "new1", g1.Remark)
  515. g2, err := m.FindOne(ctx, id2)
  516. require.NoError(t, err)
  517. assert.Equal(t, "new2", g2.Remark)
  518. assert.Equal(t, int64(2), g2.Status)
  519. }
  520. // TC-0312: 正常多条
  521. func TestSysRoleModel_BatchInsertWithTx_Normal(t *testing.T) {
  522. ctx := context.Background()
  523. conn := testutil.GetTestSqlConn()
  524. m := NewSysRoleModel(conn, testutil.GetTestCacheConf(), testutil.GetTestCachePrefix())
  525. tbl := m.TableName()
  526. now := time.Now().Unix()
  527. pc := "pc_bitxn_" + testutil.UniqueId()
  528. n1 := "bitxn1_" + testutil.UniqueId()
  529. n2 := "bitxn2_" + testutil.UniqueId()
  530. err := m.TransactCtx(ctx, func(c context.Context, session sqlx.Session) error {
  531. return m.BatchInsertWithTx(c, session, []*SysRole{
  532. {ProductCode: pc, Name: n1, Status: 1, PermsLevel: 1, CreateTime: now, UpdateTime: now},
  533. {ProductCode: pc, Name: n2, Status: 1, PermsLevel: 2, CreateTime: now, UpdateTime: now},
  534. })
  535. })
  536. require.NoError(t, err)
  537. f1, err := m.FindOneByProductCodeName(ctx, pc, n1)
  538. require.NoError(t, err)
  539. f2, err := m.FindOneByProductCodeName(ctx, pc, n2)
  540. require.NoError(t, err)
  541. t.Cleanup(func() { testutil.CleanTable(ctx, conn, tbl, f1.Id, f2.Id) })
  542. assert.Equal(t, n1, f1.Name)
  543. assert.Equal(t, n2, f2.Name)
  544. }
  545. // TC-0311: 空列表
  546. func TestSysRoleModel_BatchInsertWithTx_Empty(t *testing.T) {
  547. conn := testutil.GetTestSqlConn()
  548. m := NewSysRoleModel(conn, testutil.GetTestCacheConf(), testutil.GetTestCachePrefix())
  549. err := m.TransactCtx(context.Background(), func(c context.Context, session sqlx.Session) error {
  550. return m.BatchInsertWithTx(c, session, nil)
  551. })
  552. require.NoError(t, err)
  553. }
  554. // TC-0313: 事务回滚
  555. func TestSysRoleModel_BatchInsertWithTx_Rollback(t *testing.T) {
  556. ctx := context.Background()
  557. conn := testutil.GetTestSqlConn()
  558. m := NewSysRoleModel(conn, testutil.GetTestCacheConf(), testutil.GetTestCachePrefix())
  559. now := time.Now().Unix()
  560. pc := "pc_bitxr_" + testutil.UniqueId()
  561. name := "bitxr_" + testutil.UniqueId()
  562. err := m.TransactCtx(ctx, func(c context.Context, session sqlx.Session) error {
  563. if e := m.BatchInsertWithTx(c, session, []*SysRole{
  564. {ProductCode: pc, Name: name, Status: 1, PermsLevel: 1, CreateTime: now, UpdateTime: now},
  565. }); e != nil {
  566. return e
  567. }
  568. return errors.New("force rollback")
  569. })
  570. require.Error(t, err)
  571. _, err = m.FindOneByProductCodeName(ctx, pc, name)
  572. require.ErrorIs(t, err, ErrNotFound)
  573. }
  574. // TC-0320: 正常多条
  575. func TestSysRoleModel_BatchUpdateWithTx_Normal(t *testing.T) {
  576. ctx := context.Background()
  577. conn := testutil.GetTestSqlConn()
  578. m := NewSysRoleModel(conn, testutil.GetTestCacheConf(), testutil.GetTestCachePrefix())
  579. tbl := m.TableName()
  580. now := time.Now().Unix()
  581. pc := "pc_butxn_" + testutil.UniqueId()
  582. r1 := &SysRole{ProductCode: pc, Name: "butxn1_" + testutil.UniqueId(), Remark: "old", Status: 1, PermsLevel: 1, CreateTime: now, UpdateTime: now}
  583. r2 := &SysRole{ProductCode: pc, Name: "butxn2_" + testutil.UniqueId(), Remark: "old", Status: 1, PermsLevel: 2, CreateTime: now, UpdateTime: now}
  584. res1, err := m.Insert(ctx, r1)
  585. require.NoError(t, err)
  586. id1, _ := res1.LastInsertId()
  587. res2, err := m.Insert(ctx, r2)
  588. require.NoError(t, err)
  589. id2, _ := res2.LastInsertId()
  590. t.Cleanup(func() { testutil.CleanTable(ctx, conn, tbl, id1, id2) })
  591. now2 := time.Now().Unix()
  592. err = m.TransactCtx(ctx, func(c context.Context, session sqlx.Session) error {
  593. return m.BatchUpdateWithTx(c, session, []*SysRole{
  594. {Id: id1, ProductCode: pc, Name: r1.Name, Remark: "tx_new1", Status: 1, PermsLevel: 1, CreateTime: now, UpdateTime: now2},
  595. {Id: id2, ProductCode: pc, Name: r2.Name, Remark: "tx_new2", Status: 1, PermsLevel: 2, CreateTime: now, UpdateTime: now2},
  596. })
  597. })
  598. require.NoError(t, err)
  599. g1, err := m.FindOne(ctx, id1)
  600. require.NoError(t, err)
  601. assert.Equal(t, "tx_new1", g1.Remark)
  602. g2, err := m.FindOne(ctx, id2)
  603. require.NoError(t, err)
  604. assert.Equal(t, "tx_new2", g2.Remark)
  605. }
  606. // TC-0319: 空列表
  607. func TestSysRoleModel_BatchUpdateWithTx_Empty(t *testing.T) {
  608. conn := testutil.GetTestSqlConn()
  609. m := NewSysRoleModel(conn, testutil.GetTestCacheConf(), testutil.GetTestCachePrefix())
  610. err := m.TransactCtx(context.Background(), func(c context.Context, session sqlx.Session) error {
  611. return m.BatchUpdateWithTx(c, session, nil)
  612. })
  613. require.NoError(t, err)
  614. }
  615. // TC-0325: 单个id
  616. func TestSysRoleModel_BatchDelete_Single(t *testing.T) {
  617. ctx := context.Background()
  618. conn := testutil.GetTestSqlConn()
  619. m := NewSysRoleModel(conn, testutil.GetTestCacheConf(), testutil.GetTestCachePrefix())
  620. tbl := m.TableName()
  621. now := time.Now().Unix()
  622. pc := "pc_bds_" + testutil.UniqueId()
  623. data := &SysRole{ProductCode: pc, Name: "bds_" + testutil.UniqueId(), Status: 1, PermsLevel: 1, CreateTime: now, UpdateTime: now}
  624. res, err := m.Insert(ctx, data)
  625. require.NoError(t, err)
  626. id, _ := res.LastInsertId()
  627. t.Cleanup(func() { testutil.CleanTable(ctx, conn, tbl, id) })
  628. require.NoError(t, m.BatchDelete(ctx, []int64{id}))
  629. _, err = m.FindOne(ctx, id)
  630. require.ErrorIs(t, err, ErrNotFound)
  631. }
  632. // TC-0327: 包含不存在id
  633. func TestSysRoleModel_BatchDelete_ContainsNonExist(t *testing.T) {
  634. ctx := context.Background()
  635. conn := testutil.GetTestSqlConn()
  636. m := NewSysRoleModel(conn, testutil.GetTestCacheConf(), testutil.GetTestCachePrefix())
  637. tbl := m.TableName()
  638. now := time.Now().Unix()
  639. pc := "pc_bdne_" + testutil.UniqueId()
  640. data := &SysRole{ProductCode: pc, Name: "bdne_" + testutil.UniqueId(), Status: 1, PermsLevel: 1, CreateTime: now, UpdateTime: now}
  641. res, err := m.Insert(ctx, data)
  642. require.NoError(t, err)
  643. id, _ := res.LastInsertId()
  644. t.Cleanup(func() { testutil.CleanTable(ctx, conn, tbl, id) })
  645. require.NoError(t, m.BatchDelete(ctx, []int64{id, 999999999}))
  646. _, err = m.FindOne(ctx, id)
  647. require.ErrorIs(t, err, ErrNotFound)
  648. }
  649. // TC-0329: 正常多条
  650. func TestSysRoleModel_BatchDeleteWithTx_Normal(t *testing.T) {
  651. ctx := context.Background()
  652. conn := testutil.GetTestSqlConn()
  653. m := NewSysRoleModel(conn, testutil.GetTestCacheConf(), testutil.GetTestCachePrefix())
  654. tbl := m.TableName()
  655. now := time.Now().Unix()
  656. pc := "pc_bdtxn_" + testutil.UniqueId()
  657. r1 := &SysRole{ProductCode: pc, Name: "bdtxn1_" + testutil.UniqueId(), Status: 1, PermsLevel: 1, CreateTime: now, UpdateTime: now}
  658. r2 := &SysRole{ProductCode: pc, Name: "bdtxn2_" + testutil.UniqueId(), Status: 1, PermsLevel: 2, CreateTime: now, UpdateTime: now}
  659. res1, err := m.Insert(ctx, r1)
  660. require.NoError(t, err)
  661. id1, _ := res1.LastInsertId()
  662. res2, err := m.Insert(ctx, r2)
  663. require.NoError(t, err)
  664. id2, _ := res2.LastInsertId()
  665. t.Cleanup(func() { testutil.CleanTable(ctx, conn, tbl, id1, id2) })
  666. err = m.TransactCtx(ctx, func(c context.Context, session sqlx.Session) error {
  667. return m.BatchDeleteWithTx(c, session, []int64{id1, id2})
  668. })
  669. require.NoError(t, err)
  670. _, err = m.FindOne(ctx, id1)
  671. require.ErrorIs(t, err, ErrNotFound)
  672. _, err = m.FindOne(ctx, id2)
  673. require.ErrorIs(t, err, ErrNotFound)
  674. }
  675. // TC-0328: 空ids
  676. func TestSysRoleModel_BatchDeleteWithTx_Empty(t *testing.T) {
  677. conn := testutil.GetTestSqlConn()
  678. m := NewSysRoleModel(conn, testutil.GetTestCacheConf(), testutil.GetTestCachePrefix())
  679. err := m.TransactCtx(context.Background(), func(c context.Context, session sqlx.Session) error {
  680. return m.BatchDeleteWithTx(c, session, nil)
  681. })
  682. require.NoError(t, err)
  683. }
  684. // TC-0294: 事务内可见性
  685. func TestSysRoleModel_FindOneWithTx_InsertThenFind(t *testing.T) {
  686. ctx := context.Background()
  687. conn := testutil.GetTestSqlConn()
  688. m := NewSysRoleModel(conn, testutil.GetTestCacheConf(), testutil.GetTestCachePrefix())
  689. tbl := m.TableName()
  690. now := time.Now().Unix()
  691. pc := "pc_fotx_" + testutil.UniqueId()
  692. name := "fotx_" + testutil.UniqueId()
  693. var insertedID int64
  694. err := m.TransactCtx(ctx, func(c context.Context, session sqlx.Session) error {
  695. res, err := m.InsertWithTx(c, session, &SysRole{
  696. ProductCode: pc, Name: name, Remark: "r", Status: 1, PermsLevel: 1, CreateTime: now, UpdateTime: now,
  697. })
  698. if err != nil {
  699. return err
  700. }
  701. insertedID, err = res.LastInsertId()
  702. if err != nil {
  703. return err
  704. }
  705. got, err := m.FindOneWithTx(c, session, insertedID)
  706. if err != nil {
  707. return err
  708. }
  709. assert.Equal(t, pc, got.ProductCode)
  710. assert.Equal(t, name, got.Name)
  711. return nil
  712. })
  713. require.NoError(t, err)
  714. t.Cleanup(func() { testutil.CleanTable(ctx, conn, tbl, insertedID) })
  715. }
  716. // TC-0293: 事务内记录不存在
  717. func TestSysRoleModel_FindOneWithTx_NotFound(t *testing.T) {
  718. ctx := context.Background()
  719. conn := testutil.GetTestSqlConn()
  720. m := NewSysRoleModel(conn, testutil.GetTestCacheConf(), testutil.GetTestCachePrefix())
  721. err := m.TransactCtx(ctx, func(c context.Context, session sqlx.Session) error {
  722. _, err := m.FindOneWithTx(c, session, 999999999999)
  723. require.ErrorIs(t, err, ErrNotFound)
  724. return nil
  725. })
  726. require.NoError(t, err)
  727. }
  728. // TC-0348: FindOneByProductCodeNameWithTx
  729. func TestSysRoleModel_FindOneByProductCodeNameWithTx_InsertThenFind(t *testing.T) {
  730. ctx := context.Background()
  731. conn := testutil.GetTestSqlConn()
  732. m := NewSysRoleModel(conn, testutil.GetTestCacheConf(), testutil.GetTestCachePrefix())
  733. tbl := m.TableName()
  734. now := time.Now().Unix()
  735. pc := "pc_fbntx_" + testutil.UniqueId()
  736. name := "fbntx_" + testutil.UniqueId()
  737. var insertedID int64
  738. err := m.TransactCtx(ctx, func(c context.Context, session sqlx.Session) error {
  739. res, err := m.InsertWithTx(c, session, &SysRole{
  740. ProductCode: pc, Name: name, Remark: "", Status: 1, PermsLevel: 2, CreateTime: now, UpdateTime: now,
  741. })
  742. if err != nil {
  743. return err
  744. }
  745. insertedID, err = res.LastInsertId()
  746. if err != nil {
  747. return err
  748. }
  749. got, err := m.FindOneByProductCodeNameWithTx(c, session, pc, name)
  750. if err != nil {
  751. return err
  752. }
  753. assert.Equal(t, insertedID, got.Id)
  754. assert.Equal(t, int64(2), got.PermsLevel)
  755. return nil
  756. })
  757. require.NoError(t, err)
  758. t.Cleanup(func() { testutil.CleanTable(ctx, conn, tbl, insertedID) })
  759. }
  760. // TC-0349: FindOneByProductCodeNameWithTx
  761. func TestSysRoleModel_FindOneByProductCodeNameWithTx_NotFound(t *testing.T) {
  762. ctx := context.Background()
  763. conn := testutil.GetTestSqlConn()
  764. m := NewSysRoleModel(conn, testutil.GetTestCacheConf(), testutil.GetTestCachePrefix())
  765. err := m.TransactCtx(ctx, func(c context.Context, session sqlx.Session) error {
  766. _, err := m.FindOneByProductCodeNameWithTx(c, session, "notexist_"+testutil.UniqueId(), "nope_"+testutil.UniqueId())
  767. require.ErrorIs(t, err, ErrNotFound)
  768. return nil
  769. })
  770. require.NoError(t, err)
  771. }
  772. // TC-0422: FindMinPermsLevelByUserIdAndProductCode 正常返回最小权限级别
  773. func TestSysRoleModel_FindMinPermsLevelByUserIdAndProductCode_Normal(t *testing.T) {
  774. ctx := context.Background()
  775. conn := testutil.GetTestSqlConn()
  776. m := NewSysRoleModel(conn, testutil.GetTestCacheConf(), testutil.GetTestCachePrefix())
  777. tbl := m.TableName()
  778. now := time.Now().Unix()
  779. pc := "pc_minlvl_" + testutil.UniqueId()
  780. r1 := &SysRole{ProductCode: pc, Name: "minlvl1_" + testutil.UniqueId(), Remark: "", Status: 1, PermsLevel: 10, CreateTime: now, UpdateTime: now}
  781. res1, err := m.Insert(ctx, r1)
  782. require.NoError(t, err)
  783. roleId1, _ := res1.LastInsertId()
  784. r2 := &SysRole{ProductCode: pc, Name: "minlvl2_" + testutil.UniqueId(), Remark: "", Status: 1, PermsLevel: 5, CreateTime: now, UpdateTime: now}
  785. res2, err := m.Insert(ctx, r2)
  786. require.NoError(t, err)
  787. roleId2, _ := res2.LastInsertId()
  788. userId := time.Now().UnixNano()%100_000_000 + 800_000_000
  789. var urIds []int64
  790. for _, rid := range []int64{roleId1, roleId2} {
  791. ur, err := conn.ExecCtx(ctx, "INSERT INTO `sys_user_role` (`userId`, `roleId`, `createTime`, `updateTime`) VALUES (?, ?, ?, ?)", userId, rid, now, now)
  792. require.NoError(t, err)
  793. urId, _ := ur.LastInsertId()
  794. urIds = append(urIds, urId)
  795. }
  796. t.Cleanup(func() {
  797. testutil.CleanTable(ctx, conn, tbl, roleId1, roleId2)
  798. testutil.CleanTable(ctx, conn, "`sys_user_role`", urIds...)
  799. })
  800. level, err := m.FindMinPermsLevelByUserIdAndProductCode(ctx, userId, pc)
  801. require.NoError(t, err)
  802. assert.Equal(t, int64(5), level)
  803. }
  804. // TC-0423: FindMinPermsLevelByUserIdAndProductCode 无角色返回ErrNotFound
  805. func TestSysRoleModel_FindMinPermsLevelByUserIdAndProductCode_NoRoles(t *testing.T) {
  806. conn := testutil.GetTestSqlConn()
  807. m := NewSysRoleModel(conn, testutil.GetTestCacheConf(), testutil.GetTestCachePrefix())
  808. userId := time.Now().UnixNano()%100_000_000 + 900_000_000
  809. _, err := m.FindMinPermsLevelByUserIdAndProductCode(context.Background(), userId, "nonexist_"+testutil.UniqueId())
  810. require.ErrorIs(t, err, ErrNotFound)
  811. }
  812. // TC-0321: buildBatchUpdateQuery 单条
  813. func TestSysRoleModel_buildBatchUpdateQuery_Single(t *testing.T) {
  814. conn := testutil.GetTestSqlConn()
  815. dm := newSysRoleModel(conn, testutil.GetTestCacheConf(), testutil.GetTestCachePrefix())
  816. now := time.Now().Unix()
  817. dataList := []*SysRole{
  818. {Id: 1, ProductCode: "pc", Name: "n", Remark: "r", Status: 1, PermsLevel: 1, CreateTime: now, UpdateTime: now},
  819. }
  820. query, vals := dm.buildBatchUpdateQuery(dataList)
  821. assert.Contains(t, query, "UPDATE")
  822. assert.Contains(t, query, "CASE")
  823. assert.Contains(t, query, "WHEN `id` = ? THEN ?")
  824. assert.Contains(t, query, "WHERE `id` IN (?)")
  825. assert.Equal(t, 15, len(vals))
  826. }
  827. // TC-0322: buildBatchUpdateQuery 多条
  828. func TestSysRoleModel_buildBatchUpdateQuery_Multi(t *testing.T) {
  829. conn := testutil.GetTestSqlConn()
  830. dm := newSysRoleModel(conn, testutil.GetTestCacheConf(), testutil.GetTestCachePrefix())
  831. now := time.Now().Unix()
  832. dataList := []*SysRole{
  833. {Id: 1, ProductCode: "pc1", Name: "n1", Remark: "r1", Status: 1, PermsLevel: 1, CreateTime: now, UpdateTime: now},
  834. {Id: 2, ProductCode: "pc2", Name: "n2", Remark: "r2", Status: 1, PermsLevel: 2, CreateTime: now, UpdateTime: now},
  835. {Id: 3, ProductCode: "pc3", Name: "n3", Remark: "r3", Status: 1, PermsLevel: 3, CreateTime: now, UpdateTime: now},
  836. }
  837. query, vals := dm.buildBatchUpdateQuery(dataList)
  838. assert.Equal(t, 7*3, strings.Count(query, "WHEN `id` = ? THEN ?"))
  839. assert.Contains(t, query, "WHERE `id` IN (?,?,?)")
  840. assert.Equal(t, 45, len(vals))
  841. }
  842. // TC-0323: buildBatchUpdateQuery vals数量正确
  843. func TestSysRoleModel_buildBatchUpdateQuery_ValsCount(t *testing.T) {
  844. conn := testutil.GetTestSqlConn()
  845. dm := newSysRoleModel(conn, testutil.GetTestCacheConf(), testutil.GetTestCachePrefix())
  846. now := time.Now().Unix()
  847. for _, n := range []int{1, 2, 5, 10} {
  848. dataList := make([]*SysRole, n)
  849. for i := range dataList {
  850. dataList[i] = &SysRole{
  851. Id: int64(i + 1), ProductCode: "pc", Name: "n", Remark: "r",
  852. Status: 1, PermsLevel: 1, CreateTime: now, UpdateTime: now,
  853. }
  854. }
  855. _, vals := dm.buildBatchUpdateQuery(dataList)
  856. expected := n * 15
  857. assert.Equal(t, expected, len(vals), "n=%d", n)
  858. }
  859. }
  860. // TC-0366: findListByPrimaryKeys 空ids
  861. func TestSysRoleModel_findListByPrimaryKeys_Empty(t *testing.T) {
  862. conn := testutil.GetTestSqlConn()
  863. dm := newSysRoleModel(conn, testutil.GetTestCacheConf(), testutil.GetTestCachePrefix())
  864. list, err := dm.findListByPrimaryKeys(context.Background(), []interface{}{})
  865. require.NoError(t, err)
  866. require.Empty(t, list)
  867. }
  868. // TC-0367: findListByPrimaryKeys 正常ids
  869. func TestSysRoleModel_findListByPrimaryKeys_Normal(t *testing.T) {
  870. ctx := context.Background()
  871. conn := testutil.GetTestSqlConn()
  872. dm := newSysRoleModel(conn, testutil.GetTestCacheConf(), testutil.GetTestCachePrefix())
  873. tbl := dm.TableName()
  874. now := time.Now().Unix()
  875. pc := "pc_flbpk_" + testutil.UniqueId()
  876. res1, err := dm.Insert(ctx, &SysRole{ProductCode: pc, Name: "flbpk1_" + testutil.UniqueId(), Status: 1, PermsLevel: 1, CreateTime: now, UpdateTime: now})
  877. require.NoError(t, err)
  878. id1, _ := res1.LastInsertId()
  879. res2, err := dm.Insert(ctx, &SysRole{ProductCode: pc, Name: "flbpk2_" + testutil.UniqueId(), Status: 1, PermsLevel: 2, CreateTime: now, UpdateTime: now})
  880. require.NoError(t, err)
  881. id2, _ := res2.LastInsertId()
  882. t.Cleanup(func() { testutil.CleanTable(ctx, conn, tbl, id1, id2) })
  883. list, err := dm.findListByPrimaryKeys(ctx, []interface{}{id1, id2})
  884. require.NoError(t, err)
  885. require.Len(t, list, 2)
  886. }
  887. // TC-0368: findListByPrimaryKeys 部分不存在
  888. func TestSysRoleModel_findListByPrimaryKeys_PartialNotExist(t *testing.T) {
  889. ctx := context.Background()
  890. conn := testutil.GetTestSqlConn()
  891. dm := newSysRoleModel(conn, testutil.GetTestCacheConf(), testutil.GetTestCachePrefix())
  892. tbl := dm.TableName()
  893. now := time.Now().Unix()
  894. pc := "pc_flbpkp_" + testutil.UniqueId()
  895. res, err := dm.Insert(ctx, &SysRole{ProductCode: pc, Name: "flbpkp_" + testutil.UniqueId(), Status: 1, PermsLevel: 1, CreateTime: now, UpdateTime: now})
  896. require.NoError(t, err)
  897. id, _ := res.LastInsertId()
  898. t.Cleanup(func() { testutil.CleanTable(ctx, conn, tbl, id) })
  899. list, err := dm.findListByPrimaryKeys(ctx, []interface{}{id, int64(99999999)})
  900. require.NoError(t, err)
  901. require.Len(t, list, 1)
  902. assert.Equal(t, id, list[0].Id)
  903. }
  904. // TC-0369: findListByPrimaryKeys DB异常
  905. func TestSysRoleModel_findListByPrimaryKeys_DBError(t *testing.T) {
  906. badConn := sqlx.NewMysql("root:bad@tcp(127.0.0.1:1)/nodb")
  907. dm := newSysRoleModel(badConn, testutil.GetTestCacheConf(), testutil.GetTestCachePrefix())
  908. _, err := dm.findListByPrimaryKeys(context.Background(), []interface{}{int64(1)})
  909. require.Error(t, err)
  910. }
  911. // TC-0370: getPrimaryKeyValue 正常
  912. func TestSysRoleModel_getPrimaryKeyValue_Normal(t *testing.T) {
  913. conn := testutil.GetTestSqlConn()
  914. dm := newSysRoleModel(conn, testutil.GetTestCacheConf(), testutil.GetTestCachePrefix())
  915. data := &SysRole{Id: 42}
  916. val := dm.getPrimaryKeyValue(data)
  917. assert.Equal(t, int64(42), val)
  918. }
  919. // TC-0371: formatPrimary 正常
  920. func TestSysRoleModel_formatPrimary_Normal(t *testing.T) {
  921. conn := testutil.GetTestSqlConn()
  922. dm := newSysRoleModel(conn, testutil.GetTestCacheConf(), testutil.GetTestCachePrefix())
  923. key := dm.formatPrimary(123)
  924. assert.Contains(t, key, "cache:sysRole:id:")
  925. assert.Contains(t, key, "123")
  926. }
  927. // TC-0372: queryPrimary 正常
  928. func TestSysRoleModel_queryPrimary_Normal(t *testing.T) {
  929. ctx := context.Background()
  930. conn := testutil.GetTestSqlConn()
  931. dm := newSysRoleModel(conn, testutil.GetTestCacheConf(), testutil.GetTestCachePrefix())
  932. tbl := dm.TableName()
  933. now := time.Now().Unix()
  934. pc := "pc_qp_" + testutil.UniqueId()
  935. name := "qp_" + testutil.UniqueId()
  936. res, err := dm.Insert(ctx, &SysRole{ProductCode: pc, Name: name, Status: 1, PermsLevel: 1, CreateTime: now, UpdateTime: now})
  937. require.NoError(t, err)
  938. id, _ := res.LastInsertId()
  939. t.Cleanup(func() { testutil.CleanTable(ctx, conn, tbl, id) })
  940. var result SysRole
  941. err = dm.queryPrimary(ctx, conn, &result, id)
  942. require.NoError(t, err)
  943. assert.Equal(t, id, result.Id)
  944. assert.Equal(t, pc, result.ProductCode)
  945. assert.Equal(t, name, result.Name)
  946. }
  947. // TC-0373: cachePrefix为空
  948. func TestSysRoleModel_CachePrefix_Empty(t *testing.T) {
  949. oldId := cacheSysRoleIdPrefix
  950. oldName := cacheSysRoleProductCodeNamePrefix
  951. defer func() {
  952. cacheSysRoleIdPrefix = oldId
  953. cacheSysRoleProductCodeNamePrefix = oldName
  954. }()
  955. cacheSysRoleIdPrefix = "cache:sysRole:id:"
  956. cacheSysRoleProductCodeNamePrefix = "cache:sysRole:productCode:name:"
  957. dm := newSysRoleModel(testutil.GetTestSqlConn(), testutil.GetTestCacheConf(), "")
  958. key := dm.formatPrimary(123)
  959. assert.Equal(t, "cache:sysRole:id:123", key)
  960. }
  961. // TC-0374: cachePrefix非空
  962. func TestSysRoleModel_CachePrefix_NonEmpty(t *testing.T) {
  963. oldId := cacheSysRoleIdPrefix
  964. oldName := cacheSysRoleProductCodeNamePrefix
  965. defer func() {
  966. cacheSysRoleIdPrefix = oldId
  967. cacheSysRoleProductCodeNamePrefix = oldName
  968. }()
  969. dm := newSysRoleModel(testutil.GetTestSqlConn(), testutil.GetTestCacheConf(), "test")
  970. key := dm.formatPrimary(123)
  971. assert.Equal(t, "test:cache:sysRole:id:123", key)
  972. assert.True(t, strings.HasPrefix(key, "test:"))
  973. }
  974. // TC-0393: FindListByProductCode count查询失败(DB异常)
  975. func TestSysRoleModel_FindListByProductCode_DBError(t *testing.T) {
  976. badConn := sqlx.NewMysql("root:bad@tcp(127.0.0.1:1)/bad?timeout=1s")
  977. m := NewSysRoleModel(badConn, testutil.GetTestCacheConf(), testutil.GetTestCachePrefix())
  978. _, _, err := m.FindListByProductCode(context.Background(), "any", 1, 10)
  979. require.Error(t, err)
  980. }