github.com/getgauge/gauge@v1.6.9/parser/dataTableSpecs_test.go (about)

     1  /*----------------------------------------------------------------
     2   *  Copyright (c) ThoughtWorks, Inc.
     3   *  Licensed under the Apache License, Version 2.0
     4   *  See LICENSE in the project root for license information.
     5   *----------------------------------------------------------------*/
     6  
     7  package parser
     8  
     9  import (
    10  	"testing"
    11  
    12  	"encoding/json"
    13  	"reflect"
    14  
    15  	"github.com/getgauge/gauge/env"
    16  	"github.com/getgauge/gauge/gauge"
    17  )
    18  
    19  type DataTableSpecTest struct {
    20  	specs   []*gauge.Specification
    21  	want    int
    22  	message string
    23  }
    24  
    25  var tests = []DataTableSpecTest{
    26  	{
    27  		specs: []*gauge.Specification{
    28  			{
    29  				Heading:   &gauge.Heading{},
    30  				Scenarios: []*gauge.Scenario{{Steps: []*gauge.Step{{Args: []*gauge.StepArg{{Value: "header", ArgType: gauge.Dynamic, Name: "header"}}}}}},
    31  				DataTable: gauge.DataTable{Table: gauge.NewTable([]string{"header"}, [][]gauge.TableCell{
    32  					{{Value: "row1", CellType: gauge.Static}, {Value: "row2", CellType: gauge.Static}},
    33  				}, 0)},
    34  			},
    35  		},
    36  		want:    2,
    37  		message: "Create specs for each data table row",
    38  	},
    39  	{
    40  		specs: []*gauge.Specification{
    41  			{
    42  				Heading:   &gauge.Heading{},
    43  				Scenarios: []*gauge.Scenario{{Steps: []*gauge.Step{{Args: []*gauge.StepArg{{Value: "header", ArgType: gauge.Dynamic, Name: "header"}}}}}},
    44  			},
    45  		},
    46  		want:    1,
    47  		message: "Create non data table driven specs",
    48  	},
    49  	{
    50  		specs: []*gauge.Specification{
    51  			{
    52  				Heading:   &gauge.Heading{},
    53  				Scenarios: []*gauge.Scenario{{Steps: []*gauge.Step{{Args: []*gauge.StepArg{{Value: "header", ArgType: gauge.Dynamic, Name: "header"}}}}}},
    54  				DataTable: gauge.DataTable{Table: gauge.NewTable([]string{"header"}, [][]gauge.TableCell{
    55  					{{Value: "row1", CellType: gauge.Static}, {Value: "row2", CellType: gauge.Static}},
    56  				}, 0)},
    57  			},
    58  			{
    59  				Heading:   &gauge.Heading{},
    60  				Scenarios: []*gauge.Scenario{{Steps: []*gauge.Step{{Args: []*gauge.StepArg{{Value: "header", ArgType: gauge.Dynamic, Name: "header"}}}}}},
    61  			},
    62  		},
    63  		want:    3,
    64  		message: "Create data table driven and non data table driven specs",
    65  	},
    66  	{
    67  		specs: []*gauge.Specification{
    68  			{
    69  				Heading:   &gauge.Heading{},
    70  				Scenarios: []*gauge.Scenario{{Steps: []*gauge.Step{{Args: []*gauge.StepArg{{Value: "abc", ArgType: gauge.Static}}}}}},
    71  				DataTable: gauge.DataTable{Table: gauge.NewTable([]string{"header"}, [][]gauge.TableCell{
    72  					{{Value: "row1", CellType: gauge.Static}, {Value: "row2", CellType: gauge.Static}},
    73  				}, 0)},
    74  				Contexts: []*gauge.Step{{Args: []*gauge.StepArg{{Value: "header", ArgType: gauge.Dynamic, Name: "header"}}}},
    75  			},
    76  		},
    77  		want:    2,
    78  		message: "Create specs with context steps using table param",
    79  	},
    80  	{
    81  		specs: []*gauge.Specification{
    82  			{
    83  				Heading:   &gauge.Heading{},
    84  				Scenarios: []*gauge.Scenario{{Steps: []*gauge.Step{{Args: []*gauge.StepArg{{Value: "abc", ArgType: gauge.Static}}}}}},
    85  				DataTable: gauge.DataTable{Table: gauge.NewTable([]string{"header"}, [][]gauge.TableCell{
    86  					{{Value: "row1", CellType: gauge.Static}, {Value: "row2", CellType: gauge.Static}},
    87  				}, 0)},
    88  				TearDownSteps: []*gauge.Step{{Args: []*gauge.StepArg{{Value: "header", ArgType: gauge.Dynamic, Name: "header"}}}},
    89  			},
    90  		},
    91  		want:    2,
    92  		message: "Create specs with Teardown steps using table param",
    93  	},
    94  }
    95  
    96  func TestGetSpecsForDataTableRows(t *testing.T) {
    97  	for _, test := range tests {
    98  		got := GetSpecsForDataTableRows(test.specs, gauge.NewBuildErrors())
    99  
   100  		if len(got) != test.want {
   101  			t.Errorf("Failed: %s. Wanted: %d specs, Got: %d specs", test.message, test.want, len(got))
   102  		}
   103  	}
   104  }
   105  
   106  func TestGetSpecsForDataTableRowsShouldHaveEqualNumberOfScenearioInSpecsScenariosAndItemCollection(t *testing.T) {
   107  	specs := []*gauge.Specification{
   108  		{
   109  			Heading: &gauge.Heading{},
   110  			Scenarios: []*gauge.Scenario{
   111  				{Steps: []*gauge.Step{{Args: []*gauge.StepArg{{Value: "header", ArgType: gauge.Dynamic, Name: "header"}}}}},
   112  				{Steps: []*gauge.Step{{Args: []*gauge.StepArg{{Value: "param1", ArgType: gauge.Static, Name: "param1"}}}}},
   113  			},
   114  			DataTable: gauge.DataTable{Table: gauge.NewTable([]string{"header"}, [][]gauge.TableCell{
   115  				{{Value: "row1", CellType: gauge.Static}, {Value: "row2", CellType: gauge.Static}},
   116  			}, 0)},
   117  		},
   118  	}
   119  	actualSpecs := GetSpecsForDataTableRows(specs, gauge.NewBuildErrors())
   120  	if !containsScenario(actualSpecs[0].Scenarios, actualSpecs[0].Items) {
   121  		itemsJSON, _ := json.Marshal(actualSpecs[0].Items)
   122  		scnJSON, _ := json.Marshal(actualSpecs[0].Scenarios)
   123  		t.Errorf("Failed: Wanted items:\n\n%s\n\nto contain all scenarios: \n\n%s", itemsJSON, scnJSON)
   124  	}
   125  }
   126  
   127  func containsScenario(scenarios []*gauge.Scenario, items []gauge.Item) bool {
   128  	for _, scenario := range scenarios {
   129  		contains := false
   130  		for _, item := range items {
   131  			if item.Kind() == gauge.ScenarioKind && reflect.DeepEqual(scenario, item.(*gauge.Scenario)) {
   132  				contains = true
   133  			}
   134  		}
   135  		if !contains {
   136  			return false
   137  		}
   138  	}
   139  	return true
   140  }
   141  
   142  func TestGetSpecsForDataTableRowsShouldHaveEqualNumberOfScenearioInSpecsScenariosAndItemCollectionForScenarioDataTable(t *testing.T) {
   143  	old := env.AllowScenarioDatatable
   144  	env.AllowScenarioDatatable = func() bool {
   145  		return true
   146  	}
   147  	specs := []*gauge.Specification{
   148  		{
   149  			Heading: &gauge.Heading{},
   150  			Scenarios: []*gauge.Scenario{
   151  				{
   152  					Steps: []*gauge.Step{{Args: []*gauge.StepArg{{Value: "header", ArgType: gauge.Dynamic, Name: "header"}}}},
   153  					DataTable: gauge.DataTable{Table: gauge.NewTable([]string{"header"}, [][]gauge.TableCell{
   154  						{{Value: "row1", CellType: gauge.Static}, {Value: "row2", CellType: gauge.Static}, {Value: "row3", CellType: gauge.Static}},
   155  					}, 0)}},
   156  			},
   157  		},
   158  	}
   159  	actualSpecs := GetSpecsForDataTableRows(specs, gauge.NewBuildErrors())
   160  
   161  	if !containsScenario(actualSpecs[0].Scenarios, actualSpecs[0].Items) {
   162  		itemsJSON, _ := json.Marshal(actualSpecs[0].Items)
   163  		scnJSON, _ := json.Marshal(actualSpecs[0].Scenarios)
   164  		t.Errorf("Failed: Wanted items:\n\n%s\n\nto contain all scenarios: \n\n%s", itemsJSON, scnJSON)
   165  	}
   166  	env.AllowScenarioDatatable = old
   167  }
   168  func TestGetTableWithOneRow(t *testing.T) {
   169  	table := gauge.NewTable([]string{"header"}, [][]gauge.TableCell{
   170  		{{Value: "row1", CellType: gauge.Static}, {Value: "row2", CellType: gauge.Static}},
   171  	}, 0)
   172  
   173  	want := *gauge.NewTable([]string{"header"}, [][]gauge.TableCell{{{Value: "row1", CellType: gauge.Static}}}, 0)
   174  
   175  	got := *getTableWithOneRow(table, 0)
   176  
   177  	if !reflect.DeepEqual(want, got) {
   178  		t.Errorf("Failed: Table with 1 row. Wanted: %v, Got: %v", want, got)
   179  	}
   180  }
   181  
   182  func TestCreateSpecsForTableRows(t *testing.T) {
   183  	spec := &gauge.Specification{
   184  		Heading:   &gauge.Heading{},
   185  		Scenarios: []*gauge.Scenario{{Steps: []*gauge.Step{{Args: []*gauge.StepArg{{Value: "header", ArgType: gauge.Dynamic, Name: "header"}}}}}},
   186  		DataTable: gauge.DataTable{Table: gauge.NewTable([]string{"header"}, [][]gauge.TableCell{
   187  			{{Value: "row1", CellType: gauge.Static}, {Value: "row2", CellType: gauge.Static}},
   188  		}, 0)},
   189  		Contexts: []*gauge.Step{{Args: []*gauge.StepArg{{Value: "header", ArgType: gauge.Dynamic, Name: "header"}}}},
   190  		Items: []gauge.Item{
   191  			&gauge.DataTable{Table: gauge.NewTable([]string{"header"}, [][]gauge.TableCell{
   192  				{{Value: "row1", CellType: gauge.Static}, {Value: "row2", CellType: gauge.Static}},
   193  			}, 0)},
   194  			&gauge.Scenario{Steps: []*gauge.Step{{Args: []*gauge.StepArg{{Value: "header", ArgType: gauge.Dynamic, Name: "header"}}}}},
   195  		},
   196  		TearDownSteps: []*gauge.Step{{Args: []*gauge.StepArg{{Value: "abc", ArgType: gauge.Static}}}},
   197  	}
   198  
   199  	want := []*gauge.Specification{
   200  		{
   201  			Heading: &gauge.Heading{},
   202  			Scenarios: []*gauge.Scenario{{Steps: []*gauge.Step{{Args: []*gauge.StepArg{{Value: "header", ArgType: gauge.Dynamic, Name: "header"}}}}, SpecDataTableRow: *gauge.NewTable([]string{"header"}, [][]gauge.TableCell{
   203  				{{Value: "row1", CellType: gauge.Static}},
   204  			}, 0), SpecDataTableRowIndex: 0}},
   205  			DataTable: gauge.DataTable{Table: gauge.NewTable([]string{"header"}, [][]gauge.TableCell{
   206  				{{Value: "row1", CellType: gauge.Static}},
   207  			}, 0)},
   208  			Contexts: []*gauge.Step{{Args: []*gauge.StepArg{{Value: "header", ArgType: gauge.Dynamic, Name: "header"}}}},
   209  			Items: []gauge.Item{
   210  				&gauge.DataTable{Table: gauge.NewTable([]string{"header"}, [][]gauge.TableCell{
   211  					{{Value: "row1", CellType: gauge.Static}},
   212  				}, 0)},
   213  				&gauge.Scenario{Steps: []*gauge.Step{{Args: []*gauge.StepArg{{Value: "header", ArgType: gauge.Dynamic, Name: "header"}}}}, SpecDataTableRow: *gauge.NewTable([]string{"header"}, [][]gauge.TableCell{
   214  					{{Value: "row1", CellType: gauge.Static}},
   215  				}, 0), SpecDataTableRowIndex: 0},
   216  			},
   217  			TearDownSteps: []*gauge.Step{{Args: []*gauge.StepArg{{Value: "abc", ArgType: gauge.Static}}}},
   218  		},
   219  		{
   220  			Heading: &gauge.Heading{},
   221  			Scenarios: []*gauge.Scenario{{Steps: []*gauge.Step{{Args: []*gauge.StepArg{{Value: "header", ArgType: gauge.Dynamic, Name: "header"}}}}, SpecDataTableRow: *gauge.NewTable([]string{"header"}, [][]gauge.TableCell{
   222  				{{Value: "row2", CellType: gauge.Static}},
   223  			}, 0), SpecDataTableRowIndex: 1}},
   224  			DataTable: gauge.DataTable{Table: gauge.NewTable([]string{"header"}, [][]gauge.TableCell{
   225  				{{Value: "row2", CellType: gauge.Static}},
   226  			}, 0)},
   227  			Contexts: []*gauge.Step{{Args: []*gauge.StepArg{{Value: "header", ArgType: gauge.Dynamic, Name: "header"}}}},
   228  			Items: []gauge.Item{
   229  				&gauge.DataTable{Table: gauge.NewTable([]string{"header"}, [][]gauge.TableCell{
   230  					{{Value: "row2", CellType: gauge.Static}},
   231  				}, 0)},
   232  				&gauge.Scenario{Steps: []*gauge.Step{{Args: []*gauge.StepArg{{Value: "header", ArgType: gauge.Dynamic, Name: "header"}}}}, SpecDataTableRow: *gauge.NewTable([]string{"header"}, [][]gauge.TableCell{
   233  					{{Value: "row2", CellType: gauge.Static}},
   234  				}, 0), SpecDataTableRowIndex: 1},
   235  			},
   236  			TearDownSteps: []*gauge.Step{{Args: []*gauge.StepArg{{Value: "abc", ArgType: gauge.Static}}}},
   237  		},
   238  	}
   239  
   240  	got := createSpecsForTableRows(spec, spec.Scenarios, gauge.NewBuildErrors())
   241  
   242  	if !reflect.DeepEqual(want, got) {
   243  		gotJSON, _ := json.Marshal(got)
   244  		wantJSON, _ := json.Marshal(want)
   245  		t.Errorf("Failed: Create specs for table row.\n\tWanted: %v\n\tGot: %v", string(wantJSON), string(gotJSON))
   246  	}
   247  }