From bea083f310fd5cefb356c6132236374e626da380 Mon Sep 17 00:00:00 2001 From: Julien Duchesne Date: Mon, 22 Jul 2019 19:58:34 -0400 Subject: [PATCH] Add some tests --- Makefile | 3 +- credentials/credentials_mock.go | 103 ++++++++++++++++++++++++++++++++ sync/target_test.go | 46 +++++++++++--- targets/jenkins_test.go | 69 +++++++++++++++++++++ 4 files changed, 213 insertions(+), 8 deletions(-) create mode 100644 credentials/credentials_mock.go diff --git a/Makefile b/Makefile index b534ce3..b1836ac 100644 --- a/Makefile +++ b/Makefile @@ -3,4 +3,5 @@ mockgen: go install github.com/golang/mock/mockgen mockgen -source targets/targets.go -destination targets/targets_mock.go -package targets -self_package github.com/coveooss/credentials-sync/targets - mockgen -source credentials/sources.go -destination credentials/sources_mock.go -package credentials -self_package github.com/coveooss/credentials-sync/credentials \ No newline at end of file + mockgen -source credentials/sources.go -destination credentials/sources_mock.go -package credentials -self_package github.com/coveooss/credentials-sync/credentials + mockgen -source credentials/credentials.go -destination credentials/credentials_mock.go -package credentials -self_package github.com/coveooss/credentials-sync/credentials \ No newline at end of file diff --git a/credentials/credentials_mock.go b/credentials/credentials_mock.go new file mode 100644 index 0000000..92edd32 --- /dev/null +++ b/credentials/credentials_mock.go @@ -0,0 +1,103 @@ +// Code generated by MockGen. DO NOT EDIT. +// Source: credentials/credentials.go + +// Package credentials is a generated GoMock package. +package credentials + +import ( + gomock "github.com/golang/mock/gomock" + reflect "reflect" +) + +// MockCredentials is a mock of Credentials interface +type MockCredentials struct { + ctrl *gomock.Controller + recorder *MockCredentialsMockRecorder +} + +// MockCredentialsMockRecorder is the mock recorder for MockCredentials +type MockCredentialsMockRecorder struct { + mock *MockCredentials +} + +// NewMockCredentials creates a new mock instance +func NewMockCredentials(ctrl *gomock.Controller) *MockCredentials { + mock := &MockCredentials{ctrl: ctrl} + mock.recorder = &MockCredentialsMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use +func (m *MockCredentials) EXPECT() *MockCredentialsMockRecorder { + return m.recorder +} + +// BaseValidate mocks base method +func (m *MockCredentials) BaseValidate() bool { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "BaseValidate") + ret0, _ := ret[0].(bool) + return ret0 +} + +// BaseValidate indicates an expected call of BaseValidate +func (mr *MockCredentialsMockRecorder) BaseValidate() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "BaseValidate", reflect.TypeOf((*MockCredentials)(nil).BaseValidate)) +} + +// GetID mocks base method +func (m *MockCredentials) GetID() string { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "GetID") + ret0, _ := ret[0].(string) + return ret0 +} + +// GetID indicates an expected call of GetID +func (mr *MockCredentialsMockRecorder) GetID() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetID", reflect.TypeOf((*MockCredentials)(nil).GetID)) +} + +// ShouldSync mocks base method +func (m *MockCredentials) ShouldSync(targetName string, targetTags map[string]string) bool { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ShouldSync", targetName, targetTags) + ret0, _ := ret[0].(bool) + return ret0 +} + +// ShouldSync indicates an expected call of ShouldSync +func (mr *MockCredentialsMockRecorder) ShouldSync(targetName, targetTags interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ShouldSync", reflect.TypeOf((*MockCredentials)(nil).ShouldSync), targetName, targetTags) +} + +// ToString mocks base method +func (m *MockCredentials) ToString(arg0 bool) string { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ToString", arg0) + ret0, _ := ret[0].(string) + return ret0 +} + +// ToString indicates an expected call of ToString +func (mr *MockCredentialsMockRecorder) ToString(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ToString", reflect.TypeOf((*MockCredentials)(nil).ToString), arg0) +} + +// Validate mocks base method +func (m *MockCredentials) Validate() bool { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Validate") + ret0, _ := ret[0].(bool) + return ret0 +} + +// Validate indicates an expected call of Validate +func (mr *MockCredentialsMockRecorder) Validate() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Validate", reflect.TypeOf((*MockCredentials)(nil).Validate)) +} diff --git a/sync/target_test.go b/sync/target_test.go index d70e554..2dc43b8 100644 --- a/sync/target_test.go +++ b/sync/target_test.go @@ -18,12 +18,16 @@ func setSourceMock(t *testing.T, config *Configuration) (*gomock.Controller, *cr return ctrl, source } -func setTargetMock(t *testing.T, config *Configuration) (*gomock.Controller, *targets.MockTarget) { +func setTargetMock(t *testing.T, config *Configuration, name string, credentials []string, shouldDeleteUnsynced bool) (*gomock.Controller, *targets.MockTarget) { ctrl := gomock.NewController(t) target := targets.NewMockTarget(ctrl) targetCollection := targets.NewMockTargetCollection(ctrl) targetCollection.EXPECT().AllTargets().Return([]targets.Target{target}).AnyTimes() + target.EXPECT().GetExistingCredentials().Return(credentials).AnyTimes() + target.EXPECT().GetName().Return(name).AnyTimes() + target.EXPECT().ShouldDeleteUnsynced().Return(shouldDeleteUnsynced).AnyTimes() + config.SetTargets(targetCollection) return ctrl, target } @@ -32,17 +36,45 @@ func TestDeleteListOfCredentials(t *testing.T) { config := &Configuration{ CredentialsToDelete: []string{"test1", "test-not-exist"}, } - setSourceMock(t, config) - targetController, target := setTargetMock(t, config) + targetController, target := setTargetMock(t, config, "", []string{"test1"}, false) defer targetController.Finish() - // The existing creds is only `test1` - target.EXPECT().GetExistingCredentials().Return([]string{"test1"}).AnyTimes() - // Does not assert on GetName - target.EXPECT().GetName().Return("").AnyTimes() // Asserts that DeleteCredentials is called with `test1` target.EXPECT().DeleteCredentials("test1").Return(nil) config.DeleteListOfCredentials(target) +} + +func TestUpdateListOfCredentials(t *testing.T) { + config := &Configuration{} + targetController, target := setTargetMock(t, config, "", []string{"test1"}, false) + defer targetController.Finish() + + cred1, cred2 := credentials.NewSecretText(), credentials.NewSecretText() + cred1.ID = "test1" + cred2.ID = "test2" + + // Asserts that UpdateCredentials is called with `test1` and `test2` + target.EXPECT().UpdateCredentials(cred1).Times(1) + target.EXPECT().UpdateCredentials(cred2).Times(1) + + config.UpdateListOfCredentials(target, []credentials.Credentials{cred1, cred2}) +} + +func TestDeleteUnsyncedCredentials(t *testing.T) { + config := &Configuration{} + targetController, target := setTargetMock(t, config, "", []string{"unsynced"}, true) + defer targetController.Finish() + + cred1, cred2 := credentials.NewSecretText(), credentials.NewSecretText() + cred1.ID = "test1" + cred2.ID = "test2" + + // Do not verify this call + target.EXPECT().UpdateCredentials(gomock.Any()).AnyTimes() + + // Asserts that DeleteCredentials is called with `unsynced` + target.EXPECT().DeleteCredentials("unsynced").Times(1) + config.UpdateListOfCredentials(target, []credentials.Credentials{cred1, cred2}) } diff --git a/targets/jenkins_test.go b/targets/jenkins_test.go index 80c79eb..0803108 100644 --- a/targets/jenkins_test.go +++ b/targets/jenkins_test.go @@ -3,6 +3,9 @@ package targets import ( "testing" + "github.com/bndr/gojenkins" + + "github.com/coveooss/credentials-sync/credentials" "github.com/stretchr/testify/assert" ) @@ -14,3 +17,69 @@ func TestJenkinsToString(t *testing.T) { assert.Equal(t, "targetName [Tags: my_tag=tag_value] (Jenkins) - test.com", jenkins.ToString()) } + +func TestAwsCredentialsToJenkinsCred(t *testing.T) { + secret := credentials.NewAmazonWebServicesCredentials() + secret.ID = "test-id" + secret.Description = "a test description" + secret.AccessKey = "AKIASOMETHING" + secret.SecretKey = "test-secret" + secret.RoleARN = "my-role" + + jenkinsSecretInterface := toJenkinsCredential(secret) + + jenkinsSecret := jenkinsSecretInterface.(*gojenkins.AmazonWebServicesCredentials) + assert.Equal(t, secret.ID, jenkinsSecret.ID) + assert.Equal(t, secret.Description, jenkinsSecret.Description) + assert.Equal(t, secret.AccessKey, jenkinsSecret.AccessKey) + assert.Equal(t, secret.SecretKey, jenkinsSecret.SecretKey) + assert.Equal(t, secret.RoleARN, jenkinsSecret.IAMRoleARN) +} + +func TestSecretToJenkinsCred(t *testing.T) { + secret := credentials.NewSecretText() + secret.ID = "test-id" + secret.Description = "a test description" + secret.Secret = "a-secret" + + jenkinsSecretInterface := toJenkinsCredential(secret) + + jenkinsSecret := jenkinsSecretInterface.(*gojenkins.StringCredentials) + assert.Equal(t, secret.ID, jenkinsSecret.ID) + assert.Equal(t, secret.Description, jenkinsSecret.Description) + assert.Equal(t, secret.Secret, jenkinsSecret.Secret) +} + +func TestSSHKeyToJenkinsCred(t *testing.T) { + secret := credentials.NewSSHCredentials() + secret.ID = "test-id" + secret.Username = "a-user" + secret.Passphrase = "a-password" + secret.PrivateKey = "a-key" + + jenkinsSecretInterface := toJenkinsCredential(secret) + + jenkinsSecret := jenkinsSecretInterface.(*gojenkins.SSHCredentials) + assert.Equal(t, secret.ID, jenkinsSecret.ID) + assert.Equal(t, secret.ID, jenkinsSecret.Description) // No description, then use ID as description + assert.Equal(t, secret.Username, jenkinsSecret.Username) + assert.Equal(t, secret.Passphrase, jenkinsSecret.Passphrase) + privateKeySource := jenkinsSecret.PrivateKeySource.(*gojenkins.PrivateKey) + assert.Equal(t, secret.PrivateKey, privateKeySource.Value) +} + +func TestUsernamePasswordToJenkinsCred(t *testing.T) { + secret := credentials.NewUsernamePassword() + secret.ID = "test-id" + secret.Description = "a test description" + secret.Username = "a-user" + secret.Password = "a-password" + + jenkinsSecretInterface := toJenkinsCredential(secret) + + jenkinsSecret := jenkinsSecretInterface.(*gojenkins.UsernameCredentials) + assert.Equal(t, secret.ID, jenkinsSecret.ID) + assert.Equal(t, secret.Description, jenkinsSecret.Description) + assert.Equal(t, secret.Username, jenkinsSecret.Username) + assert.Equal(t, secret.Password, jenkinsSecret.Password) +}