You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
boundary/internal/session/repository_credential_test.go

237 lines
6.3 KiB

// Copyright (c) HashiCorp, Inc.
// SPDX-License-Identifier: BUSL-1.1
package session
import (
"context"
"testing"
"github.com/hashicorp/boundary/internal/db"
"github.com/hashicorp/boundary/internal/errors"
"github.com/hashicorp/boundary/internal/iam"
"github.com/hashicorp/boundary/internal/kms"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)
func TestRepository_AddSessionCredentials(t *testing.T) {
t.Parallel()
conn, _ := db.TestSetup(t, "postgres")
wrapper := db.TestWrapper(t)
iamRepo := iam.TestRepo(t, conn, wrapper)
rw := db.New(conn)
kms := kms.TestKms(t, conn, wrapper)
ctx := context.Background()
repo, err := NewRepository(ctx, rw, rw, kms)
require.NoError(t, err)
s := TestSession(t, conn, wrapper, TestSessionParams(t, conn, wrapper, iamRepo))
type args struct {
creds []Credential
sessionId string
sessionProjectId string
}
tests := []struct {
name string
args args
wantErr bool
wantErrCode errors.Code
wantErrMsg string
}{
{
name: "invalid-missing-credentials",
args: args{
sessionId: s.PublicId,
sessionProjectId: s.ProjectId,
},
wantErr: true,
wantErrCode: errors.InvalidParameter,
wantErrMsg: "session.(Repository).AddSessionCredentials: missing credentials: parameter violation: error #100",
},
{
name: "invalid-missing-project-id",
args: args{
sessionId: s.PublicId,
creds: []Credential{
Credential("test-cred"),
},
},
wantErr: true,
wantErrCode: errors.InvalidParameter,
wantErrMsg: "session.(Repository).AddSessionCredentials: missing session project id: parameter violation: error #100",
},
{
name: "invalid-missing-session-id",
args: args{
sessionProjectId: s.ProjectId,
creds: []Credential{
Credential("test-cred"),
},
},
wantErr: true,
wantErrCode: errors.InvalidParameter,
wantErrMsg: "session.(Repository).AddSessionCredentials: missing session id: parameter violation: error #100",
},
{
name: "invalid-empty-cred",
args: args{
sessionId: s.PublicId,
sessionProjectId: s.ProjectId,
creds: []Credential{
Credential(""),
},
},
wantErr: true,
wantErrCode: errors.InvalidParameter,
wantErrMsg: "session.(Repository).AddSessionCredentials: missing credential: parameter violation: error #100",
},
{
name: "invalid-empty-cred-with-valid",
args: args{
sessionId: s.PublicId,
sessionProjectId: s.ProjectId,
creds: []Credential{
Credential("test-cred"),
Credential(""),
Credential("test-cred2"),
},
},
wantErr: true,
wantErrCode: errors.InvalidParameter,
wantErrMsg: "session.(Repository).AddSessionCredentials: missing credential: parameter violation: error #100",
},
{
name: "valid",
args: args{
sessionId: s.PublicId,
sessionProjectId: s.ProjectId,
creds: []Credential{
Credential("test-cred"),
Credential("test-cred1"),
Credential("test-cred2"),
},
},
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
assert, require := assert.New(t), require.New(t)
err := repo.AddSessionCredentials(context.Background(), tt.args.sessionProjectId, tt.args.sessionId, tt.args.creds)
if tt.wantErr {
require.Error(err)
assert.Truef(errors.Match(errors.T(tt.wantErrCode), err), "Unexpected error %s", err)
assert.Equal(tt.wantErrMsg, err.Error())
return
}
require.NoError(err)
creds, err := repo.ListSessionCredentials(context.Background(), s.ProjectId, s.PublicId)
require.NoError(err)
assert.ElementsMatch(creds, tt.args.creds)
})
}
}
func TestRepository_ListSessionCredentials(t *testing.T) {
t.Parallel()
conn, _ := db.TestSetup(t, "postgres")
wrapper := db.TestWrapper(t)
iamRepo := iam.TestRepo(t, conn, wrapper)
rw := db.New(conn)
kms := kms.TestKms(t, conn, wrapper)
ctx := context.Background()
repo, err := NewRepository(ctx, rw, rw, kms)
require.NoError(t, err)
s1 := TestSession(t, conn, wrapper, TestSessionParams(t, conn, wrapper, iamRepo))
s2 := TestSession(t, conn, wrapper, TestSessionParams(t, conn, wrapper, iamRepo))
s3 := TestSession(t, conn, wrapper, TestSessionParams(t, conn, wrapper, iamRepo))
s1Creds := []Credential{
Credential("cred1"),
Credential("cred2"),
Credential("cred3"),
}
s2Creds := []Credential{
Credential("cred1"),
}
err = repo.AddSessionCredentials(context.Background(), s1.ProjectId, s1.PublicId, s1Creds)
require.NoError(t, err)
err = repo.AddSessionCredentials(context.Background(), s2.ProjectId, s2.PublicId, s2Creds)
require.NoError(t, err)
type args struct {
sessionId string
sessionProjectId string
}
tests := []struct {
name string
args args
wantCreds []Credential
wantErr bool
wantErrCode errors.Code
wantErrMsg string
}{
{
name: "invalid-missing-project-id",
args: args{
sessionId: s1.PublicId,
},
wantErr: true,
wantErrCode: errors.InvalidParameter,
wantErrMsg: "session.(Repository).ListSessionCredentials: missing session project id: parameter violation: error #100",
},
{
name: "invalid-missing-session-id",
args: args{
sessionProjectId: s1.ProjectId,
},
wantErr: true,
wantErrCode: errors.InvalidParameter,
wantErrMsg: "session.(Repository).ListSessionCredentials: missing session id: parameter violation: error #100",
},
{
name: "valid-s1",
args: args{
sessionId: s1.PublicId,
sessionProjectId: s1.ProjectId,
},
wantCreds: s1Creds,
},
{
name: "valid-s2",
args: args{
sessionId: s2.PublicId,
sessionProjectId: s2.ProjectId,
},
wantCreds: s2Creds,
},
{
name: "valid-s3-no-creds",
args: args{
sessionId: s3.PublicId,
sessionProjectId: s3.ProjectId,
},
wantCreds: nil,
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
assert, require := assert.New(t), require.New(t)
creds, err := repo.ListSessionCredentials(context.Background(), tt.args.sessionProjectId, tt.args.sessionId)
if tt.wantErr {
require.Error(err)
assert.Truef(errors.Match(errors.T(tt.wantErrCode), err), "Unexpected error %s", err)
assert.Equal(tt.wantErrMsg, err.Error())
return
}
require.NoError(err)
assert.ElementsMatch(creds, tt.wantCreds)
})
}
}