github.com/kyma-incubator/compass/components/director@v0.0.0-20230623144113-d764f56ff805/internal/domain/scenarioassignment/repository_test.go (about)

     1  package scenarioassignment_test
     2  
     3  import (
     4  	"context"
     5  	"fmt"
     6  	"regexp"
     7  	"testing"
     8  
     9  	"github.com/pkg/errors"
    10  
    11  	"github.com/kyma-incubator/compass/components/director/internal/model"
    12  
    13  	"github.com/DATA-DOG/go-sqlmock"
    14  	"github.com/kyma-incubator/compass/components/director/internal/domain/scenarioassignment"
    15  	"github.com/kyma-incubator/compass/components/director/internal/domain/scenarioassignment/automock"
    16  	"github.com/kyma-incubator/compass/components/director/internal/repo/testdb"
    17  	"github.com/kyma-incubator/compass/components/director/pkg/persistence"
    18  	"github.com/stretchr/testify/assert"
    19  	"github.com/stretchr/testify/require"
    20  )
    21  
    22  func TestRepository_Create(t *testing.T) {
    23  	t.Run("Success", func(t *testing.T) {
    24  		// GIVEN
    25  
    26  		mockConverter := &automock.EntityConverter{}
    27  		mockConverter.On("ToEntity", fixModel()).Return(fixEntity()).Once()
    28  		defer mockConverter.AssertExpectations(t)
    29  
    30  		db, dbMock := testdb.MockDatabase(t)
    31  		defer dbMock.AssertExpectations(t)
    32  
    33  		dbMock.ExpectExec(regexp.QuoteMeta(`INSERT INTO public.automatic_scenario_assignments ( scenario, tenant_id, target_tenant_id ) VALUES ( ?, ?, ? )`)).
    34  			WithArgs(scenarioName, tenantID, targetTenantID).
    35  			WillReturnResult(sqlmock.NewResult(-1, 1))
    36  
    37  		ctx := persistence.SaveToContext(context.TODO(), db)
    38  		repo := scenarioassignment.NewRepository(mockConverter)
    39  
    40  		// WHEN
    41  		err := repo.Create(ctx, fixModel())
    42  
    43  		// THEN
    44  		assert.NoError(t, err)
    45  	})
    46  
    47  	t.Run("DB error", func(t *testing.T) {
    48  		// GIVEN
    49  
    50  		mockConverter := &automock.EntityConverter{}
    51  		mockConverter.On("ToEntity", fixModel()).Return(fixEntity()).Once()
    52  		defer mockConverter.AssertExpectations(t)
    53  
    54  		db, dbMock := testdb.MockDatabase(t)
    55  		defer dbMock.AssertExpectations(t)
    56  
    57  		dbMock.ExpectExec("INSERT INTO .*").WillReturnError(fixError())
    58  
    59  		ctx := persistence.SaveToContext(context.TODO(), db)
    60  		repo := scenarioassignment.NewRepository(mockConverter)
    61  
    62  		// WHEN
    63  		err := repo.Create(ctx, fixModel())
    64  
    65  		// THEN
    66  		require.EqualError(t, err, "Internal Server Error: Unexpected error while executing SQL query")
    67  	})
    68  }
    69  
    70  func TestRepository_GetByScenarioName(t *testing.T) {
    71  	ent := scenarioassignment.Entity{
    72  		Scenario:       scenarioName,
    73  		TenantID:       tenantID,
    74  		TargetTenantID: targetTenantID,
    75  	}
    76  
    77  	selectQuery := `SELECT scenario, tenant_id, target_tenant_id FROM public.automatic_scenario_assignments WHERE tenant_id = \$1 AND scenario = \$2`
    78  
    79  	t.Run("Success", func(t *testing.T) {
    80  		db, dbMock := testdb.MockDatabase(t)
    81  		defer dbMock.AssertExpectations(t)
    82  		rows := sqlmock.NewRows(fixAutomaticScenarioAssignmentColumns()).
    83  			AddRow(fixAutomaticScenarioAssignmentRow(scenarioName, tenantID, targetTenantID)...)
    84  
    85  		dbMock.ExpectQuery(selectQuery).
    86  			WithArgs(tenantID, scenarioName).
    87  			WillReturnRows(rows)
    88  
    89  		ctx := persistence.SaveToContext(context.TODO(), db)
    90  		convMock := &automock.EntityConverter{}
    91  		convMock.On("FromEntity", ent).Return(fixModel()).Once()
    92  		defer convMock.AssertExpectations(t)
    93  		repo := scenarioassignment.NewRepository(convMock)
    94  		// WHEN
    95  		_, err := repo.GetForScenarioName(ctx, tenantID, scenarioName)
    96  		// THEN
    97  		require.NoError(t, err)
    98  	})
    99  
   100  	t.Run("DB error", func(t *testing.T) {
   101  		// GIVEN
   102  		db, dbMock := testdb.MockDatabase(t)
   103  		defer dbMock.AssertExpectations(t)
   104  
   105  		dbMock.ExpectQuery(selectQuery).
   106  			WithArgs(tenantID, scenarioName).
   107  			WillReturnError(fixError())
   108  
   109  		ctx := persistence.SaveToContext(context.TODO(), db)
   110  		repo := scenarioassignment.NewRepository(nil)
   111  
   112  		// WHEN
   113  		_, err := repo.GetForScenarioName(ctx, tenantID, scenarioName)
   114  
   115  		// THEN
   116  		require.EqualError(t, err, "Internal Server Error: Unexpected error while executing SQL query")
   117  	})
   118  }
   119  
   120  func TestRepository_ListAll(t *testing.T) {
   121  	t.Run("Success", func(t *testing.T) {
   122  		// GIVEN
   123  		scenarioEntities := []scenarioassignment.Entity{fixEntityWithScenarioName(scenarioName),
   124  			fixEntityWithScenarioName("scenario-B")}
   125  		scenarioModels := []model.AutomaticScenarioAssignment{fixModelWithScenarioName(scenarioName),
   126  			fixModelWithScenarioName("scenario-B")}
   127  
   128  		mockConverter := &automock.EntityConverter{}
   129  		mockConverter.On("FromEntity", scenarioEntities[0]).Return(scenarioModels[0]).Once()
   130  		mockConverter.On("FromEntity", scenarioEntities[1]).Return(scenarioModels[1]).Once()
   131  		defer mockConverter.AssertExpectations(t)
   132  
   133  		db, dbMock := testdb.MockDatabase(t)
   134  		defer dbMock.AssertExpectations(t)
   135  		rowsToReturn := fixSQLRows([]sqlRow{
   136  			{scenario: scenarioName, tenantID: tenantID, targetTenantID: targetTenantID},
   137  			{scenario: "scenario-B", tenantID: tenantID, targetTenantID: targetTenantID},
   138  		})
   139  		dbMock.ExpectQuery(regexp.QuoteMeta(`SELECT scenario, tenant_id, target_tenant_id FROM public.automatic_scenario_assignments WHERE tenant_id = $1`)).
   140  			WithArgs(tenantID).
   141  			WillReturnRows(rowsToReturn)
   142  
   143  		ctx := persistence.SaveToContext(context.TODO(), db)
   144  		repo := scenarioassignment.NewRepository(mockConverter)
   145  
   146  		// WHEN
   147  		result, err := repo.ListAll(ctx, tenantID)
   148  
   149  		// THEN
   150  		assert.NoError(t, err)
   151  		assert.Equal(t, scenarioModels[0], *result[0])
   152  		assert.Equal(t, scenarioModels[1], *result[1])
   153  	})
   154  
   155  	t.Run("DB error", func(t *testing.T) {
   156  		// GIVEN
   157  
   158  		db, dbMock := testdb.MockDatabase(t)
   159  		defer dbMock.AssertExpectations(t)
   160  
   161  		dbMock.ExpectQuery("SELECT .*").WillReturnError(fixError())
   162  
   163  		ctx := persistence.SaveToContext(context.TODO(), db)
   164  		repo := scenarioassignment.NewRepository(nil)
   165  
   166  		// WHEN
   167  		result, err := repo.ListAll(ctx, tenantID)
   168  
   169  		// THEN
   170  		require.EqualError(t, err, "while getting automatic scenario assignments from db: Internal Server Error: Unexpected error while executing SQL query")
   171  		assert.Nil(t, result)
   172  	})
   173  }
   174  
   175  func TestRepository_ListForTargetTenant(t *testing.T) {
   176  	t.Run("Success", func(t *testing.T) {
   177  		// GIVEN
   178  		scenarioEntities := []scenarioassignment.Entity{fixEntityWithScenarioName(scenarioName),
   179  			fixEntityWithScenarioName("scenario-B")}
   180  		scenarioModels := []model.AutomaticScenarioAssignment{fixModelWithScenarioName(scenarioName),
   181  			fixModelWithScenarioName("scenario-B")}
   182  
   183  		mockConverter := &automock.EntityConverter{}
   184  		mockConverter.On("FromEntity", scenarioEntities[0]).Return(scenarioModels[0]).Once()
   185  		mockConverter.On("FromEntity", scenarioEntities[1]).Return(scenarioModels[1]).Once()
   186  		defer mockConverter.AssertExpectations(t)
   187  
   188  		db, dbMock := testdb.MockDatabase(t)
   189  		defer dbMock.AssertExpectations(t)
   190  		rowsToReturn := fixSQLRows([]sqlRow{
   191  			{scenario: scenarioName, tenantID: tenantID, targetTenantID: targetTenantID},
   192  			{scenario: "scenario-B", tenantID: tenantID, targetTenantID: targetTenantID},
   193  		})
   194  		dbMock.ExpectQuery(regexp.QuoteMeta(`SELECT scenario, tenant_id, target_tenant_id FROM public.automatic_scenario_assignments WHERE tenant_id = $1 AND target_tenant_id = $2`)).
   195  			WithArgs(tenantID, targetTenantID).
   196  			WillReturnRows(rowsToReturn)
   197  
   198  		ctx := persistence.SaveToContext(context.TODO(), db)
   199  		repo := scenarioassignment.NewRepository(mockConverter)
   200  
   201  		// WHEN
   202  		result, err := repo.ListForTargetTenant(ctx, tenantID, targetTenantID)
   203  
   204  		// THEN
   205  		assert.NoError(t, err)
   206  		assert.Equal(t, scenarioModels[0], *result[0])
   207  		assert.Equal(t, scenarioModels[1], *result[1])
   208  	})
   209  
   210  	t.Run("DB error", func(t *testing.T) {
   211  		// GIVEN
   212  
   213  		db, dbMock := testdb.MockDatabase(t)
   214  		defer dbMock.AssertExpectations(t)
   215  
   216  		dbMock.ExpectQuery("SELECT .*").WillReturnError(fixError())
   217  
   218  		ctx := persistence.SaveToContext(context.TODO(), db)
   219  		repo := scenarioassignment.NewRepository(nil)
   220  
   221  		// WHEN
   222  		result, err := repo.ListForTargetTenant(ctx, tenantID, targetTenantID)
   223  
   224  		// THEN
   225  		require.EqualError(t, err, "while getting automatic scenario assignments from db: Internal Server Error: Unexpected error while executing SQL query")
   226  		assert.Nil(t, result)
   227  	})
   228  }
   229  
   230  func TestRepository_List(t *testing.T) {
   231  	// GIVEN
   232  	ExpectedLimit := 3
   233  	ExpectedOffset := 0
   234  
   235  	inputPageSize := 3
   236  	inputCursor := ""
   237  	totalCount := 2
   238  
   239  	scenarioName1 := "foo"
   240  	scenarioName2 := "bar"
   241  
   242  	ent1 := fixEntityWithScenarioName(scenarioName1)
   243  	ent2 := fixEntityWithScenarioName(scenarioName2)
   244  
   245  	mod1 := fixModelWithScenarioName(scenarioName1)
   246  	mod2 := fixModelWithScenarioName(scenarioName2)
   247  
   248  	selectQuery := fmt.Sprintf(`^SELECT (.+) FROM public.automatic_scenario_assignments
   249  		WHERE tenant_id = \$1
   250  		ORDER BY scenario LIMIT %d OFFSET %d`, ExpectedLimit, ExpectedOffset)
   251  
   252  	rawCountQuery := `SELECT COUNT(*) FROM public.automatic_scenario_assignments WHERE tenant_id = $1`
   253  	countQuery := regexp.QuoteMeta(rawCountQuery)
   254  
   255  	t.Run("Success", func(t *testing.T) {
   256  		sqlxDB, sqlMock := testdb.MockDatabase(t)
   257  		rows := sqlmock.NewRows(fixAutomaticScenarioAssignmentColumns()).
   258  			AddRow(fixAutomaticScenarioAssignmentRow(scenarioName1, tenantID, targetTenantID)...).
   259  			AddRow(fixAutomaticScenarioAssignmentRow(scenarioName2, tenantID, targetTenantID)...)
   260  
   261  		sqlMock.ExpectQuery(selectQuery).
   262  			WithArgs(tenantID).
   263  			WillReturnRows(rows)
   264  
   265  		sqlMock.ExpectQuery(countQuery).
   266  			WithArgs(tenantID).
   267  			WillReturnRows(testdb.RowCount(2))
   268  
   269  		ctx := persistence.SaveToContext(context.TODO(), sqlxDB)
   270  		convMock := &automock.EntityConverter{}
   271  		convMock.On("FromEntity", ent1).Return(mod1)
   272  		convMock.On("FromEntity", ent2).Return(mod2)
   273  		repo := scenarioassignment.NewRepository(convMock)
   274  		// WHEN
   275  		modelAssignment, err := repo.List(ctx, tenantID, inputPageSize, inputCursor)
   276  		// THEN
   277  		require.NoError(t, err)
   278  		require.Len(t, modelAssignment.Data, 2)
   279  		assert.Equal(t, scenarioName1, modelAssignment.Data[0].ScenarioName)
   280  		assert.Equal(t, scenarioName2, modelAssignment.Data[1].ScenarioName)
   281  		assert.Equal(t, "", modelAssignment.PageInfo.StartCursor)
   282  		assert.Equal(t, totalCount, modelAssignment.TotalCount)
   283  
   284  		convMock.AssertExpectations(t)
   285  		sqlMock.AssertExpectations(t)
   286  	})
   287  
   288  	t.Run("DB Error", func(t *testing.T) {
   289  		// GIVEN
   290  		repo := scenarioassignment.NewRepository(nil)
   291  		sqlxDB, sqlMock := testdb.MockDatabase(t)
   292  		testError := errors.New("test error")
   293  
   294  		sqlMock.ExpectQuery(selectQuery).
   295  			WithArgs(tenantID).
   296  			WillReturnError(testError)
   297  		ctx := persistence.SaveToContext(context.TODO(), sqlxDB)
   298  
   299  		// WHEN
   300  		modelAssignment, err := repo.List(ctx, tenantID, inputPageSize, inputCursor)
   301  
   302  		// THEN
   303  		sqlMock.AssertExpectations(t)
   304  
   305  		assert.Nil(t, modelAssignment)
   306  		require.EqualError(t, err, "Internal Server Error: Unexpected error while executing SQL query")
   307  	})
   308  }
   309  
   310  func TestRepository_DeleteForTargetTenant(t *testing.T) {
   311  	deleteQuery := regexp.QuoteMeta(`DELETE FROM public.automatic_scenario_assignments WHERE tenant_id = $1 AND target_tenant_id = $2`)
   312  
   313  	t.Run("Success", func(t *testing.T) {
   314  		// GIVEN
   315  		db, dbMock := testdb.MockDatabase(t)
   316  		defer dbMock.AssertExpectations(t)
   317  
   318  		dbMock.ExpectExec(deleteQuery).
   319  			WithArgs(tenantID, targetTenantID).
   320  			WillReturnResult(sqlmock.NewResult(-1, 1))
   321  
   322  		ctx := persistence.SaveToContext(context.TODO(), db)
   323  		repo := scenarioassignment.NewRepository(nil)
   324  
   325  		// WHEN
   326  		err := repo.DeleteForTargetTenant(ctx, tenantID, targetTenantID)
   327  
   328  		// THEN
   329  		require.NoError(t, err)
   330  	})
   331  
   332  	t.Run("DB error", func(t *testing.T) {
   333  		// GIVEN
   334  		db, dbMock := testdb.MockDatabase(t)
   335  		defer dbMock.AssertExpectations(t)
   336  
   337  		dbMock.ExpectExec(deleteQuery).
   338  			WithArgs(tenantID, targetTenantID).
   339  			WillReturnError(fixError())
   340  
   341  		ctx := persistence.SaveToContext(context.TODO(), db)
   342  		repo := scenarioassignment.NewRepository(nil)
   343  
   344  		// WHEN
   345  		err := repo.DeleteForTargetTenant(ctx, tenantID, targetTenantID)
   346  
   347  		// THEN
   348  		require.EqualError(t, err, "Internal Server Error: Unexpected error while executing SQL query")
   349  	})
   350  }
   351  
   352  func TestRepository_DeleteForScenarioName(t *testing.T) {
   353  	t.Run("Success", func(t *testing.T) {
   354  		// GIVEN
   355  		db, dbMock := testdb.MockDatabase(t)
   356  		defer dbMock.AssertExpectations(t)
   357  
   358  		dbMock.ExpectExec(`^DELETE FROM public.automatic_scenario_assignments WHERE tenant_id = \$1 AND scenario = \$2$`).
   359  			WithArgs(tenantID, scenarioName).
   360  			WillReturnResult(sqlmock.NewResult(-1, 1))
   361  
   362  		ctx := persistence.SaveToContext(context.TODO(), db)
   363  		repo := scenarioassignment.NewRepository(nil)
   364  
   365  		// WHEN
   366  		err := repo.DeleteForScenarioName(ctx, tenantID, scenarioName)
   367  
   368  		// THEN
   369  		require.NoError(t, err)
   370  	})
   371  
   372  	t.Run("Database error", func(t *testing.T) {
   373  		// GIVEN
   374  		db, dbMock := testdb.MockDatabase(t)
   375  		defer dbMock.AssertExpectations(t)
   376  		dbMock.ExpectExec(`^DELETE FROM public.automatic_scenario_assignments WHERE tenant_id = \$1 AND scenario = \$2$`).
   377  			WithArgs(tenantID, scenarioName).
   378  			WillReturnError(fixError())
   379  
   380  		ctx := persistence.SaveToContext(context.TODO(), db)
   381  		repo := scenarioassignment.NewRepository(nil)
   382  
   383  		// WHEN
   384  		err := repo.DeleteForScenarioName(ctx, tenantID, scenarioName)
   385  
   386  		// THEN
   387  		require.EqualError(t, err, "Internal Server Error: Unexpected error while executing SQL query")
   388  	})
   389  }