github.com/qri-io/qri@v0.10.1-0.20220104210721-c771715036cb/cmd/remove_test.go (about)

     1  package cmd
     2  
     3  import (
     4  	"context"
     5  	"testing"
     6  
     7  	"github.com/qri-io/qri/dsref"
     8  	"github.com/qri-io/qri/errors"
     9  	"github.com/qri-io/qri/lib"
    10  )
    11  
    12  func TestRemoveComplete(t *testing.T) {
    13  	run := NewTestRunner(t, "test_peer_remove_complete", "qri_test_remove_complete")
    14  	defer run.Delete()
    15  
    16  	ctx, cancel := context.WithCancel(context.Background())
    17  	defer cancel()
    18  
    19  	f, err := NewTestFactory(ctx)
    20  	if err != nil {
    21  		t.Errorf("error creating new test factory: %s", err)
    22  		return
    23  	}
    24  
    25  	cases := []struct {
    26  		args []string
    27  		err  string
    28  	}{
    29  		{[]string{}, ""},
    30  		{[]string{"one arg"}, ""},
    31  		{[]string{"one arg", "two args"}, ""},
    32  	}
    33  
    34  	for i, c := range cases {
    35  		opt := &RemoveOptions{
    36  			IOStreams: run.Streams,
    37  		}
    38  
    39  		opt.Complete(f, c.args)
    40  
    41  		if c.err != run.ErrStream.String() {
    42  			t.Errorf("case %d, error mismatch. Expected: '%s', Got: '%s'", i, c.err, run.ErrStream.String())
    43  			run.IOReset()
    44  			continue
    45  		}
    46  
    47  		if opt.inst == nil {
    48  			t.Errorf("case %d, opt.inst not set.", i)
    49  			run.IOReset()
    50  			continue
    51  		}
    52  		run.IOReset()
    53  	}
    54  }
    55  
    56  func TestRemoveValidate(t *testing.T) {
    57  	cases := []struct {
    58  		args []string
    59  		err  string
    60  		msg  string
    61  	}{
    62  		{[]string{}, lib.ErrBadArgs.Error(), "please specify a dataset path or name you would like to remove from your qri node"},
    63  		{[]string{"me/test"}, "", ""},
    64  		{[]string{"me/test", "me/test2"}, "", ""},
    65  	}
    66  	for i, c := range cases {
    67  		opt := &RemoveOptions{
    68  			Refs: NewListOfRefSelects(c.args),
    69  		}
    70  
    71  		err := opt.Validate()
    72  		if (err == nil && c.err != "") || (err != nil && c.err != err.Error()) {
    73  			t.Errorf("case %d, mismatched error. Expected: %s, Got: %s", i, c.err, err)
    74  			continue
    75  		}
    76  		if libErr, ok := err.(errors.Error); ok {
    77  			if libErr.Message() != c.msg {
    78  				t.Errorf("case %d, mismatched user-friendly message. Expected: '%s', Got: '%s'", i, c.msg, libErr.Message())
    79  				continue
    80  			}
    81  		} else if c.msg != "" {
    82  			t.Errorf("case %d, mismatched user-friendly message. Expected: '%s', Got: ''", i, c.msg)
    83  			continue
    84  		}
    85  	}
    86  }
    87  
    88  func TestRemoveRun(t *testing.T) {
    89  	run := NewTestRunner(t, "test_peer_dag_info", "qri_test_dag_info")
    90  	defer run.Delete()
    91  
    92  	ctx, cancel := context.WithCancel(context.Background())
    93  	defer cancel()
    94  
    95  	f, err := NewTestFactory(ctx)
    96  	if err != nil {
    97  		t.Errorf("error creating new test factory: %s", err)
    98  		return
    99  	}
   100  
   101  	cases := []struct {
   102  		args     []string
   103  		revision int
   104  		expected string
   105  		err      string
   106  		msg      string
   107  	}{
   108  		{[]string{}, -1, "", `"" is not a valid dataset reference: empty reference`, ""},
   109  		{[]string{"me/bad_dataset"}, -1, "", "reference not found", "could not find dataset 'me/bad_dataset'"},
   110  		{[]string{"me/movies"}, -1, "removed entire dataset 'peer/movies@7ptazaa3bwxvgmyfwq4pugzuvcdpqddhihir3f6gvdmfvdifzs3q/mem/QmXkLt1xHqtJjjGoT2reGZLBFELsioWkJ24yDjchGpu63W'\n", "", ""},
   111  		{[]string{"me/cities", "me/counter"}, -1, "removed entire dataset 'peer/cities@h5vhalefmhkuky5kqqbm22scxtm2bj2b7w2z63hlwiywi6hkbkoa/mem/QmPWCzaxFoxAu5wS8qXkL6tSA7aR2Lpcwykfz1TbhhpuDp'\n", "", ""},
   112  		{[]string{"me/movies"}, -1, "", "reference not found", "could not find dataset 'me/movies'"},
   113  	}
   114  
   115  	for i, c := range cases {
   116  		inst, err := f.Instance()
   117  		if err != nil {
   118  			t.Fatalf("case %d, error creating instance: %s", i, err)
   119  		}
   120  
   121  		opt := &RemoveOptions{
   122  			IOStreams: run.Streams,
   123  			Refs:      NewListOfRefSelects(c.args),
   124  			Revision:  &dsref.Rev{Field: "ds", Gen: c.revision},
   125  			inst:      inst,
   126  		}
   127  
   128  		err = opt.Run()
   129  		if (err == nil && c.err != "") || (err != nil && c.err != err.Error()) {
   130  			t.Errorf("case %d, mismatched error. Expected: %q, Got: %q", i, c.err, err)
   131  			run.IOReset()
   132  			continue
   133  		}
   134  
   135  		if libErr, ok := err.(errors.Error); ok {
   136  			if libErr.Message() != c.msg {
   137  				t.Errorf("case %d, mismatched user-friendly message. Expected: '%s', Got: '%s'", i, c.msg, libErr.Message())
   138  				run.IOReset()
   139  				continue
   140  			}
   141  		} else if c.msg != "" {
   142  			t.Errorf("case %d, mismatched user-friendly message. Expected: '%s', Got: ''", i, c.msg)
   143  			run.IOReset()
   144  			continue
   145  		}
   146  
   147  		if c.expected != run.OutStream.String() {
   148  			t.Errorf("case %d, output mismatch. Expected: '%s', Got: '%s'", i, c.expected, run.OutStream.String())
   149  			run.IOReset()
   150  			continue
   151  		}
   152  		run.IOReset()
   153  	}
   154  }
   155  
   156  func testSliceEqual(a, b []string) bool {
   157  
   158  	if a == nil && b == nil {
   159  		return true
   160  	}
   161  
   162  	if a == nil || b == nil {
   163  		return false
   164  	}
   165  
   166  	if len(a) != len(b) {
   167  		return false
   168  	}
   169  
   170  	for i := range a {
   171  		if a[i] != b[i] {
   172  			return false
   173  		}
   174  	}
   175  
   176  	return true
   177  }