github.com/angryronald/go-kit@v0.0.0-20240505173814-ff2bd9c79dbf/generic/repository/sql/repositorytest/generic.immutable.repository_test.go (about) 1 package repositorytest 2 3 import ( 4 "context" 5 "fmt" 6 "testing" 7 "time" 8 9 "github.com/google/uuid" 10 "github.com/sirupsen/logrus" 11 12 "github.com/angryronald/go-kit/generic/repository" 13 "github.com/angryronald/go-kit/generic/repository/sql" 14 ) 15 16 var immutableSample *ImmutableTestModel 17 18 func init() { 19 isDone = false 20 immutableSample = &ImmutableTestModel{ 21 ID: TEST_ID, 22 Text: "text", 23 CreatedAt: time.Now().UTC(), 24 CreatedBy: uuid.Nil, 25 } 26 } 27 28 func preSeedingImmutable() { 29 mutex.Lock() 30 if !isDone { 31 if err := db.Create(immutableSample).Error; err != nil { 32 logrus.Debugf("failed to inject data: %v", err) 33 } 34 isDone = true 35 } 36 mutex.Unlock() 37 } 38 39 func TestImmutableGenericRepository_FindAll(t *testing.T) { 40 repo := sql.NewImmutableRepository(db) 41 42 ctx := context.Background() 43 params := map[string]interface{}{"text": "text"} 44 conditionalOperations := []repository.ConditionalOperation{repository.EQUAL_WITH} 45 page := 1 46 limit := 10 47 48 preSeedingImmutable() 49 // defer removePreseeding() 50 51 resultsRaw, err := repo.FindAll(ctx, params, conditionalOperations, nil, page, limit, []*ImmutableTestModel{}) 52 if err != nil { 53 t.Fatalf("Error in FindAll: %v", err) 54 } 55 56 /* 57 alternative casting: 58 results := []*TestModel{} 59 cast.TransformObject(resultsRaw, &results) 60 */ 61 results := resultsRaw.([]*ImmutableTestModel) 62 if len(results) != 1 { 63 t.Fatalf("Expected 1 result, but got %d", len(results)) 64 } 65 } 66 67 func TestImmutableGenericRepository_FindAll_WithRelationalOperation(t *testing.T) { 68 repo := sql.NewImmutableRepository(db) 69 70 ctx := context.Background() 71 params := map[string]interface{}{ 72 "text": "text", 73 `"id"`: TEST_ID, 74 } 75 conditionalOperations := []repository.ConditionalOperation{repository.EQUAL_WITH, repository.EQUAL_WITH} 76 relationalOperations := []repository.RelationalOperation{repository.AND} 77 page := 1 78 limit := 10 79 80 preSeedingImmutable() 81 // defer removePreseeding() 82 83 resultsRaw, err := repo.FindAll(ctx, params, conditionalOperations, relationalOperations, page, limit, []*ImmutableTestModel{}) 84 if err != nil { 85 t.Fatalf("Error in FindAll: %v", err) 86 } 87 88 /* 89 alternative casting: 90 results := []*TestModel{} 91 cast.TransformObject(resultsRaw, &results) 92 */ 93 results := resultsRaw.([]*ImmutableTestModel) 94 if len(results) != 1 { 95 t.Fatalf("Expected 1 result, but got %d", len(results)) 96 } 97 } 98 99 func TestImmutableGenericRepository_FindOne(t *testing.T) { 100 repo := sql.NewImmutableRepository(db) 101 102 ctx := context.Background() 103 key := "text" 104 value := "text" 105 106 preSeedingImmutable() 107 // defer removePreseeding() 108 109 result := &ImmutableTestModel{} 110 _, err := repo.FindOne(ctx, key, value, result) 111 if err != nil { 112 t.Fatalf("Error in FindOne: %v", err) 113 } 114 115 if result.ID != immutableSample.ID || result.Text != immutableSample.Text { 116 t.Fatalf("Unexpected result: %+v", result) 117 } 118 } 119 120 func TestImmutableGenericRepository_FindByID(t *testing.T) { 121 repo := sql.NewImmutableRepository(db) 122 123 id := TEST_ID 124 125 preSeedingImmutable() 126 // defer removePreseeding() 127 128 ctx := context.Background() 129 result := &ImmutableTestModel{} 130 _, err := repo.FindByID(ctx, id, result) 131 if err != nil { 132 t.Fatalf("Error in FindByID: %v", err) 133 } 134 135 if result.ID != id || result.Text != immutableSample.Text { 136 t.Fatalf("Unexpected result: %+v", result) 137 } 138 } 139 140 func TestImmutableGenericRepository_Insert(t *testing.T) { 141 repo := sql.NewImmutableRepository(db) 142 143 ctx := context.Background() 144 id, _ := uuid.NewRandom() 145 data := &ImmutableTestModel{ 146 ID: id, 147 Text: "test insert", 148 CreatedAt: time.Now().UTC(), 149 CreatedBy: uuid.Nil, 150 } 151 152 result, err := repo.Insert(ctx, data) 153 if err != nil { 154 t.Fatalf("Error in Insert: %v", err) 155 } 156 157 if result.(*ImmutableTestModel) == nil { 158 t.Fatalf("Unexpected result: %+v", result) 159 } 160 } 161 162 func TestImmutableGenericRepository_BulkInsert(t *testing.T) { 163 id, _ := uuid.NewRandom() 164 secondId, _ := uuid.NewRandom() 165 sample.ID = secondId 166 data := []*ImmutableTestModel{ 167 immutableSample, 168 &ImmutableTestModel{ 169 ID: id, 170 Text: "test bulk insert", 171 CreatedAt: time.Now().UTC(), 172 CreatedBy: uuid.Nil, 173 }, 174 } 175 176 repo := sql.NewImmutableRepository(db) 177 178 ctx := context.Background() 179 180 resultsRaw, err := repo.BulkInsert(ctx, data) 181 if err != nil { 182 t.Fatalf("Error in BulkInsert: %v", err) 183 } 184 185 /* 186 alternative casting: 187 results := []*TestModel{} 188 cast.TransformObject(resultsRaw, &results) 189 */ 190 results := resultsRaw.([]*ImmutableTestModel) 191 if len(results) != 2 { 192 t.Fatalf("Expected 2 results, but got %d", len(results)) 193 } 194 } 195 196 func TestImmutableGenericRepository_Query(t *testing.T) { 197 repo := sql.NewImmutableRepository(db) 198 199 ctx := context.Background() 200 id, _ := uuid.NewRandom() 201 params := []interface{}{ 202 "text", 203 id, 204 } 205 206 data := &ImmutableTestModel{ 207 ID: id, 208 Text: "text", 209 CreatedAt: time.Now().UTC(), 210 CreatedBy: uuid.Nil, 211 } 212 213 if err := db.Create(data).Error; err != nil { 214 logrus.Debugf("failed to inject data: %v", err) 215 } 216 217 result := []*ImmutableTestModel{} 218 resultsRaw, err := repo.Query( 219 ctx, 220 fmt.Sprintf(` 221 SELECT 222 * 223 FROM 224 %s 225 WHERE 226 text = ? AND id = ? 227 `, repository.GetTableName(&ImmutableTestModel{})), 228 params, 229 result, 230 ) 231 if err != nil { 232 t.Fatalf("Error in Query: %v", err) 233 } 234 235 /* 236 alternative casting: 237 results := []*TestModel{} 238 cast.TransformObject(resultsRaw, &results) 239 */ 240 results := resultsRaw.([]*ImmutableTestModel) 241 if len(results) != 1 { 242 t.Fatalf("Expected 1 result, but got %d", len(results)) 243 } 244 }