// package system_test // @Link https://github.com/xiujiecn/xiu-admin // @Copyright Copyright (c) 2025 LiXiujie // @Author Lxj // @License https://github.com/xiujiecn/xiu-admin/blob/master/LICENSE package system_test import ( "context" "testing" "git.5iot.com/iotlcm-public/iotlcm-app/internal/library/contexts" _ "git.5iot.com/iotlcm-public/iotlcm-app/internal/logic/memorydb" "git.5iot.com/iotlcm-public/iotlcm-app/internal/model" "git.5iot.com/iotlcm-public/iotlcm-app/internal/service" _ "github.com/gogf/gf/contrib/drivers/sqlite/v2" "github.com/gogf/gf/v2/database/gdb" "github.com/gogf/gf/v2/frame/g" ) type deptTestMemoryDB struct { service.IMemoryDB database gdb.DB } func (memory *deptTestMemoryDB) DB(ctx context.Context) gdb.DB { return memory.database } func TestSysDept_RefreshDeptAncestors(t *testing.T) { var ( ctx = contexts.Set(context.Background(), &model.Context{ User: &model.Identity{BaseClaims: model.BaseClaims{ID: 1, TenantId: "A", DeptId: 1}}, }) previous = gdb.GetConfig("default") previousMemory = service.MemoryDB() ) if err := gdb.SetConfigGroup("default", gdb.ConfigGroup{{Type: "sqlite", Link: "sqlite::@file(:memory:)", MaxOpenConnCount: 1}}); err != nil { t.Fatal(err) } database := g.DB() service.RegisterMemoryDB(&deptTestMemoryDB{database: database}) t.Cleanup(func() { service.RegisterMemoryDB(previousMemory) if err := database.GetCore().ClearCacheAll(ctx); err != nil { t.Error(err) } if err := database.Close(ctx); err != nil { t.Error(err) } if err := gdb.SetConfigGroup("default", previous); err != nil { t.Error(err) } }) if err := database.GetCore().ClearCacheAll(ctx); err != nil { t.Fatal(err) } statements := []string{ "CREATE TABLE sys_dept (dept_id INTEGER PRIMARY KEY, parent_id INTEGER, tenant_id TEXT, ancestors TEXT, updated_at DATETIME, deleted_at DATETIME)", "INSERT INTO sys_dept VALUES (1,0,'A','wrong',NULL,NULL),(2,1,'A','wrong',NULL,NULL),(3,2,'A','wrong',NULL,NULL),(4,1,'B','other-tenant',NULL,NULL),(5,1,'A','deleted',NULL,'2026-01-01')", } for _, statement := range statements { if _, err := database.Exec(ctx, statement); err != nil { t.Fatal(err) } } for attempt := 0; attempt < 2; attempt++ { if err := service.SysDept().RefreshDeptAncestors(ctx); err != nil { t.Fatal(err) } for deptID, expected := range map[int]string{1: "0,", 2: "0,1,", 3: "0,1,2,", 4: "other-tenant", 5: "deleted"} { actual, err := database.GetValue(ctx, "SELECT ancestors FROM sys_dept WHERE dept_id = ?", deptID) if err != nil { t.Fatal(err) } if actual.String() != expected { t.Fatalf("attempt=%d, dept=%d, ancestors=%q, expected=%q", attempt, deptID, actual.String(), expected) } } } }