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  }