chore: Switch over to fake RepoStore in codenav tests (#64284)

Reduce the exposed surface area with a smaller interface
minimalRepoStore, and make sure we're using fakes in the
tests which better document the intent, instead of using a
mock repo store. The fake makes sure that the methods
are mutually consistent, which is easier to do when working
with a smaller interface.
This commit is contained in:
Varun Gandhi 2024-08-06 22:09:43 +08:00 committed by GitHub
parent 1cac35b246
commit 99f7d97dc6
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
12 changed files with 99 additions and 68 deletions

View File

@ -90,7 +90,7 @@ go_test(
"//internal/codeintel/core",
"//internal/codeintel/uploads/shared",
"//internal/collections",
"//internal/database/dbmocks",
"//internal/database",
"//internal/gitserver",
"//internal/gitserver/gitdomain",
"//internal/observation",

View File

@ -8,7 +8,6 @@ import (
"github.com/sourcegraph/sourcegraph/internal/api"
"github.com/sourcegraph/sourcegraph/internal/collections"
"github.com/sourcegraph/sourcegraph/internal/database"
"github.com/sourcegraph/sourcegraph/internal/gitserver"
"github.com/sourcegraph/sourcegraph/internal/gitserver/gitdomain"
"github.com/sourcegraph/sourcegraph/lib/errors"
@ -25,13 +24,13 @@ type RepositoryCommit struct {
}
type commitCache struct {
repoStore database.RepoStore
repoStore minimalRepoStore
gitserverClient gitserver.Client
mutex sync.RWMutex
cache map[api.RepoID]map[api.CommitID]bool
}
func NewCommitCache(repoStore database.RepoStore, client gitserver.Client) CommitCache {
func NewCommitCache(repoStore minimalRepoStore, client gitserver.Client) CommitCache {
return &commitCache{
repoStore: repoStore,
gitserverClient: client,

View File

@ -99,7 +99,7 @@ func (r *RequestState) SetLocalGitTreeTranslator(client gitserver.Client, repo *
r.GitTreeTranslator = NewGitTreeTranslator(client, *repo)
}
func (r *RequestState) SetLocalCommitCache(repoStore database.RepoStore, client gitserver.Client) {
func (r *RequestState) SetLocalCommitCache(repoStore minimalRepoStore, client gitserver.Client) {
r.commitCache = NewCommitCache(repoStore, client)
}

View File

@ -21,7 +21,6 @@ import (
"github.com/sourcegraph/sourcegraph/internal/codeintel/codenav/shared"
"github.com/sourcegraph/sourcegraph/internal/codeintel/core"
uploadsshared "github.com/sourcegraph/sourcegraph/internal/codeintel/uploads/shared"
"github.com/sourcegraph/sourcegraph/internal/database"
"github.com/sourcegraph/sourcegraph/internal/gitserver"
"github.com/sourcegraph/sourcegraph/internal/observation"
searcher "github.com/sourcegraph/sourcegraph/internal/search/client"
@ -32,7 +31,7 @@ import (
)
type Service struct {
repoStore database.RepoStore
repoStore minimalRepoStore
lsifstore lsifstore.LsifStore
gitserver gitserver.Client
uploadSvc UploadService
@ -41,9 +40,18 @@ type Service struct {
logger log.Logger
}
// minimalRepoStore covers the subset of database.RepoStore APIs that we need
// for code navigation.
//
// Prefer calling GetReposSetByIDs instead of calling Get in a loop.
type minimalRepoStore interface {
Get(context.Context, api.RepoID) (*types.Repo, error)
GetReposSetByIDs(context.Context, ...api.RepoID) (map[api.RepoID]*types.Repo, error)
}
func newService(
observationCtx *observation.Context,
repoStore database.RepoStore,
repoStore minimalRepoStore,
lsifstore lsifstore.LsifStore,
uploadSvc UploadService,
gitserver gitserver.Client,

View File

@ -66,14 +66,15 @@ func TestGetClosestCompletedUploadsForBlob(t *testing.T) {
}
for _, testCase := range testCases {
// Set up mocks
mockRepoStore := defaultMockRepoStore()
const testRepoName = "yummy.com/cake"
fakeRepoStore := FakeMinimalRepoStore{data: map[api.RepoID]*types.Repo{repoID: {ID: repoID, Name: testRepoName}}}
mockLsifStore := lsifstoremocks.NewMockLsifStore()
mockUploadSvc := NewMockUploadService()
mockGitserverClient := gitserver.NewMockClient()
mockSearchClient := client.NewMockSearchClient()
// Init service
svc := newService(observation.TestContextTB(t), mockRepoStore, mockLsifStore, mockUploadSvc, mockGitserverClient, mockSearchClient, log.NoOp())
svc := newService(observation.TestContextTB(t), fakeRepoStore, mockLsifStore, mockUploadSvc, mockGitserverClient, mockSearchClient, log.NoOp())
closestUploads := slices.Clone(testCase.closestUploads)
for i := range closestUploads {
@ -81,10 +82,6 @@ func TestGetClosestCompletedUploadsForBlob(t *testing.T) {
}
mockUploadSvc.InferClosestUploadsFunc.SetDefaultReturn(closestUploads, nil)
const testRepoName = "yummy.com/cake"
mockRepoStore.GetReposSetByIDsFunc.PushReturn(map[api.RepoID]*types.Repo{
repoID: {ID: repoID, Name: testRepoName},
}, nil)
mockGitserverClient.GetCommitFunc.SetDefaultHook(func(_ context.Context, repoName api.RepoName, commitID api.CommitID) (*gitdomain.Commit, error) {
// C1 is deliberately missing from gitserver

View File

@ -25,18 +25,18 @@ var uploadRelPath = core.NewUploadRelPathUnchecked
func TestDiagnostics(t *testing.T) {
// Set up mocks
mockRepoStore := defaultMockRepoStore()
fakeRepoStore := AllPresentFakeRepoStore{}
mockLsifStore := lsifstoremocks.NewMockLsifStore()
mockUploadSvc := NewMockUploadService()
mockGitserverClient := gitserver.NewMockClient()
mockSearchClient := client.NewMockSearchClient()
// Init service
svc := newService(observation.TestContextTB(t), mockRepoStore, mockLsifStore, mockUploadSvc, mockGitserverClient, mockSearchClient, log.NoOp())
svc := newService(observation.TestContextTB(t), fakeRepoStore, mockLsifStore, mockUploadSvc, mockGitserverClient, mockSearchClient, log.NoOp())
// Set up request state
mockRequestState := RequestState{}
mockRequestState.SetLocalCommitCache(mockRepoStore, mockGitserverClient)
mockRequestState.SetLocalCommitCache(fakeRepoStore, mockGitserverClient)
mockRequestState.SetLocalGitTreeTranslator(mockGitserverClient, &sgtypes.Repo{})
uploads := []uploadsshared.CompletedUpload{
{ID: 50, Commit: "deadbeef", Root: "sub1/"},
@ -100,18 +100,18 @@ func TestDiagnostics(t *testing.T) {
func TestDiagnosticsWithSubRepoPermissions(t *testing.T) {
// Set up mocks
mockRepoStore := defaultMockRepoStore()
fakeRepoStore := AllPresentFakeRepoStore{}
mockLsifStore := lsifstoremocks.NewMockLsifStore()
mockUploadSvc := NewMockUploadService()
mockGitserverClient := gitserver.NewMockClient()
mockSearchClient := client.NewMockSearchClient()
// Init service
svc := newService(observation.TestContextTB(t), mockRepoStore, mockLsifStore, mockUploadSvc, mockGitserverClient, mockSearchClient, log.NoOp())
svc := newService(observation.TestContextTB(t), fakeRepoStore, mockLsifStore, mockUploadSvc, mockGitserverClient, mockSearchClient, log.NoOp())
// Set up request state
mockRequestState := RequestState{}
mockRequestState.SetLocalCommitCache(mockRepoStore, mockGitserverClient)
mockRequestState.SetLocalCommitCache(fakeRepoStore, mockGitserverClient)
mockRequestState.SetLocalGitTreeTranslator(mockGitserverClient, &sgtypes.Repo{})
uploads := []uploadsshared.CompletedUpload{
{ID: 50, Commit: "deadbeef", Root: "sub1/"},

View File

@ -21,18 +21,18 @@ import (
func TestHover(t *testing.T) {
// Set up mocks
mockRepoStore := defaultMockRepoStore()
fakeRepoStore := AllPresentFakeRepoStore{}
mockLsifStore := lsifstoremocks.NewMockLsifStore()
mockUploadSvc := NewMockUploadService()
mockGitserverClient := gitserver.NewMockClient()
mockSearchClient := client.NewMockSearchClient()
// Init service
svc := newService(observation.TestContextTB(t), mockRepoStore, mockLsifStore, mockUploadSvc, mockGitserverClient, mockSearchClient, log.NoOp())
svc := newService(observation.TestContextTB(t), fakeRepoStore, mockLsifStore, mockUploadSvc, mockGitserverClient, mockSearchClient, log.NoOp())
// Set up request state
mockRequestState := RequestState{}
mockRequestState.SetLocalCommitCache(mockRepoStore, mockGitserverClient)
mockRequestState.SetLocalCommitCache(fakeRepoStore, mockGitserverClient)
mockRequestState.GitTreeTranslator = noopTranslator()
uploads := []uploadsshared.CompletedUpload{
{ID: 50, Commit: "deadbeef", Root: "sub1/"},
@ -77,18 +77,18 @@ func TestHover(t *testing.T) {
func TestHoverRemote(t *testing.T) {
// Set up mocks
mockRepoStore := defaultMockRepoStore()
fakeRepoStore := AllPresentFakeRepoStore{}
mockLsifStore := lsifstoremocks.NewMockLsifStore()
mockUploadSvc := NewMockUploadService()
mockGitserverClient := gitserver.NewMockClient()
mockSearchClient := client.NewMockSearchClient()
// Init service
svc := newService(observation.TestContextTB(t), mockRepoStore, mockLsifStore, mockUploadSvc, mockGitserverClient, mockSearchClient, log.NoOp())
svc := newService(observation.TestContextTB(t), fakeRepoStore, mockLsifStore, mockUploadSvc, mockGitserverClient, mockSearchClient, log.NoOp())
// Set up request state
mockRequestState := RequestState{}
mockRequestState.SetLocalCommitCache(mockRepoStore, mockGitserverClient)
mockRequestState.SetLocalCommitCache(fakeRepoStore, mockGitserverClient)
mockRequestState.GitTreeTranslator = noopTranslator()
uploads := []uploadsshared.CompletedUpload{
{ID: 50, Commit: "deadbeef"},

View File

@ -30,19 +30,19 @@ func posMatcher(line int, char int) shared.Matcher {
func TestGetDefinitions(t *testing.T) {
t.Run("local", func(t *testing.T) {
// Set up mocks
mockRepoStore := defaultMockRepoStore()
fakeRepoStore := AllPresentFakeRepoStore{}
mockLsifStore := lsifstoremocks.NewMockLsifStore()
mockUploadSvc := NewMockUploadService()
mockGitserverClient := gitserver.NewMockClient()
mockSearchClient := client.NewMockSearchClient()
// Init service
svc := newService(observation.TestContextTB(t), mockRepoStore, mockLsifStore, mockUploadSvc, mockGitserverClient, mockSearchClient, log.NoOp())
svc := newService(observation.TestContextTB(t), fakeRepoStore, mockLsifStore, mockUploadSvc, mockGitserverClient, mockSearchClient, log.NoOp())
// Set up request state
lookupPath := core.NewRepoRelPathUnchecked("sub2/a.go")
mockRequestState := RequestState{Path: lookupPath}
mockRequestState.SetLocalCommitCache(mockRepoStore, mockGitserverClient)
mockRequestState.SetLocalCommitCache(fakeRepoStore, mockGitserverClient)
mockRequestState.GitTreeTranslator = noopTranslator()
mockRequest := OccurrenceRequestArgs{
@ -92,19 +92,19 @@ func TestGetDefinitions(t *testing.T) {
t.Run("remote", func(t *testing.T) {
// Set up mocks
mockRepoStore := defaultMockRepoStore()
fakeRepoStore := AllPresentFakeRepoStore{}
mockLsifStore := lsifstoremocks.NewMockLsifStore()
mockUploadSvc := NewMockUploadService()
mockGitserverClient := gitserver.NewMockClient()
mockSearchClient := client.NewMockSearchClient()
// Init service
svc := newService(observation.TestContextTB(t), mockRepoStore, mockLsifStore, mockUploadSvc, mockGitserverClient, mockSearchClient, log.NoOp())
svc := newService(observation.TestContextTB(t), fakeRepoStore, mockLsifStore, mockUploadSvc, mockGitserverClient, mockSearchClient, log.NoOp())
// Set up request state
lookupPath := core.NewRepoRelPathUnchecked("sub2/a.go")
mockRequestState := RequestState{Path: lookupPath}
mockRequestState.SetLocalCommitCache(mockRepoStore, mockGitserverClient)
mockRequestState.SetLocalCommitCache(fakeRepoStore, mockGitserverClient)
mockRequestState.SetLocalGitTreeTranslator(mockGitserverClient, &sgtypes.Repo{ID: 42})
mockRequestState.GitTreeTranslator = noopTranslator()
uploads1 := []uploadsshared.CompletedUpload{
@ -209,19 +209,19 @@ func TestGetDefinitions(t *testing.T) {
func TestGetReferences(t *testing.T) {
t.Run("local", func(t *testing.T) {
// Set up mocks
mockRepoStore := defaultMockRepoStore()
fakeRepoStore := AllPresentFakeRepoStore{}
mockLsifStore := lsifstoremocks.NewMockLsifStore()
mockUploadSvc := NewMockUploadService()
mockGitserverClient := gitserver.NewMockClient()
mockSearchClient := client.NewMockSearchClient()
// Init service
svc := newService(observation.TestContextTB(t), mockRepoStore, mockLsifStore, mockUploadSvc, mockGitserverClient, mockSearchClient, log.NoOp())
svc := newService(observation.TestContextTB(t), fakeRepoStore, mockLsifStore, mockUploadSvc, mockGitserverClient, mockSearchClient, log.NoOp())
// Set up request state
lookupPath := core.NewRepoRelPathUnchecked("sub2/a.go")
mockRequestState := RequestState{Path: lookupPath}
mockRequestState.SetLocalCommitCache(mockRepoStore, mockGitserverClient)
mockRequestState.SetLocalCommitCache(fakeRepoStore, mockGitserverClient)
mockRequestState.GitTreeTranslator = noopTranslator()
uploads := []uploadsshared.CompletedUpload{
{ID: 50, Commit: "deadbeef", Root: "sub2/"},
@ -285,19 +285,19 @@ func TestGetReferences(t *testing.T) {
t.Run("remote", func(t *testing.T) {
// Set up mocks
mockRepoStore := defaultMockRepoStore()
fakeRepoStore := AllPresentFakeRepoStore{}
mockLsifStore := lsifstoremocks.NewMockLsifStore()
mockUploadSvc := NewMockUploadService()
mockGitserverClient := gitserver.NewMockClient()
mockSearchClient := client.NewMockSearchClient()
// Init service
svc := newService(observation.TestContextTB(t), mockRepoStore, mockLsifStore, mockUploadSvc, mockGitserverClient, mockSearchClient, log.NoOp())
svc := newService(observation.TestContextTB(t), fakeRepoStore, mockLsifStore, mockUploadSvc, mockGitserverClient, mockSearchClient, log.NoOp())
// Set up request state
lookupPath := core.NewRepoRelPathUnchecked("sub2/a.go")
mockRequestState := RequestState{Path: lookupPath}
mockRequestState.SetLocalCommitCache(mockRepoStore, mockGitserverClient)
mockRequestState.SetLocalCommitCache(fakeRepoStore, mockGitserverClient)
mockRequestState.GitTreeTranslator = noopTranslator()
uploads := []uploadsshared.CompletedUpload{
{ID: 50, Commit: "deadbeef", Root: "sub1/"},
@ -458,19 +458,19 @@ func TestGetReferences(t *testing.T) {
func TestGetImplementations(t *testing.T) {
t.Run("local", func(t *testing.T) {
// Set up mocks
mockRepoStore := defaultMockRepoStore()
fakeRepoStore := AllPresentFakeRepoStore{}
mockLsifStore := lsifstoremocks.NewMockLsifStore()
mockUploadSvc := NewMockUploadService()
mockGitserverClient := gitserver.NewMockClient()
mockSearchClient := client.NewMockSearchClient()
// Init service
svc := newService(observation.TestContextTB(t), mockRepoStore, mockLsifStore, mockUploadSvc, mockGitserverClient, mockSearchClient, log.NoOp())
svc := newService(observation.TestContextTB(t), fakeRepoStore, mockLsifStore, mockUploadSvc, mockGitserverClient, mockSearchClient, log.NoOp())
// Set up request state
lookupPath := core.NewRepoRelPathUnchecked("sub2/a.go")
mockRequestState := RequestState{Path: lookupPath}
mockRequestState.SetLocalCommitCache(mockRepoStore, mockGitserverClient)
mockRequestState.SetLocalCommitCache(fakeRepoStore, mockGitserverClient)
mockRequestState.GitTreeTranslator = noopTranslator()
// Empty result set (prevents nil pointer as scanner is always non-nil)

View File

@ -36,7 +36,7 @@ index deadbeef1..deadbeef2 100644
func TestRanges(t *testing.T) {
// Set up mocks
mockRepoStore := defaultMockRepoStore()
fakeRepoStore := AllPresentFakeRepoStore{}
mockLsifStore := lsifstoremocks.NewMockLsifStore()
mockUploadSvc := NewMockUploadService()
mockGitserverClient := gitserver.NewMockClient()
@ -51,11 +51,11 @@ func TestRanges(t *testing.T) {
mockLsifStore.FindDocumentIDsFunc.SetDefaultHook(findDocumentIDsFuncAllowAny())
// Init service
svc := newService(observation.TestContextTB(t), mockRepoStore, mockLsifStore, mockUploadSvc, mockGitserverClient, mockSearchClient, log.NoOp())
svc := newService(observation.TestContextTB(t), fakeRepoStore, mockLsifStore, mockUploadSvc, mockGitserverClient, mockSearchClient, log.NoOp())
// Set up request state
mockRequestState := RequestState{}
mockRequestState.SetLocalCommitCache(mockRepoStore, mockGitserverClient)
mockRequestState.SetLocalCommitCache(fakeRepoStore, mockGitserverClient)
mockRequestState.SetLocalGitTreeTranslator(mockGitserverClient, &sgtypes.Repo{})
uploads := []uploadsshared.CompletedUpload{
{ID: 50, Commit: "deadbeef1", Root: "sub1/", RepositoryID: 42},

View File

@ -16,7 +16,6 @@ import (
"github.com/sourcegraph/sourcegraph/internal/gitserver"
"github.com/sourcegraph/sourcegraph/internal/observation"
"github.com/sourcegraph/sourcegraph/internal/search/client"
"github.com/sourcegraph/sourcegraph/internal/types"
)
const sampleFile1 = `package food
@ -25,7 +24,7 @@ type banana struct{}`
func TestSnapshotForDocument(t *testing.T) {
// Set up mocks
mockRepoStore := defaultMockRepoStore()
fakeRepoStore := AllPresentFakeRepoStore{}
mockLsifStore := lsifstoremocks.NewMockLsifStore()
mockUploadSvc := NewMockUploadService()
mockGitserverClient := gitserver.NewMockClient()
@ -33,10 +32,9 @@ func TestSnapshotForDocument(t *testing.T) {
mockSearchClient := client.NewMockSearchClient()
// Init service
svc := newService(observation.TestContextTB(t), mockRepoStore, mockLsifStore, mockUploadSvc, mockGitserverClient, mockSearchClient, log.NoOp())
svc := newService(observation.TestContextTB(t), fakeRepoStore, mockLsifStore, mockUploadSvc, mockGitserverClient, mockSearchClient, log.NoOp())
mockUploadSvc.GetCompletedUploadsByIDsFunc.SetDefaultReturn([]shared.CompletedUpload{{}}, nil)
mockRepoStore.GetFunc.SetDefaultReturn(&types.Repo{}, nil)
mockGitserverClient.NewFileReaderFunc.SetDefaultReturn(io.NopCloser(bytes.NewReader([]byte(sampleFile1))), nil)
mockLsifStore.SCIPDocumentFunc.SetDefaultReturn(core.Some(&scip.Document{
RelativePath: "burger.go",

View File

@ -18,7 +18,7 @@ import (
func TestStencil(t *testing.T) {
// Set up mocks
mockRepoStore := defaultMockRepoStore()
fakeRepoStore := AllPresentFakeRepoStore{}
mockLsifStore := lsifstoremocks.NewMockLsifStore()
mockUploadSvc := NewMockUploadService()
mockGitserverClient := gitserver.NewMockClient()
@ -27,11 +27,11 @@ func TestStencil(t *testing.T) {
mockLsifStore.FindDocumentIDsFunc.SetDefaultHook(findDocumentIDsFuncAllowAny())
// Init service
svc := newService(observation.TestContextTB(t), mockRepoStore, mockLsifStore, mockUploadSvc, mockGitserverClient, mockSearchClient, log.NoOp())
svc := newService(observation.TestContextTB(t), fakeRepoStore, mockLsifStore, mockUploadSvc, mockGitserverClient, mockSearchClient, log.NoOp())
// Set up request state
mockRequestState := RequestState{}
mockRequestState.SetLocalCommitCache(mockRepoStore, mockGitserverClient)
mockRequestState.SetLocalCommitCache(fakeRepoStore, mockGitserverClient)
mockRequestState.SetLocalGitTreeTranslator(mockGitserverClient, &sgtypes.Repo{})
uploads := []uploadsshared.CompletedUpload{
{ID: 50, Commit: "deadbeef", Root: "sub1/"},
@ -78,7 +78,7 @@ func TestStencil(t *testing.T) {
func TestStencilWithDuplicateRanges(t *testing.T) {
// Set up mocks
mockRepoStore := defaultMockRepoStore()
fakeRepoStore := AllPresentFakeRepoStore{}
mockLsifStore := lsifstoremocks.NewMockLsifStore()
mockUploadSvc := NewMockUploadService()
mockGitserverClient := gitserver.NewMockClient()
@ -87,11 +87,11 @@ func TestStencilWithDuplicateRanges(t *testing.T) {
mockLsifStore.FindDocumentIDsFunc.SetDefaultHook(findDocumentIDsFuncAllowAny())
// Init service
svc := newService(observation.TestContextTB(t), mockRepoStore, mockLsifStore, mockUploadSvc, mockGitserverClient, mockSearchClient, log.NoOp())
svc := newService(observation.TestContextTB(t), fakeRepoStore, mockLsifStore, mockUploadSvc, mockGitserverClient, mockSearchClient, log.NoOp())
// Set up request state
mockRequestState := RequestState{}
mockRequestState.SetLocalCommitCache(mockRepoStore, mockGitserverClient)
mockRequestState.SetLocalCommitCache(fakeRepoStore, mockGitserverClient)
mockRequestState.SetLocalGitTreeTranslator(mockGitserverClient, &sgtypes.Repo{})
uploads := []uploadsshared.CompletedUpload{
{ID: 50, Commit: "deadbeef", Root: "sub1/"},

View File

@ -5,23 +5,52 @@ import (
"fmt"
"github.com/sourcegraph/sourcegraph/internal/api"
"github.com/sourcegraph/sourcegraph/internal/database/dbmocks"
"github.com/sourcegraph/sourcegraph/internal/database"
internaltypes "github.com/sourcegraph/sourcegraph/internal/types"
"github.com/sourcegraph/sourcegraph/lib/errors"
)
func defaultMockRepoStore() *dbmocks.MockRepoStore {
repoStore := dbmocks.NewMockRepoStore()
repoStore.GetReposSetByIDsFunc.SetDefaultHook(func(ctx context.Context, ids ...api.RepoID) (map[api.RepoID]*internaltypes.Repo, error) {
m := map[api.RepoID]*internaltypes.Repo{}
for _, id := range ids {
m[id] = &internaltypes.Repo{
ID: id,
Name: api.RepoName(fmt.Sprintf("r%d", id)),
}
}
type AllPresentFakeRepoStore struct{}
return m, nil
})
var _ minimalRepoStore = AllPresentFakeRepoStore{}
return repoStore
func (s AllPresentFakeRepoStore) Get(_ context.Context, id api.RepoID) (*internaltypes.Repo, error) {
return &internaltypes.Repo{ID: id, Name: api.RepoName(fmt.Sprintf("r%d", id))}, nil
}
func (s AllPresentFakeRepoStore) GetReposSetByIDs(ctx context.Context, ids ...api.RepoID) (map[api.RepoID]*internaltypes.Repo, error) {
out := map[api.RepoID]*internaltypes.Repo{}
for _, id := range ids {
r, _ := s.Get(ctx, id) // Get doesn't error so this is OK
out[id] = r
}
return out, nil
}
type FakeMinimalRepoStore struct {
data map[api.RepoID]*internaltypes.Repo
}
var _ minimalRepoStore = FakeMinimalRepoStore{}
func (f FakeMinimalRepoStore) Get(ctx context.Context, id api.RepoID) (*internaltypes.Repo, error) {
if r, ok := f.data[id]; ok {
return r, nil
}
return nil, &database.RepoNotFoundErr{ID: id}
}
func (f FakeMinimalRepoStore) GetReposSetByIDs(ctx context.Context, ids ...api.RepoID) (map[api.RepoID]*internaltypes.Repo, error) {
out := map[api.RepoID]*internaltypes.Repo{}
for _, id := range ids {
r, err := f.Get(ctx, id)
if err != nil {
if errors.Is(err, &database.RepoNotFoundErr{}) {
continue
}
return nil, err
}
out[id] = r
}
return out, nil
}