github.com/saucelabs/saucectl@v0.175.1/internal/cypress/grep/parser_test.go (about)

     1  package grep
     2  
     3  import "testing"
     4  
     5  // Most test cases copied from cypress-grep unit tests: https://github.com/cypress-io/cypress/blob/d422aadfa10e5aaac17ed0e4dd5e18a73d821490/npm/grep/cypress/e2e/unit.js
     6  func TestParseGrepTagsExp(t *testing.T) {
     7  	type testCase struct {
     8  		exp  string
     9  		tags string
    10  		want bool
    11  	}
    12  	tests := []struct {
    13  		name      string
    14  		testCases []testCase
    15  	}{
    16  		{
    17  			name: "Simple expression",
    18  			testCases: []testCase{
    19  				{
    20  					exp:  "@tag",
    21  					tags: "@tag",
    22  					want: true,
    23  				},
    24  				{
    25  					exp:  "@tag",
    26  					tags: "@tag1",
    27  					want: false,
    28  				},
    29  				{
    30  					exp:  "@tag",
    31  					tags: "",
    32  					want: false,
    33  				},
    34  			},
    35  		},
    36  		{
    37  			name: "AND matching",
    38  			testCases: []testCase{
    39  				{
    40  					exp:  "smoke+slow",
    41  					tags: "fast smoke",
    42  					want: false,
    43  				},
    44  				{
    45  					exp:  "smoke+slow",
    46  					tags: "mobile smoke slow",
    47  					want: true,
    48  				},
    49  				{
    50  					exp:  "smoke+slow",
    51  					tags: "slow extra smoke",
    52  					want: true,
    53  				},
    54  				{
    55  					exp:  "smoke+slow",
    56  					tags: "smoke",
    57  					want: false,
    58  				},
    59  				{
    60  					exp:  "@smoke+@screen-b",
    61  					tags: "@smoke @screen-b",
    62  					want: true,
    63  				},
    64  			},
    65  		},
    66  		{
    67  			name: "OR matching",
    68  			testCases: []testCase{
    69  				{
    70  					exp:  "smoke slow",
    71  					tags: "fast smoke",
    72  					want: true,
    73  				},
    74  				{
    75  					exp:  "smoke",
    76  					tags: "mobile smoke slow",
    77  					want: true,
    78  				},
    79  				{
    80  					exp:  "slow",
    81  					tags: "slow extra smoke",
    82  					want: true,
    83  				},
    84  				{
    85  					exp:  "smoke",
    86  					tags: "smoke",
    87  					want: true,
    88  				},
    89  				{
    90  					exp:  "smoke",
    91  					tags: "slow",
    92  					want: false,
    93  				},
    94  				{
    95  					exp:  "@smoke,@slow",
    96  					tags: "@fast @smoke",
    97  					want: true,
    98  				},
    99  			},
   100  		},
   101  		{
   102  			name: "inverted tag",
   103  			testCases: []testCase{
   104  				{
   105  					exp:  "smoke+-slow",
   106  					tags: "smoke slow",
   107  					want: false,
   108  				},
   109  				{
   110  					exp:  "mobile+-slow",
   111  					tags: "smoke slow",
   112  					want: false,
   113  				},
   114  				{
   115  					exp:  "smoke -slow",
   116  					tags: "smoke fast",
   117  					want: true,
   118  				},
   119  				{
   120  					exp:  "-slow",
   121  					tags: "smoke slow",
   122  					want: false,
   123  				},
   124  				{
   125  					exp:  "-slow",
   126  					tags: "smoke",
   127  					want: true,
   128  				},
   129  				{
   130  					exp:  "-slow",
   131  					tags: "",
   132  					want: true,
   133  				},
   134  			},
   135  		},
   136  		{
   137  			name: "global inverted tag",
   138  			testCases: []testCase{
   139  				{
   140  					// This expression is equivalent to @smoke+-@slow @e2e+-@slow
   141  					exp:  "@smoke @e2e --@slow",
   142  					tags: "@smoke @slow",
   143  					want: false,
   144  				},
   145  				{
   146  					exp:  "@smoke @e2e --@slow",
   147  					tags: "@smoke",
   148  					want: true,
   149  				},
   150  				{
   151  					exp:  "@smoke @e2e --@slow",
   152  					tags: "@slow",
   153  					want: false,
   154  				},
   155  			},
   156  		},
   157  		{
   158  			name: "empty values",
   159  			testCases: []testCase{
   160  				{
   161  					exp:  "",
   162  					tags: "@smoke @slow",
   163  					want: true,
   164  				},
   165  				{
   166  					exp:  "",
   167  					tags: "",
   168  					want: true,
   169  				},
   170  				{
   171  					exp:  "@smoke",
   172  					tags: "",
   173  					want: false,
   174  				},
   175  			},
   176  		},
   177  		{
   178  			name: "should handle slightly malformed expressions",
   179  			testCases: []testCase{
   180  				{
   181  					exp:  "    +@smoke",
   182  					tags: "@smoke @slow",
   183  					want: true,
   184  				},
   185  				{
   186  					exp:  "    +@smoke",
   187  					tags: "@slow",
   188  					want: false,
   189  				},
   190  				{
   191  					exp:  ",, @tag1,-@tag2,, ,, ,",
   192  					tags: "@tag1",
   193  					want: true,
   194  				},
   195  				{
   196  					exp:  ",, @tag1,-@tag2,, ,, ,",
   197  					tags: "@tag2",
   198  					want: false,
   199  				},
   200  			},
   201  		},
   202  	}
   203  
   204  	for _, tt := range tests {
   205  		t.Run(tt.name, func(t *testing.T) {
   206  			for _, tc := range tt.testCases {
   207  				p := ParseGrepTagsExp(tc.exp)
   208  				if got := p.Eval(tc.tags); got != tc.want {
   209  					t.Errorf("expression (%s) for (%s) got = (%t); want = (%t)", tc.exp, tc.tags, got, tc.want)
   210  				}
   211  			}
   212  		})
   213  	}
   214  }
   215  
   216  func TestParseTitleGrepExp(t *testing.T) {
   217  	type testCase struct {
   218  		exp   string
   219  		title string
   220  		want  bool
   221  	}
   222  	tests := []struct {
   223  		name      string
   224  		testCases []testCase
   225  	}{
   226  		{
   227  			name: "Simple tag",
   228  			testCases: []testCase{
   229  				{
   230  					exp:   "@tag1",
   231  					title: "no tag1 here",
   232  					want:  false,
   233  				},
   234  				{
   235  					title: "has @tag1 in the name",
   236  					want:  true,
   237  				},
   238  			},
   239  		},
   240  		{
   241  			name: "With invert title",
   242  			testCases: []testCase{
   243  				{
   244  					exp:   "-hello",
   245  					title: "no greetings",
   246  					want:  true,
   247  				},
   248  				{
   249  					exp:   "-hello",
   250  					title: "has hello world",
   251  					want:  false,
   252  				},
   253  			},
   254  		},
   255  		{
   256  			name: "Multiple invert strings and a simple one",
   257  			testCases: []testCase{
   258  				{
   259  					exp:   "-name;-hey;number",
   260  					title: "number should only be matches without a n-a-m-e",
   261  					want:  true,
   262  				},
   263  				{
   264  					exp:   "-name;-hey;number",
   265  					title: "number can't be name",
   266  					want:  false,
   267  				},
   268  				{
   269  					exp:   "-name;-hey;number",
   270  					title: "The man needs a name",
   271  					want:  false,
   272  				},
   273  				{
   274  					exp:   "-name;-hey;number",
   275  					title: "number hey name",
   276  					want:  false,
   277  				},
   278  				{
   279  					exp:   "-name;-hey;number",
   280  					title: "numbers hey name",
   281  					want:  false,
   282  				},
   283  				{
   284  					exp:   "-name;-hey;number",
   285  					title: "number hsey nsame",
   286  					want:  true,
   287  				},
   288  				{
   289  					exp:   "-name;-hey;number",
   290  					title: "This wont match",
   291  					want:  false,
   292  				},
   293  			},
   294  		},
   295  		{
   296  			name: "Only inverted strings",
   297  			testCases: []testCase{
   298  				{
   299  					exp:   "-name;-hey",
   300  					title: "I'm matched",
   301  					want:  true,
   302  				},
   303  				{
   304  					exp:   "-name;-hey",
   305  					title: "hey! I'm not",
   306  					want:  false,
   307  				},
   308  				{
   309  					exp:   "-name;-hey",
   310  					title: "My name is weird",
   311  					want:  false,
   312  				},
   313  			},
   314  		},
   315  		{
   316  			name: "Empty values",
   317  			testCases: []testCase{
   318  				{
   319  					exp:   "",
   320  					title: "",
   321  					want:  true,
   322  				},
   323  				{
   324  					exp:   "",
   325  					title: "test title",
   326  					want:  true,
   327  				},
   328  				{
   329  					exp:   "some title to match",
   330  					title: "",
   331  					want:  false,
   332  				},
   333  			},
   334  		},
   335  	}
   336  
   337  	for _, tt := range tests {
   338  		t.Run(tt.name, func(t *testing.T) {
   339  			for _, tc := range tt.testCases {
   340  				p := ParseGrepTitleExp(tc.exp)
   341  				if got := p.Eval(tc.title); got != tc.want {
   342  					t.Errorf("title expression (%s) for (%s) got = (%t); want = (%t)", tc.exp, tc.title, got, tc.want)
   343  				}
   344  			}
   345  		})
   346  	}
   347  }