...

Source file src/edge-infra.dev/pkg/edge/api/services/organization_service_test.go

Documentation: edge-infra.dev/pkg/edge/api/services

     1  package services
     2  
     3  import (
     4  	"context"
     5  	"errors"
     6  	"testing"
     7  	"time"
     8  
     9  	"github.com/DATA-DOG/go-sqlmock"
    10  	"github.com/google/uuid"
    11  	"github.com/stretchr/testify/assert"
    12  
    13  	"edge-infra.dev/pkg/edge/api/bsl/types"
    14  	"edge-infra.dev/pkg/edge/api/graph/model"
    15  	"edge-infra.dev/pkg/edge/api/middleware"
    16  	sqlquery "edge-infra.dev/pkg/edge/api/sql"
    17  	edgetypes "edge-infra.dev/pkg/edge/api/types"
    18  	"edge-infra.dev/pkg/edge/bsl"
    19  	"edge-infra.dev/pkg/edge/constants/api/banner"
    20  	"edge-infra.dev/pkg/edge/controllers/util/edgedb"
    21  )
    22  
    23  var defaultCfg = &edgetypes.Config{}
    24  
    25  func TestBannerSQLEntry(t *testing.T) {
    26  	db, mock, err := sqlmock.New(sqlmock.QueryMatcherOption(sqlmock.QueryMatcherEqual))
    27  	if err != nil {
    28  		t.Fatalf("an error '%s' was not expected when opening a stub database connection", err)
    29  	}
    30  	defer db.Close()
    31  
    32  	mock.MatchExpectationsInOrder(false)
    33  	mock.ExpectQuery(sqlquery.GetTenantByOrgNameQuery).
    34  		WithArgs(testOrganization).
    35  		WillReturnRows(mock.NewRows([]string{"tenant_id"}).
    36  			AddRow(1))
    37  	mock.ExpectExec(sqlquery.BannerInsertQuery).
    38  		WithArgs("euid", testOrganization, "org", projectID, "1", "uuid", "description").
    39  		WillReturnResult(sqlmock.NewResult(1, 1))
    40  	mock.ExpectExec(sqlquery.DeleteBannerQuery).WithArgs("uuid").
    41  		WillReturnResult(sqlmock.NewResult(1, 1))
    42  	bslClient := bsl.NewBSLClient(types.BSPConfig{})
    43  	organizationService := NewBannerService(nil, nil, bslClient, "", db, defaultCfg)
    44  	contextWithAuth := middleware.NewContext(context.Background(), &types.AuthUser{
    45  		Username:     testUsername,
    46  		Token:        testBSLToken,
    47  		Organization: testOrganization,
    48  	})
    49  	//projectID, bannerName, bannerType, enterpriseUnitID, bannerUUID, description string
    50  	err = organizationService.CreateBannerSQLEntry(contextWithAuth, projectID, testOrganization, "org", "euid", "uuid", "description")
    51  	assert.NoError(t, err)
    52  	err = organizationService.DeleteBannerSQLEntry(contextWithAuth, "uuid")
    53  	assert.NoError(t, err)
    54  	if err := mock.ExpectationsWereMet(); err != nil {
    55  		t.Errorf("there were unfulfilled expectations: %s", err)
    56  	}
    57  }
    58  
    59  func TestGetPathEntry(t *testing.T) {
    60  	db, mock, err := sqlmock.New(sqlmock.QueryMatcherOption(sqlmock.QueryMatcherEqual))
    61  	if err != nil {
    62  		t.Fatalf("an error '%s' was not expected when opening a stub database connection", err)
    63  	}
    64  	defer db.Close()
    65  
    66  	mock.MatchExpectationsInOrder(false)
    67  	mock.ExpectQuery(sqlquery.GetBannerInfraInfo).
    68  		WithArgs().WillReturnError(errors.New("bad req"))
    69  
    70  	mock.ExpectQuery(sqlquery.GetBannerInfraInfo).
    71  		WithArgs().
    72  		WillReturnRows(mock.NewRows([]string{"clusterEdgeID", "clusterName", "projectID", "active"}).
    73  			AddRow("edge_id_path", "&clusterName", "&projectID", true))
    74  
    75  	organizationService := NewBannerService(nil, nil, nil, "", db, defaultCfg)
    76  	contextWithAuth := middleware.NewContext(context.Background(), &types.AuthUser{
    77  		Username:     testUsername,
    78  		Token:        testBSLToken,
    79  		Organization: testOrganization,
    80  	})
    81  	//projectID, bannerName, bannerType, enterpriseUnitID, bannerUUID, description string
    82  	path, err := organizationService.GetBannerInfraBucketPath(contextWithAuth)
    83  	assert.Error(t, err)
    84  	assert.Equal(t, "", path)
    85  	path, err = organizationService.GetBannerInfraBucketPath(contextWithAuth)
    86  	assert.NoError(t, err)
    87  	assert.Equal(t, "edge_id_path", path)
    88  	if err := mock.ExpectationsWereMet(); err != nil {
    89  		t.Errorf("there were unfulfilled expectations: %s", err)
    90  	}
    91  }
    92  
    93  func TestUpdateBannerSQLEntry(t *testing.T) {
    94  	db, mock, err := sqlmock.New(sqlmock.QueryMatcherOption(sqlmock.QueryMatcherEqual))
    95  	if err != nil {
    96  		t.Fatalf("an error '%s' was not expected when opening a stub database connection", err)
    97  	}
    98  	defer db.Close()
    99  	desc := "test-desc"
   100  	mock.ExpectExec(sqlquery.UpdateBanner).WithArgs("test-name", desc, "test-uuid").
   101  		WillReturnResult(sqlmock.NewResult(1, 1))
   102  	bslClient := bsl.NewBSLClient(types.BSPConfig{})
   103  	organizationService := NewBannerService(nil, nil, bslClient, "", db, defaultCfg)
   104  	err = organizationService.UpdateBannerSQL(context.Background(), &model.Banner{BannerEdgeID: "test-uuid", Name: "test-name", Description: &desc})
   105  	assert.NoError(t, err)
   106  	if err := mock.ExpectationsWereMet(); err != nil {
   107  		t.Errorf("there were unfulfilled expectations: %s", err)
   108  	}
   109  }
   110  
   111  func TestCreateBannerCr(t *testing.T) {
   112  	bslClient := bsl.NewBSLClient(types.BSPConfig{})
   113  	organizationService := NewBannerService(nil, nil, bslClient, "", nil, defaultCfg)
   114  	contextWithAuth := middleware.NewContext(context.Background(), &types.AuthUser{
   115  		Username:     testUsername,
   116  		Token:        testBSLToken,
   117  		Organization: testOrganization,
   118  	})
   119  	caps := []string{"cap1", "cap2"}
   120  	bannerCRD, err := organizationService.CreateBannerCr(contextWithAuth, uuid.NewString(), projectID, testOrganization, "euid", caps)
   121  	assert.NoError(t, err)
   122  	assert.NotEmpty(t, bannerCRD)
   123  }
   124  
   125  func TestBannerProjectID(t *testing.T) {
   126  	db, mock, err := sqlmock.New(sqlmock.QueryMatcherOption(sqlmock.QueryMatcherEqual))
   127  	if err != nil {
   128  		t.Fatalf("an error '%s' was not expected when opening a stub database connection", err)
   129  	}
   130  	defer db.Close()
   131  	mock.ExpectQuery(sqlquery.GetProjectIDByBanner).
   132  		WithArgs(testOrganization).
   133  		WillReturnRows(mock.NewRows([]string{"project_id"}).
   134  			AddRow(projectID))
   135  	bslClient := bsl.NewBSLClient(types.BSPConfig{})
   136  	organizationService := NewBannerService(nil, nil, bslClient, "", db, defaultCfg)
   137  	p, err := organizationService.GetBannerProjectID(context.Background(), testOrganization)
   138  	assert.NoError(t, err)
   139  	assert.Equal(t, p, projectID)
   140  }
   141  
   142  func TestBannerFromEdgeID(t *testing.T) {
   143  	db, mock, err := sqlmock.New(sqlmock.QueryMatcherOption(sqlmock.QueryMatcherEqual))
   144  	if err != nil {
   145  		t.Fatalf("an error '%s' was not expected when opening a stub database connection", err)
   146  	}
   147  	defer db.Close()
   148  	mock.ExpectQuery(sqlquery.GetBannerByID).
   149  		WithArgs(testOrgID).
   150  		WillReturnRows(mock.NewRows([]string{"banner_edge_id", "banner_bsl_id", "banner_name", "banner_type", "project_id", "tenant_edge_id", "description", "edge_sec_opt_in_compliance"}).
   151  			AddRow(testOrgID, testOrg, testOrg, "eu", projectID, "tenant", "desc", "true"))
   152  	bslClient := bsl.NewBSLClient(types.BSPConfig{})
   153  	organizationService := NewBannerService(nil, nil, bslClient, "", db, defaultCfg)
   154  	b, err := organizationService.GetBannerByEdgeID(context.Background(), testOrgID)
   155  	assert.NoError(t, err)
   156  	assert.Equal(t, b.BannerEdgeID, testOrgID)
   157  	assert.Equal(t, b.Name, testOrg)
   158  	assert.Equal(t, b.BannerType, "eu")
   159  	assert.Equal(t, b.BannerBSLId, testOrg)
   160  	assert.Equal(t, *b.Description, "desc")
   161  	assert.Equal(t, b.TenantEdgeID, "tenant")
   162  	assert.True(t, b.OptInEdgeSecurityCompliance)
   163  }
   164  
   165  func TestGetBannerTypeFromID(t *testing.T) {
   166  	db, mock, err := sqlmock.New(sqlmock.QueryMatcherOption(sqlmock.QueryMatcherEqual))
   167  	if err != nil {
   168  		t.Fatalf("an error '%s' was not expected when opening a stub database connection", err)
   169  	}
   170  	defer db.Close()
   171  	mock.ExpectQuery(sqlquery.GetBannerTypeFromIDQuery).
   172  		WithArgs(testBannerID).
   173  		WillReturnRows(mock.NewRows([]string{"banner_type"}).
   174  			AddRow("eu"))
   175  	bslClient := bsl.NewBSLClient(types.BSPConfig{})
   176  	organizationService := NewBannerService(nil, nil, bslClient, "", db, defaultCfg)
   177  	bannerType, err := organizationService.GetBannerTypeFromID(context.Background(), testBannerID)
   178  	assert.NoError(t, err)
   179  	assert.Equal(t, banner.EU, bannerType)
   180  }
   181  
   182  func TestGetBannerTypeFromUUID(t *testing.T) {
   183  	db, mock, err := sqlmock.New(sqlmock.QueryMatcherOption(sqlmock.QueryMatcherEqual))
   184  	if err != nil {
   185  		t.Fatalf("an error '%s' was not expected when opening a stub database connection", err)
   186  	}
   187  	defer db.Close()
   188  	mock.ExpectQuery(sqlquery.GetBannerTypeFromUUIDQuery).
   189  		WithArgs(testBanner).
   190  		WillReturnRows(mock.NewRows([]string{"banner_type"}).
   191  			AddRow("org"))
   192  	bslClient := bsl.NewBSLClient(types.BSPConfig{})
   193  	organizationService := NewBannerService(nil, nil, bslClient, "", db, defaultCfg)
   194  	bannerType, err := organizationService.GetBannerTypeFromUUID(context.Background(), testBanner)
   195  	assert.NoError(t, err)
   196  	assert.Equal(t, banner.Org, bannerType)
   197  }
   198  
   199  func TestGetBannerTenantInfo(t *testing.T) {
   200  	db, mock, err := sqlmock.New(sqlmock.QueryMatcherOption(sqlmock.QueryMatcherEqual))
   201  	if err != nil {
   202  		t.Fatalf("an error '%s' was not expected when opening a stub database connection", err)
   203  	}
   204  	defer db.Close()
   205  	mock.ExpectQuery(sqlquery.GetBannerTenantByOrgName).
   206  		WithArgs("test-org").
   207  		WillReturnRows(mock.NewRows([]string{"uuid", "org_id", "org_name"}).
   208  			AddRow("uuid", "test-org-id", "test-org"))
   209  	bslClient := bsl.NewBSLClient(types.BSPConfig{})
   210  	organizationService := NewBannerService(nil, nil, bslClient, "", db, defaultCfg)
   211  	tenantInfo, err := organizationService.GetBannerTenantInfo(context.Background(), "test-org")
   212  	assert.NoError(t, err)
   213  	assert.Equal(t, tenantInfo.TenantEdgeID, "uuid")
   214  	assert.Equal(t, tenantInfo.TenantBSLId, "test-org-id")
   215  	assert.Equal(t, tenantInfo.OrgName, "test-org")
   216  }
   217  
   218  func TestGetBannerInfoNoBanner(t *testing.T) {
   219  	db, mock, err := sqlmock.New(sqlmock.QueryMatcherOption(sqlmock.QueryMatcherEqual))
   220  	if err != nil {
   221  		t.Fatalf("an error '%s' was not expected when opening a stub database connection", err)
   222  	}
   223  	defer db.Close()
   224  	mock.ExpectQuery(sqlquery.GetBannerByBSLID).
   225  		WithArgs("test-bsl-id").
   226  		WillReturnRows(mock.NewRows([]string{"banner_edge_id", "banner_bsl_id", "banner_name", "banner_type", "project_id", "tenant_edge_id", "description"}))
   227  	bslClient := bsl.NewBSLClient(types.BSPConfig{})
   228  	organizationService := NewBannerService(nil, nil, bslClient, "", db, defaultCfg)
   229  	banner := &model.Banner{Name: "test-banner", BannerBSLId: "test-bsl-id"}
   230  	bannerInfo := organizationService.GetEdgeBannerInfo(context.Background(), []*model.Banner{banner})
   231  	assert.Equal(t, bannerInfo, []*model.Banner{})
   232  }
   233  
   234  func TestGetClusterInfraInfo(t *testing.T) {
   235  	db, mock, err := sqlmock.New(sqlmock.QueryMatcherOption(sqlmock.QueryMatcherEqual))
   236  	if err != nil {
   237  		t.Fatalf("an error '%s' was not expected when opening a stub database connection", err)
   238  	}
   239  	defer db.Close()
   240  	active := true
   241  	mock.ExpectQuery(sqlquery.GetClusterInfraInfo).
   242  		WithArgs("test-banner-edge-id").
   243  		WillReturnRows(mock.NewRows([]string{"cluster_edge_id", "cluster_name", "project_id", "active"}).
   244  			AddRow("test-cluster-edge-id", "test=cluster", testOrg, &active))
   245  	bslClient := bsl.NewBSLClient(types.BSPConfig{})
   246  	organizationService := NewBannerService(nil, nil, bslClient, "", db, defaultCfg)
   247  	cluster, err := organizationService.GetClusterInfraInfo(context.Background(), "test-banner-edge-id")
   248  	assert.NoError(t, err)
   249  	assert.Equal(t, cluster.ClusterEdgeID, "test-cluster-edge-id")
   250  	assert.Equal(t, *cluster.Active, true)
   251  	assert.Equal(t, cluster.BannerEdgeID, "test-banner-edge-id")
   252  }
   253  
   254  func TestDeleteClusterSQLEntryForBanner(t *testing.T) {
   255  	db, mock, err := sqlmock.New(sqlmock.QueryMatcherOption(sqlmock.QueryMatcherEqual))
   256  	if err != nil {
   257  		t.Fatalf("an error '%s' was not expected when opening a stub database connection", err)
   258  	}
   259  	defer db.Close()
   260  	mock.ExpectExec(sqlquery.DeleteClusterQuery).WithArgs("test-cluster-id").WillReturnResult(sqlmock.NewResult(0, 0))
   261  	bslClient := bsl.NewBSLClient(types.BSPConfig{})
   262  	organizationService := NewBannerService(nil, nil, bslClient, "", db, defaultCfg)
   263  	err = organizationService.DeleteClusterSQLEntry(context.Background(), "test-cluster-id")
   264  	assert.NoError(t, err)
   265  }
   266  
   267  func TestDeleteOrgBanner(t *testing.T) {
   268  	srv := getMockBspServer(t)
   269  	defer srv.Close()
   270  	appConfig := edgetypes.Config{
   271  		BSP: types.BSPConfig{
   272  			Endpoint: srv.URL,
   273  		},
   274  	}
   275  	bslClient := bsl.NewBSLClient(appConfig.BSP)
   276  	organizationService := NewBannerService(nil, nil, bslClient, "", nil, defaultCfg)
   277  	contextWithAuth := middleware.NewContext(context.Background(), &types.AuthUser{
   278  		Username:     testUsername,
   279  		Token:        testBSLToken,
   280  		Organization: testOrganization,
   281  	})
   282  	deleted, err := organizationService.DeleteOrgBanner(contextWithAuth, testBannerID)
   283  	assert.Nil(t, err)
   284  	assert.Equal(t, deleted, true)
   285  }
   286  
   287  func TestDeleteEUBanner(t *testing.T) {
   288  	srv := getMockBspServer(t)
   289  	defer srv.Close()
   290  	appConfig := edgetypes.Config{
   291  		BSP: types.BSPConfig{
   292  			Endpoint: srv.URL,
   293  		},
   294  	}
   295  	bslClient := bsl.NewBSLClient(appConfig.BSP)
   296  	organizationService := NewBannerService(nil, nil, bslClient, "", nil, defaultCfg)
   297  	contextWithAuth := middleware.NewContext(context.Background(), &types.AuthUser{
   298  		Username:     testUsername,
   299  		Token:        testBSLToken,
   300  		Organization: testOrganization,
   301  	})
   302  	deleted, err := organizationService.DeleteEUBanner(contextWithAuth, testBanner, testBannerID)
   303  	assert.Nil(t, err)
   304  	assert.Equal(t, deleted, true)
   305  }
   306  
   307  func TestUpdateOrgBanner(t *testing.T) {
   308  	srv := getMockBspServer(t)
   309  	defer srv.Close()
   310  	appConfig := edgetypes.Config{
   311  		BSP: types.BSPConfig{
   312  			Endpoint: srv.URL,
   313  		},
   314  	}
   315  	bslClient := bsl.NewBSLClient(appConfig.BSP)
   316  	organizationService := NewBannerService(nil, nil, bslClient, "", nil, defaultCfg)
   317  	contextWithAuth := middleware.NewContext(context.Background(), &types.AuthUser{
   318  		Username:     testUsername,
   319  		Token:        testBSLToken,
   320  		Organization: testOrganization,
   321  	})
   322  	desc := "new-description"
   323  	err := organizationService.UpdateOrgBanner(contextWithAuth, &model.Banner{BannerBSLId: "banner-edge-id", Name: "new-name", Description: &desc})
   324  	assert.Nil(t, err)
   325  }
   326  
   327  func TestUpdateEUBanner(t *testing.T) {
   328  	srv := getMockBspServer(t)
   329  	defer srv.Close()
   330  	appConfig := edgetypes.Config{
   331  		BSP: types.BSPConfig{
   332  			Endpoint: srv.URL,
   333  		},
   334  	}
   335  	bslClient := bsl.NewBSLClient(appConfig.BSP)
   336  	organizationService := NewBannerService(nil, nil, bslClient, "", nil, defaultCfg)
   337  	contextWithAuth := middleware.NewContext(context.Background(), &types.AuthUser{
   338  		Username:     testUsername,
   339  		Token:        testBSLToken,
   340  		Organization: testOrganization,
   341  	})
   342  	desc := "new-description"
   343  	err := organizationService.UpdateEUBanner(contextWithAuth, &model.Banner{BannerBSLId: "test-banner", Name: "new-name", Description: &desc})
   344  	assert.Nil(t, err)
   345  }
   346  
   347  func TestGetUserAssignedBanner(t *testing.T) {
   348  	db, mock, err := sqlmock.New(sqlmock.QueryMatcherOption(sqlmock.QueryMatcherEqual))
   349  	if err != nil {
   350  		t.Fatalf("an error '%s' was not expected when opening a stub database connection", err)
   351  	}
   352  	defer db.Close()
   353  	mock.ExpectQuery(sqlquery.GetBannerByBSLID).WithArgs("test-org-id").
   354  		WillReturnRows(sqlmock.NewRows([]string{"banner_edge_id", "banner_bsl_id", "banner_name", "banner_type", "project_id", "tenant_edge_id", "description", "bsl_data_synced", "bsl_entity_types", "edge_sec_opt_in_compliance"}).
   355  			AddRow("test-org-id", "test-org-banner", "eu-banner-bsl-id2", "EU", "eu-banner-bsl-id3", "eu-banner-bsl-id4", "eu-banner-bsl-id5", false, nil, true))
   356  	mock.ExpectQuery(sqlquery.GetBannerByBSLID).WithArgs("test-org-banner").
   357  		WillReturnRows(sqlmock.NewRows([]string{"banner_edge_id", "banner_bsl_id", "banner_name", "banner_type", "project_id", "tenant_edge_id", "description", "bsl_data_synced", "bsl_entity_types", "edge_sec_opt_in_compliance"}).
   358  			AddRow("test-org-banner", "test-org-banner", "eu-banner-bsl-id2", "EU", "eu-banner-bsl-id3", "eu-banner-bsl-id4", "eu-banner-bsl-id5", false, nil, true))
   359  	mock.ExpectQuery(sqlquery.GetBannerByBSLID).WithArgs("eu-banner-bsl-id").
   360  		WillReturnRows(sqlmock.NewRows([]string{"banner_edge_id", "banner_bsl_id", "banner_name", "banner_type", "project_id", "tenant_edge_id", "description", "bsl_data_synced", "bsl_entity_types", "edge_sec_opt_in_compliance"}).
   361  			AddRow("eu-banner-bsl-id", "test-org-banner", "eu-banner-bsl-id2", "EU", "eu-banner-bsl-id3", "eu-banner-bsl-id4", "eu-banner-bsl-id5", false, nil, true))
   362  
   363  	srv := getMockBspServer(t)
   364  	defer srv.Close()
   365  	appConfig := edgetypes.Config{
   366  		BSP: types.BSPConfig{
   367  			Endpoint: srv.URL,
   368  		},
   369  	}
   370  	bslClient := bsl.NewBSLClient(appConfig.BSP)
   371  	organizationService := NewBannerService(nil, nil, bslClient, "", db, defaultCfg)
   372  	contextWithAuth := middleware.NewContext(context.Background(), &types.AuthUser{
   373  		Username:     testUsername,
   374  		Token:        testBSLToken,
   375  		Organization: testOrganization,
   376  	})
   377  	username := "test"
   378  	_, err = organizationService.GetUserAssignedBanners(contextWithAuth, username)
   379  	assert.NoError(t, err)
   380  }
   381  
   382  func TestUpdateBannerRemoteAccessIP(t *testing.T) {
   383  	db, mock, err := sqlmock.New(sqlmock.QueryMatcherOption(sqlmock.QueryMatcherEqual))
   384  	if err != nil {
   385  		t.Fatalf("an error '%s' was not expected when opening a stub database connection", err)
   386  	}
   387  	defer db.Close()
   388  	remoteAccessIP := "34.123.45.68"
   389  	bannerEdgeID := "3396a52c-6a22-4049-9593-5a63b596a101"
   390  	mock.ExpectExec(sqlquery.UpdateBannerRemoteAccessIP).
   391  		WithArgs(remoteAccessIP, bannerEdgeID).
   392  		WillReturnResult(sqlmock.NewResult(1, 1))
   393  	organizationService := NewBannerService(nil, nil, nil, "", db, defaultCfg)
   394  	err = organizationService.UpdateBannerRemoteAccessIP(context.Background(), remoteAccessIP, bannerEdgeID)
   395  	assert.NoError(t, err)
   396  	assert.NoError(t, mock.ExpectationsWereMet())
   397  }
   398  
   399  func TestGetBannerInfraStatus(t *testing.T) {
   400  	db, mock, err := sqlmock.New(sqlmock.QueryMatcherOption(sqlmock.QueryMatcherEqual))
   401  	if err != nil {
   402  		t.Fatalf("an error '%s' was not expected when opening a stub database connection", err)
   403  	}
   404  	defer db.Close()
   405  
   406  	currTime := time.Now().Format(time.RFC3339)
   407  	testCases := []struct {
   408  		name                  string
   409  		expectedStatusReason  string
   410  		expectedStatusMessage string
   411  		isReady               bool
   412  		sqlMock               func() *sqlmock.ExpectedQuery
   413  	}{
   414  		{
   415  			name:                  "READY infra status",
   416  			expectedStatusReason:  ProvisionedStatus,
   417  			expectedStatusMessage: "ProvisionSucceeded: banner reconciled successfully",
   418  			isReady:               true,
   419  			sqlMock: func() *sqlmock.ExpectedQuery {
   420  				return mock.ExpectQuery(sqlquery.GetBannerInfraStatusByBannerEdgeID).
   421  					WithArgs(testBanner).
   422  					WillReturnRows(mock.NewRows([]string{"infra_status", "infra_status_details", "infra_status_updated_at"}).
   423  						AddRow(string(edgedb.InfraStatusReady), "ProvisionSucceeded: banner reconciled successfully", currTime))
   424  			},
   425  		},
   426  		{
   427  			name:                  "ERROR infra status",
   428  			expectedStatusReason:  string(edgedb.InfraStatusProvisioning),
   429  			expectedStatusMessage: "ProjectNotReady: project is not ready: UpdateFailed",
   430  			isReady:               false,
   431  			sqlMock: func() *sqlmock.ExpectedQuery {
   432  				return mock.ExpectQuery(sqlquery.GetBannerInfraStatusByBannerEdgeID).
   433  					WithArgs(testBanner).
   434  					WillReturnRows(mock.NewRows([]string{"infra_status", "infra_status_details", "infra_status_updated_at"}).
   435  						AddRow(string(edgedb.InfraStatusError), "ProjectNotReady: project is not ready: UpdateFailed", currTime))
   436  			},
   437  		},
   438  		{
   439  			name:                  "PROVISIONING infra status",
   440  			expectedStatusReason:  string(edgedb.InfraStatusProvisioning),
   441  			expectedStatusMessage: "Ready condition not found",
   442  			isReady:               false,
   443  			sqlMock: func() *sqlmock.ExpectedQuery {
   444  				return mock.ExpectQuery(sqlquery.GetBannerInfraStatusByBannerEdgeID).
   445  					WithArgs(testBanner).
   446  					WillReturnRows(mock.NewRows([]string{"infra_status", "infra_status_details", "infra_status_updated_at"}).
   447  						AddRow(string(edgedb.InfraStatusProvisioning), "Ready condition not found", currTime))
   448  			},
   449  		},
   450  		{
   451  			name:                  "No/Empty infra status",
   452  			expectedStatusReason:  string(edgedb.InfraStatusProvisioning),
   453  			expectedStatusMessage: ProvisioningStatusMessage,
   454  			isReady:               false,
   455  			sqlMock: func() *sqlmock.ExpectedQuery {
   456  				return mock.ExpectQuery(sqlquery.GetBannerInfraStatusByBannerEdgeID).
   457  					WithArgs(testBanner).
   458  					WillReturnRows(mock.NewRows([]string{"infra_status", "infra_status_details", "infra_status_updated_at"}).
   459  						AddRow("", "", ""))
   460  			},
   461  		},
   462  	}
   463  
   464  	bannerService := NewBannerService(nil, nil, nil, "", db, defaultCfg)
   465  	for _, tc := range testCases {
   466  		tc := tc
   467  		t.Run(tc.name, func(t *testing.T) {
   468  			tc.sqlMock()
   469  			status, err := bannerService.GetBannerInfraStatus(context.Background(), testBanner)
   470  			assert.NoError(t, err)
   471  			assert.NotEmpty(t, status)
   472  			assert.Equal(t, tc.expectedStatusReason, status.Reason)
   473  			assert.Equal(t, tc.expectedStatusMessage, status.Message)
   474  			assert.Equal(t, tc.isReady, status.Ready)
   475  			assert.NotEmpty(t, status.LastUpdatedAt)
   476  
   477  			_, err = time.Parse(time.RFC3339, status.LastUpdatedAt)
   478  			assert.NoError(t, err)
   479  		})
   480  	}
   481  
   482  	err = mock.ExpectationsWereMet()
   483  	assert.NoError(t, err)
   484  }
   485  

View as plain text