github.com/qri-io/qri@v0.10.1-0.20220104210721-c771715036cb/registry/regserver/mock.go (about) 1 // Package regserver provides a mock registry server for testing purposes 2 package regserver 3 4 import ( 5 "context" 6 "net/http/httptest" 7 8 "github.com/qri-io/qri/auth/key" 9 "github.com/qri-io/qri/base" 10 "github.com/qri-io/qri/config" 11 "github.com/qri-io/qri/dsref" 12 "github.com/qri-io/qri/p2p" 13 "github.com/qri-io/qri/registry" 14 "github.com/qri-io/qri/registry/regclient" 15 "github.com/qri-io/qri/registry/regserver/handlers" 16 "github.com/qri-io/qri/remote" 17 "github.com/qri-io/qri/repo" 18 repotest "github.com/qri-io/qri/repo/test" 19 ) 20 21 // TODO (b5) - this value is used all over the plcae need a better strategy for 22 const registryPeerID = "QmZePf5LeXow3RW5U1AgEiNbW46YnRGhZ7HPvm1UmPFPwt" 23 24 func init() { 25 // don't need verbose logging when working with mock servers 26 handlers.SetLogLevel("error") 27 } 28 29 // NewMockServer creates an in-memory mock server & matching registry client 30 func NewMockServer() (*regclient.Client, *httptest.Server) { 31 return NewMockServerRegistry(NewMemRegistry(nil)) 32 } 33 34 // NewMockServerRegistry creates a mock server & client with a passed-in registry 35 func NewMockServerRegistry(reg registry.Registry) (*regclient.Client, *httptest.Server) { 36 s := httptest.NewServer(handlers.NewRoutes(reg)) 37 c := regclient.NewClient(®client.Config{Location: s.URL}) 38 return c, s 39 } 40 41 // NewMemRegistry creates a new in-memory registry 42 func NewMemRegistry(rem *remote.Server) registry.Registry { 43 return registry.Registry{ 44 Remote: rem, 45 Profiles: registry.NewMemProfiles(), 46 } 47 } 48 49 // NewTempRegistry creates a functioning registry with a teardown function 50 // TODO(b5) - the tempRepo.Repo call in this func *requires* the passed-in 51 // context be cancelled at some point. drop the cleanup function return in 52 // favour of listening for ctx.Done and running the cleanup routine internally 53 func NewTempRegistry(ctx context.Context, peername, tmpDirPrefix string, g key.CryptoGenerator) (*registry.Registry, func(), error) { 54 tempRepo, err := repotest.NewTempRepo(peername, tmpDirPrefix, g) 55 if err != nil { 56 return nil, nil, err 57 } 58 59 r, err := tempRepo.Repo(ctx) 60 if err != nil { 61 return nil, nil, err 62 } 63 64 teardown := func() { 65 <-r.Done() 66 tempRepo.Delete() 67 } 68 69 p2pCfg := config.DefaultP2P() 70 p2pCfg.PeerID = registryPeerID 71 72 localResolver := dsref.SequentialResolver(r.Dscache(), r) 73 node, err := p2p.NewQriNode(r, p2pCfg, r.Bus(), localResolver) 74 if err != nil { 75 return nil, nil, err 76 } 77 78 remoteCfg := &config.RemoteServer{ 79 Enabled: true, 80 AcceptSizeMax: -1, 81 AcceptTimeoutMs: -1, 82 RequireAllBlocks: false, 83 AllowRemoves: true, 84 } 85 86 rem, err := remote.NewServer(node, remoteCfg, node.Repo.Logbook(), r.Bus()) 87 if err != nil { 88 return nil, nil, err 89 } 90 91 reg := ®istry.Registry{ 92 Remote: rem, 93 Profiles: registry.NewMemProfiles(), 94 Search: MockRepoSearch{Repo: r}, 95 } 96 97 return reg, teardown, nil 98 } 99 100 // MockRepoSearch proxies search to base.ListDatasets' "term" argument for 101 // simple-but-real search 102 type MockRepoSearch struct { 103 repo.Repo 104 } 105 106 // Search implements the registry.Searchable interface 107 func (ss MockRepoSearch) Search(p registry.SearchParams) ([]registry.SearchResult, error) { 108 ctx := context.Background() 109 infos, err := base.ListDatasets(ctx, ss.Repo, p.Q, "", 0, 1000, true, false) 110 if err != nil { 111 return nil, err 112 } 113 114 var res []registry.SearchResult 115 for _, info := range infos { 116 ds := dsref.ConvertVersionInfoToDataset(&info) 117 res = append(res, registry.SearchResult{ 118 Type: "dataset", 119 ID: ds.Path, 120 Value: ds, 121 }) 122 } 123 return res, nil 124 }