github.com/qri-io/qri@v0.10.1-0.20220104210721-c771715036cb/api/test_runner_test.go (about) 1 package api 2 3 import ( 4 "context" 5 "fmt" 6 "io/ioutil" 7 "net/http/httptest" 8 "os" 9 "path/filepath" 10 "testing" 11 "time" 12 13 "github.com/qri-io/dataset" 14 "github.com/qri-io/qri/automation" 15 "github.com/qri-io/qri/automation/workflow" 16 "github.com/qri-io/qri/automation/workflow/wftest" 17 "github.com/qri-io/qri/base/dsfs" 18 "github.com/qri-io/qri/event" 19 "github.com/qri-io/qri/lib" 20 "github.com/qri-io/qri/p2p" 21 "github.com/qri-io/qri/profile" 22 ) 23 24 type APITestRunner struct { 25 cancelCtx context.CancelFunc 26 Ctx context.Context 27 Node *p2p.QriNode 28 NodeTeardown func() 29 Inst *lib.Instance 30 workflowStore workflow.Store 31 DsfsTsFunc func() time.Time 32 TmpDir string 33 WorkDir string 34 PrevXformVer string 35 } 36 37 func NewAPITestRunner(t *testing.T) *APITestRunner { 38 ctx, cancel := context.WithCancel(context.Background()) 39 run := APITestRunner{ 40 cancelCtx: cancel, 41 Ctx: ctx, 42 } 43 run.Node, run.NodeTeardown = newTestNode(t) 44 o := automation.DefaultMemOrchestratorOptions(ctx, event.NilBus) 45 run.workflowStore = o.WorkflowStore 46 47 run.Inst = newTestInstanceWithProfileFromNodeAndOrchestratorOpts(ctx, run.Node, &o) 48 49 wftest.MustAddDefaultWorkflows(t, &run) 50 51 tmpDir, err := ioutil.TempDir("", "api_test") 52 if err != nil { 53 t.Fatal(err) 54 } 55 run.TmpDir = tmpDir 56 57 counter := 0 58 run.DsfsTsFunc = dsfs.Timestamp 59 dsfs.Timestamp = func() time.Time { 60 counter++ 61 return time.Date(2001, 01, 01, 01, counter, 01, 01, time.UTC) 62 } 63 64 run.PrevXformVer = APIVersion 65 APIVersion = "test_version" 66 67 return &run 68 } 69 70 func (r *APITestRunner) Instance() *lib.Instance { 71 return r.Inst 72 } 73 74 func (r *APITestRunner) Owner() *profile.Profile { 75 return r.Node.Repo.Profiles().Owner(r.Context()) 76 } 77 78 func (r *APITestRunner) Context() context.Context { 79 return r.Ctx 80 } 81 82 func (r *APITestRunner) WorkflowStore() workflow.Store { 83 return r.workflowStore 84 } 85 86 func (r *APITestRunner) Delete() { 87 os.RemoveAll(r.TmpDir) 88 os.RemoveAll("/tmp/qri_api_test") 89 APIVersion = r.PrevXformVer 90 r.cancelCtx() 91 r.NodeTeardown() 92 } 93 94 func (r *APITestRunner) MustMakeWorkDir(t *testing.T, name string) string { 95 r.WorkDir = filepath.Join(r.TmpDir, name) 96 if err := os.MkdirAll(r.WorkDir, os.ModePerm); err != nil { 97 t.Fatal(err) 98 } 99 return r.WorkDir 100 } 101 102 func (r *APITestRunner) BuildDataset(dsName string) *dataset.Dataset { 103 ds := dataset.Dataset{ 104 Peername: "peer", 105 Name: dsName, 106 } 107 return &ds 108 } 109 110 func (r *APITestRunner) SaveDataset(ds *dataset.Dataset, bodyFilename string) { 111 saveParams := lib.SaveParams{ 112 Ref: fmt.Sprintf("peer/%s", ds.Name), 113 Dataset: ds, 114 BodyPath: bodyFilename, 115 } 116 _, err := r.Inst.Dataset().Save(r.Ctx, &saveParams) 117 if err != nil { 118 panic(err) 119 } 120 } 121 122 func (r *APITestRunner) MustTestServer(t *testing.T) *httptest.Server { 123 s := New(r.Inst) 124 return httptest.NewServer(NewServerRoutes(s)) 125 }