Files
kandev/apps/backend/internal/backendapp/repository_selection_test.go
T

78 lines
3.6 KiB
Go

package backendapp
import (
"context"
"errors"
"testing"
"github.com/kandev/kandev/internal/plugins"
taskservice "github.com/kandev/kandev/internal/task/service"
)
type repositoryProviderInspectorStub struct {
inspection *plugins.RepositoryProviderInspection
err error
request plugins.RepositoryProviderInspectionRequest
}
func (s *repositoryProviderInspectorStub) InspectRepositoryProvider(
_ context.Context, _ string, request plugins.RepositoryProviderInspectionRequest,
) (*plugins.RepositoryProviderInspection, error) {
s.request = request
return s.inspection, s.err
}
func TestPluginRepositorySelectionResolverUsesAuthoritativeInspection(t *testing.T) {
inspector := &repositoryProviderInspectorStub{inspection: &plugins.RepositoryProviderInspection{
ProviderID: "fixture-source-control", ProviderHost: "https://bitbucket.example.test",
ProviderScope: "workspace-a", ProviderRepositoryID: "repo-42", OwnerOrProject: "TEAM",
Name: "fixture", CloneURL: "https://bitbucket.example.test/scm/TEAM/fixture.git", DefaultBranch: "main",
}}
resolver := pluginRepositorySelectionResolver{inspector: inspector}
input := taskservice.TaskRepositoryInput{
RemoteURL: "https://bitbucket.example.test/projects/TEAM/fixture",
Provider: "fixture-source-control", ProviderScope: "workspace-a", ProviderRepoID: "repo-42",
ProviderHost: "https://attacker.example.test", ProviderOwner: "attacker", ProviderName: "wrong",
DefaultBranch: "attacker-default", BaseBranch: "main", CheckoutBranch: "feature/provider-contract",
}
resolved, err := resolver.ResolveRepositorySelection(context.Background(), "workspace-1", input)
if err != nil {
t.Fatalf("ResolveRepositorySelection: %v", err)
}
if inspector.request.Provider != input.Provider || inspector.request.URL != input.RemoteURL ||
inspector.request.ProviderScope != input.ProviderScope || inspector.request.ProviderRepositoryID != input.ProviderRepoID {
t.Fatalf("inspection request = %+v", inspector.request)
}
if resolved.ProviderHost != "https://bitbucket.example.test" || resolved.ProviderOwner != "TEAM" ||
resolved.ProviderName != "fixture" || resolved.ProviderRepoID != "repo-42" ||
resolved.RemoteURL != "https://bitbucket.example.test/scm/TEAM/fixture.git" || resolved.DefaultBranch != "main" ||
!resolved.TrustedProviderDescriptor {
t.Fatalf("resolved input = %+v", resolved)
}
}
func TestPluginRepositorySelectionResolverMapsTypedProviderFailures(t *testing.T) {
for _, test := range []struct {
name string
providerCode plugins.RepositoryProviderErrorCode
want taskservice.RepositorySelectionErrorCode
}{
{name: "invalid", providerCode: plugins.RepositoryProviderErrorInvalid, want: taskservice.RepositorySelectionErrorInvalid},
{name: "not found", providerCode: plugins.RepositoryProviderErrorNotFound, want: taskservice.RepositorySelectionErrorNotFound},
{name: "unavailable", providerCode: plugins.RepositoryProviderErrorUnavailable, want: taskservice.RepositorySelectionErrorUnavailable},
} {
t.Run(test.name, func(t *testing.T) {
resolver := pluginRepositorySelectionResolver{inspector: &repositoryProviderInspectorStub{
err: &plugins.RepositoryProviderError{Code: test.providerCode},
}}
_, err := resolver.ResolveRepositorySelection(context.Background(), "workspace-1", taskservice.TaskRepositoryInput{
Provider: "fixture-source-control", RemoteURL: "https://bitbucket.example.test/TEAM/fixture",
})
var selectionErr *taskservice.RepositorySelectionError
if !errors.As(err, &selectionErr) || selectionErr.Code != test.want {
t.Fatalf("error = %v, want code %q", err, test.want)
}
})
}
}