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  }