github.com/kyma-incubator/compass/components/director@v0.0.0-20230623144113-d764f56ff805/internal/statusupdate/repo_test.go (about) 1 package statusupdate_test 2 3 import ( 4 "context" 5 "errors" 6 "fmt" 7 "regexp" 8 "testing" 9 "time" 10 11 "github.com/DATA-DOG/go-sqlmock" 12 13 "github.com/stretchr/testify/assert" 14 15 "github.com/kyma-incubator/compass/components/director/internal/repo/testdb" 16 "github.com/kyma-incubator/compass/components/director/internal/statusupdate" 17 "github.com/kyma-incubator/compass/components/director/pkg/persistence" 18 "github.com/stretchr/testify/require" 19 ) 20 21 const testID = "foo" 22 23 func TestRepository_IsConnected(t *testing.T) { 24 testError := errors.New("test") 25 26 t.Run("Success for applications", func(t *testing.T) { 27 // GIVEN 28 db, dbMock := testdb.MockDatabase(t) 29 defer dbMock.AssertExpectations(t) 30 dbMock.ExpectQuery(regexp.QuoteMeta(`SELECT 1 FROM public.applications WHERE id = $1 AND status_condition = 'CONNECTED'`)). 31 WithArgs(testID). 32 WillReturnRows(testdb.RowWhenObjectExist()) 33 ctx := persistence.SaveToContext(context.TODO(), db) 34 repo := statusupdate.NewRepository() 35 36 // WHEN 37 res, err := repo.IsConnected(ctx, testID, "applications") 38 39 // THEN 40 require.NoError(t, err) 41 assert.True(t, res) 42 }) 43 44 t.Run("Success for runtimes", func(t *testing.T) { 45 // GIVEN 46 db, dbMock := testdb.MockDatabase(t) 47 defer dbMock.AssertExpectations(t) 48 dbMock.ExpectQuery(regexp.QuoteMeta(`SELECT 1 FROM public.runtimes WHERE id = $1 AND status_condition = 'CONNECTED'`)). 49 WithArgs(testID). 50 WillReturnRows(testdb.RowWhenObjectExist()) 51 ctx := persistence.SaveToContext(context.TODO(), db) 52 repo := statusupdate.NewRepository() 53 54 // WHEN 55 res, err := repo.IsConnected(ctx, testID, "runtimes") 56 57 // THEN 58 require.NoError(t, err) 59 assert.True(t, res) 60 }) 61 62 t.Run("Error for applications", func(t *testing.T) { 63 // GIVEN 64 db, dbMock := testdb.MockDatabase(t) 65 defer dbMock.AssertExpectations(t) 66 dbMock.ExpectQuery(regexp.QuoteMeta(`SELECT 1 FROM public.applications WHERE id = $1 AND status_condition = 'CONNECTED'`)). 67 WithArgs(testID). 68 WillReturnError(testError) 69 ctx := persistence.SaveToContext(context.TODO(), db) 70 repo := statusupdate.NewRepository() 71 72 // WHEN 73 res, err := repo.IsConnected(ctx, testID, "applications") 74 75 // THEN 76 require.EqualError(t, err, fmt.Sprintf("while getting object from DB: %s", testError)) 77 assert.False(t, res) 78 }) 79 80 t.Run("Error for runtimes", func(t *testing.T) { 81 // GIVEN 82 db, dbMock := testdb.MockDatabase(t) 83 defer dbMock.AssertExpectations(t) 84 dbMock.ExpectQuery(regexp.QuoteMeta(`SELECT 1 FROM public.runtimes WHERE id = $1 AND status_condition = 'CONNECTED'`)). 85 WithArgs(testID). 86 WillReturnError(testError) 87 ctx := persistence.SaveToContext(context.TODO(), db) 88 repo := statusupdate.NewRepository() 89 90 // WHEN 91 res, err := repo.IsConnected(ctx, testID, "runtimes") 92 93 // THEN 94 require.EqualError(t, err, fmt.Sprintf("while getting object from DB: %s", testError)) 95 assert.False(t, res) 96 }) 97 } 98 99 func TestRepository_UpdateStatus(t *testing.T) { 100 timestamp := time.Now() 101 repo := statusupdate.NewRepository() 102 repo.SetTimestampGen(func() time.Time { return timestamp }) 103 testError := errors.New("test") 104 105 t.Run("Success for applications", func(t *testing.T) { 106 // GIVEN 107 db, dbMock := testdb.MockDatabase(t) 108 defer dbMock.AssertExpectations(t) 109 dbMock.ExpectExec(regexp.QuoteMeta(`UPDATE public.applications SET status_condition = 'CONNECTED', status_timestamp = $1 WHERE id = $2`)). 110 WithArgs(timestamp, testID). 111 WillReturnResult(sqlmock.NewResult(-1, 1)) 112 ctx := persistence.SaveToContext(context.TODO(), db) 113 114 // WHEN 115 err := repo.UpdateStatus(ctx, testID, "applications") 116 117 // THEN 118 require.NoError(t, err) 119 }) 120 t.Run("Success for runtimes", func(t *testing.T) { 121 // GIVEN 122 db, dbMock := testdb.MockDatabase(t) 123 defer dbMock.AssertExpectations(t) 124 dbMock.ExpectExec(regexp.QuoteMeta(`UPDATE public.runtimes SET status_condition = 'CONNECTED', status_timestamp = $1 WHERE id = $2`)). 125 WithArgs(timestamp, testID). 126 WillReturnResult(sqlmock.NewResult(-1, 1)) 127 ctx := persistence.SaveToContext(context.TODO(), db) 128 129 // WHEN 130 err := repo.UpdateStatus(ctx, testID, "runtimes") 131 132 // THEN 133 require.NoError(t, err) 134 }) 135 t.Run("Error for applications", func(t *testing.T) { 136 // GIVEN 137 db, dbMock := testdb.MockDatabase(t) 138 defer dbMock.AssertExpectations(t) 139 dbMock.ExpectExec(regexp.QuoteMeta(`UPDATE public.applications SET status_condition = 'CONNECTED', status_timestamp = $1 WHERE id = $2`)). 140 WithArgs(timestamp, testID). 141 WillReturnError(testError) 142 ctx := persistence.SaveToContext(context.TODO(), db) 143 144 // WHEN 145 err := repo.UpdateStatus(ctx, testID, "applications") 146 147 // THEN 148 require.EqualError(t, err, fmt.Sprintf("while updating applications status: %s", testError.Error())) 149 }) 150 151 t.Run("Error for runtimes", func(t *testing.T) { 152 // GIVEN 153 db, dbMock := testdb.MockDatabase(t) 154 defer dbMock.AssertExpectations(t) 155 dbMock.ExpectExec(regexp.QuoteMeta(`UPDATE public.runtimes SET status_condition = 'CONNECTED', status_timestamp = $1 WHERE id = $2`)). 156 WithArgs(timestamp, testID). 157 WillReturnError(testError) 158 ctx := persistence.SaveToContext(context.TODO(), db) 159 160 // WHEN 161 err := repo.UpdateStatus(ctx, testID, "runtimes") 162 163 // THEN 164 require.EqualError(t, err, fmt.Sprintf("while updating runtimes status: %s", testError.Error())) 165 }) 166 }