package services import ( "context" "testing" "github.com/DATA-DOG/go-sqlmock" "github.com/stretchr/testify/assert" "edge-infra.dev/pkg/edge/api/graph/model" ) // TestGetBannerConfig tests whether get returns a banner config with the expected values func TestGetBannerConfig(t *testing.T) { db, mock, err := sqlmock.New() assert.NoError(t, err) defer db.Close() service := NewBannerConfigService(db) rows := sqlmock.NewRows([]string{"config_key", "config_value"}). AddRow(VNCReadWriteAuthRequired, "true"). AddRow(VNCReadWriteAuthRequiredOverride, "false"). AddRow(VNCReadAuthRequired, "true"). AddRow(VNCReadAuthRequiredOverride, "false") mock.ExpectQuery("SELECT config_key, config_value FROM banner_configs WHERE banner_edge_id = \\$1"). WithArgs("test-banner-edge-id"). WillReturnRows(rows) cfg, err := service.GetBannerConfig(context.Background(), "test-banner-edge-id") assert.NoError(t, err) assert.NotNil(t, cfg) assert.Equal(t, true, cfg.VncReadWriteAuthRequired) assert.Equal(t, false, cfg.VncReadWriteAuthRequiredOverride) assert.Equal(t, true, cfg.VncReadAuthRequired) assert.Equal(t, false, cfg.VncReadAuthRequiredOverride) assert.NoError(t, mock.ExpectationsWereMet()) } // TestGetBannerConfigDefault tests whether get returns a banner config with the default values (false for all) func TestGetBannerConfigDefault(t *testing.T) { db, mock, err := sqlmock.New() assert.NoError(t, err) defer db.Close() service := NewBannerConfigService(db) // No existing rows mock.ExpectQuery("SELECT config_key, config_value FROM banner_configs WHERE banner_edge_id = \\$1"). WithArgs("test-banner-edge-id"). WillReturnRows(sqlmock.NewRows([]string{"config_key", "config_value"})) cfg, err := service.GetBannerConfig(context.Background(), "test-banner-edge-id") assert.NoError(t, err) assert.NotNil(t, cfg) assert.Equal(t, false, cfg.VncReadWriteAuthRequired) assert.Equal(t, false, cfg.VncReadWriteAuthRequiredOverride) assert.Equal(t, false, cfg.VncReadAuthRequired) assert.Equal(t, false, cfg.VncReadAuthRequiredOverride) assert.NoError(t, mock.ExpectationsWereMet()) } // TestUpdateBannerConfig tests whether an existing entry is correctly updated func TestUpdateBannerConfig(t *testing.T) { db, mock, err := sqlmock.New() assert.NoError(t, err) defer db.Close() service := NewBannerConfigService(db) rows := sqlmock.NewRows([]string{"config_key", "config_value"}). AddRow(VNCReadWriteAuthRequired, "true"). AddRow(VNCReadWriteAuthRequiredOverride, "false"). AddRow(VNCReadAuthRequired, "true"). AddRow(VNCReadAuthRequiredOverride, "false") mock.ExpectQuery("SELECT config_key, config_value FROM banner_configs WHERE banner_edge_id = \\$1"). WithArgs("test-banner-edge-id"). WillReturnRows(rows) mock.ExpectBegin() // dont match the insert order here onwards as we are inserting from a map, which is unordered mock.MatchExpectationsInOrder(false) mock.ExpectExec("INSERT INTO banner_configs"). WithArgs("test-banner-edge-id", VNCReadWriteAuthRequired, "false"). WillReturnResult(sqlmock.NewResult(1, 1)) mock.ExpectExec("INSERT INTO banner_configs"). WithArgs("test-banner-edge-id", VNCReadWriteAuthRequiredOverride, "true"). WillReturnResult(sqlmock.NewResult(1, 1)) mock.ExpectExec("INSERT INTO banner_configs"). WithArgs("test-banner-edge-id", VNCReadAuthRequired, "false"). WillReturnResult(sqlmock.NewResult(1, 1)) mock.ExpectExec("INSERT INTO banner_configs"). WithArgs("test-banner-edge-id", VNCReadAuthRequiredOverride, "true"). WillReturnResult(sqlmock.NewResult(1, 1)) mock.ExpectCommit() updateCfg := &model.UpdateBannerConfig{ VncReadWriteAuthRequired: boolPtr(false), VncReadWriteAuthRequiredOverride: boolPtr(true), VncReadAuthRequired: boolPtr(false), VncReadAuthRequiredOverride: boolPtr(true), } cfg, err := service.UpdateBannerConfig(context.Background(), "test-banner-edge-id", updateCfg) assert.NoError(t, err) assert.NotNil(t, cfg) assert.Equal(t, false, cfg.VncReadWriteAuthRequired) assert.Equal(t, true, cfg.VncReadWriteAuthRequiredOverride) assert.Equal(t, false, cfg.VncReadAuthRequired) assert.Equal(t, true, cfg.VncReadAuthRequiredOverride) assert.NoError(t, mock.ExpectationsWereMet()) } // TestUpsertBannerConfig tests whether a new entry is correctly inserted if it does not exist func TestUpsertBannerConfig(t *testing.T) { db, mock, err := sqlmock.New() assert.NoError(t, err) defer db.Close() service := NewBannerConfigService(db) // No existing rows mock.ExpectQuery("SELECT config_key, config_value FROM banner_configs WHERE banner_edge_id = \\$1"). WithArgs("test-banner-edge-id"). WillReturnRows(sqlmock.NewRows([]string{"config_key", "config_value"})) mock.ExpectBegin() // dont match the insert order here onwards as we are inserting from a map, which is unordered mock.MatchExpectationsInOrder(false) mock.ExpectExec("INSERT INTO banner_configs"). WithArgs("test-banner-edge-id", VNCReadWriteAuthRequired, "true"). WillReturnResult(sqlmock.NewResult(1, 1)) mock.ExpectExec("INSERT INTO banner_configs"). WithArgs("test-banner-edge-id", VNCReadWriteAuthRequiredOverride, "false"). WillReturnResult(sqlmock.NewResult(1, 1)) mock.ExpectExec("INSERT INTO banner_configs"). WithArgs("test-banner-edge-id", VNCReadAuthRequired, "true"). WillReturnResult(sqlmock.NewResult(1, 1)) mock.ExpectExec("INSERT INTO banner_configs"). WithArgs("test-banner-edge-id", VNCReadAuthRequiredOverride, "false"). WillReturnResult(sqlmock.NewResult(1, 1)) mock.ExpectCommit() upsertCfg := &model.UpdateBannerConfig{ VncReadWriteAuthRequired: boolPtr(true), VncReadWriteAuthRequiredOverride: boolPtr(false), VncReadAuthRequired: boolPtr(true), VncReadAuthRequiredOverride: boolPtr(false), } cfg, err := service.UpdateBannerConfig(context.Background(), "test-banner-edge-id", upsertCfg) assert.NoError(t, err) assert.NotNil(t, cfg) assert.Equal(t, true, cfg.VncReadWriteAuthRequired) assert.Equal(t, false, cfg.VncReadWriteAuthRequiredOverride) assert.Equal(t, true, cfg.VncReadAuthRequired) assert.Equal(t, false, cfg.VncReadAuthRequiredOverride) assert.NoError(t, mock.ExpectationsWereMet()) } func boolPtr(b bool) *bool { return &b }