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  }