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(&regclient.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 := &registry.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  }