github.com/getgauge/gauge@v1.6.9/parser/resolver_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  	"path/filepath"
    11  
    12  	"github.com/getgauge/gauge/gauge"
    13  	"github.com/getgauge/gauge/util"
    14  	. "gopkg.in/check.v1"
    15  )
    16  
    17  func (s *MySuite) TestParsingFileSpecialType(c *C) {
    18  	resolver := newSpecialTypeResolver()
    19  	resolver.predefinedResolvers["file"] = func(value string) (*gauge.StepArg, error) {
    20  		return &gauge.StepArg{Value: "dummy", ArgType: gauge.Static}, nil
    21  	}
    22  
    23  	stepArg, _ := resolver.resolve("file:foo")
    24  	c.Assert(stepArg.Value, Equals, "dummy")
    25  	c.Assert(stepArg.ArgType, Equals, gauge.Static)
    26  	c.Assert(stepArg.Name, Equals, "file:foo")
    27  }
    28  
    29  func (s *MySuite) TestParsingFileAsSpecialParamWithWindowsPathAsValue(c *C) {
    30  	resolver := newSpecialTypeResolver()
    31  	resolver.predefinedResolvers["file"] = func(value string) (*gauge.StepArg, error) {
    32  		return &gauge.StepArg{Value: "hello", ArgType: gauge.SpecialString}, nil
    33  	}
    34  
    35  	stepArg, _ := resolver.resolve(`file:C:\Users\abc`)
    36  	c.Assert(stepArg.Value, Equals, "hello")
    37  	c.Assert(stepArg.ArgType, Equals, gauge.SpecialString)
    38  	if util.IsWindows() {
    39  		c.Assert(stepArg.Name, Equals, `file:C:\\Users\\abc`)
    40  	} else {
    41  		c.Assert(stepArg.Name, Equals, `file:C:\Users\abc`)
    42  	}
    43  }
    44  
    45  func (s *MySuite) TestParsingInvalidSpecialType(c *C) {
    46  	resolver := newSpecialTypeResolver()
    47  
    48  	_, err := resolver.resolve("unknown:foo")
    49  	c.Assert(err.Error(), Equals, "Resolver not found for special param <unknown:foo>")
    50  }
    51  
    52  func (s *MySuite) TestConvertCsvToTable(c *C) {
    53  	table, _ := convertCsvToTable("id,name\n1,foo\n2,bar")
    54  
    55  	idColumn, _ := table.Get("id")
    56  	c.Assert(idColumn[0].Value, Equals, "1")
    57  	c.Assert(idColumn[1].Value, Equals, "2")
    58  
    59  	nameColumn, _ := table.Get("name")
    60  	c.Assert(nameColumn[0].Value, Equals, "foo")
    61  	c.Assert(nameColumn[1].Value, Equals, "bar")
    62  }
    63  
    64  func (s *MySuite) TestConvertEmptyCsvToTable(c *C) {
    65  	table, _ := convertCsvToTable("")
    66  	c.Assert(len(table.Columns), Equals, 0)
    67  }
    68  
    69  func (s *MySuite) TestParsingUnknownSpecialType(c *C) {
    70  	resolver := newSpecialTypeResolver()
    71  
    72  	_, err := resolver.getStepArg("unknown", "foo", "unknown:foo")
    73  	c.Assert(err.Error(), Equals, "Resolver not found for special param <unknown:foo>")
    74  }
    75  
    76  func (s *MySuite) TestPopulatingConceptLookup(c *C) {
    77  	parser := new(SpecParser)
    78  	specText := newSpecBuilder().specHeading("A spec heading").
    79  		tableHeader("id", "name", "phone").
    80  		tableHeader("123", "foo", "888").
    81  		scenarioHeading("First scenario").
    82  		step("create user <id> <name> and <phone>").
    83  		String()
    84  
    85  	conceptDictionary := gauge.NewConceptDictionary()
    86  	path, _ := filepath.Abs(filepath.Join("testdata", "dynamic_param_concept.cpt"))
    87  	_, _, err := AddConcepts([]string{path}, conceptDictionary)
    88  	c.Assert(err, IsNil)
    89  	spec, _, _ := parser.Parse(specText, conceptDictionary, "")
    90  	concept := spec.Scenarios[0].Steps[0]
    91  
    92  	dataTableLookup := new(gauge.ArgLookup)
    93  	err = dataTableLookup.ReadDataTableRow(spec.DataTable.Table, 0)
    94  	c.Assert(err, IsNil)
    95  	err = PopulateConceptDynamicParams(concept, dataTableLookup)
    96  	c.Assert(err, IsNil)
    97  	useridArg, _ := concept.GetArg("user-id")
    98  	c.Assert(useridArg.Value, Equals, "123")
    99  	usernameArg, _ := concept.GetArg("user-name")
   100  	c.Assert(usernameArg.Value, Equals, "foo")
   101  	userphoneArg, _ := concept.GetArg("user-phone")
   102  	c.Assert(userphoneArg.Value, Equals, "888")
   103  
   104  }
   105  
   106  func (s *MySuite) TestPopulatingNestedConceptLookup(c *C) {
   107  	parser := new(SpecParser)
   108  	specText := newSpecBuilder().specHeading("A spec heading").
   109  		tableHeader("id", "name", "phone").
   110  		tableHeader("123", "prateek", "8800").
   111  		scenarioHeading("First scenario").
   112  		step("create user <id> <name> and <phone>").
   113  		step("create user \"456\" \"foo\" and \"9900\"").
   114  		String()
   115  
   116  	conceptDictionary := gauge.NewConceptDictionary()
   117  	path, _ := filepath.Abs(filepath.Join("testdata", "dynamic_param_concept.cpt"))
   118  	_, _, err := AddConcepts([]string{path}, conceptDictionary)
   119  	c.Assert(err, IsNil)
   120  	spec, _, _ := parser.Parse(specText, conceptDictionary, "")
   121  	concept1 := spec.Scenarios[0].Steps[0]
   122  
   123  	dataTableLookup := new(gauge.ArgLookup)
   124  	err = dataTableLookup.ReadDataTableRow(spec.DataTable.Table, 0)
   125  	c.Assert(err, IsNil)
   126  	err = PopulateConceptDynamicParams(concept1, dataTableLookup)
   127  	c.Assert(err, IsNil)
   128  
   129  	useridArg1, _ := concept1.GetArg("user-id")
   130  	c.Assert(useridArg1.Value, Equals, "123")
   131  	usernameArg1, _ := concept1.GetArg("user-name")
   132  	c.Assert(usernameArg1.Value, Equals, "prateek")
   133  	userphoneArg1, _ := concept1.GetArg("user-phone")
   134  	c.Assert(userphoneArg1.Value, Equals, "8800")
   135  
   136  	nestedConcept := concept1.ConceptSteps[0]
   137  	useridArgN1, _ := nestedConcept.GetArg("userid")
   138  	c.Assert(useridArgN1.Value, Equals, "123")
   139  	usernameArgN1, _ := nestedConcept.GetArg("username")
   140  	c.Assert(usernameArgN1.Value, Equals, "prateek")
   141  
   142  	concept2 := spec.Scenarios[0].Steps[1]
   143  	useridArg2, _ := concept2.GetArg("user-id")
   144  	c.Assert(useridArg2.Value, Equals, "456")
   145  	usernameArg2, _ := concept2.GetArg("user-name")
   146  	c.Assert(usernameArg2.Value, Equals, "foo")
   147  	userphoneArg2, _ := concept2.GetArg("user-phone")
   148  	c.Assert(userphoneArg2.Value, Equals, "9900")
   149  
   150  	nestedConcept2 := concept2.ConceptSteps[0]
   151  	useridArgN2, _ := nestedConcept2.GetArg("userid")
   152  	c.Assert(useridArgN2.Value, Equals, "456")
   153  	usernameArgN2, _ := nestedConcept2.GetArg("username")
   154  	c.Assert(usernameArgN2.Value, Equals, "foo")
   155  }
   156  
   157  func (s *MySuite) TestPopulatingNestedConceptsWithStaticParametersLookup(c *C) {
   158  	parser := new(SpecParser)
   159  	specText := newSpecBuilder().specHeading("A spec heading").
   160  		scenarioHeading("First scenario").
   161  		step("create user \"456\" \"foo\" and \"123456\"").
   162  		String()
   163  
   164  	conceptDictionary := gauge.NewConceptDictionary()
   165  	path, _ := filepath.Abs(filepath.Join("testdata", "static_param_concept.cpt"))
   166  	_, _, err := AddConcepts([]string{path}, conceptDictionary)
   167  	c.Assert(err, IsNil)
   168  
   169  	spec, _, _ := parser.Parse(specText, conceptDictionary, "")
   170  	concept1 := spec.Scenarios[0].Steps[0]
   171  
   172  	dataTableLookup := new(gauge.ArgLookup)
   173  	err = dataTableLookup.ReadDataTableRow(spec.DataTable.Table, 0)
   174  	c.Assert(err, IsNil)
   175  	err = PopulateConceptDynamicParams(concept1, dataTableLookup)
   176  	c.Assert(err, IsNil)
   177  	useridArg1, _ := concept1.GetArg("user-id")
   178  	c.Assert(useridArg1.Value, Equals, "456")
   179  	usernameArg1, _ := concept1.GetArg("user-name")
   180  	c.Assert(usernameArg1.Value, Equals, "foo")
   181  	userphoneArg1, _ := concept1.GetArg("user-phone")
   182  	c.Assert(userphoneArg1.Value, Equals, "123456")
   183  
   184  	nestedConcept := concept1.ConceptSteps[0]
   185  	useridArgN, _ := nestedConcept.GetArg("userid")
   186  	c.Assert(useridArgN.Value, Equals, "456")
   187  	usernameArgN, _ := nestedConcept.GetArg("username")
   188  	c.Assert(usernameArgN.Value, Equals, "static-value")
   189  }
   190  
   191  func (s *MySuite) TestPopulatingConceptsWithDynamicParametersInTable(c *C) {
   192  	parser := new(SpecParser)
   193  	specText := newSpecBuilder().specHeading("A spec heading").
   194  		tableHeader("property").
   195  		tableRow("something").
   196  		scenarioHeading("First scenario").
   197  		step("create user \"someone\" with ").
   198  		tableHeader("name").
   199  		tableRow("<property>").
   200  		String()
   201  	conceptDictionary := gauge.NewConceptDictionary()
   202  	path, _ := filepath.Abs(filepath.Join("testdata", "table_param_concept.cpt"))
   203  	_, _, err := AddConcepts([]string{path}, conceptDictionary)
   204  	c.Assert(err, IsNil)
   205  
   206  	spec, _, _ := parser.Parse(specText, conceptDictionary, "")
   207  	concept1 := spec.Scenarios[0].Steps[0]
   208  
   209  	dataTableLookup := new(gauge.ArgLookup)
   210  	err = dataTableLookup.ReadDataTableRow(spec.DataTable.Table, 0)
   211  	c.Assert(err, IsNil)
   212  	err = PopulateConceptDynamicParams(concept1, dataTableLookup)
   213  	c.Assert(err, IsNil)
   214  	tableArg, err := concept1.Lookup.GetArg("addresses")
   215  	c.Assert(err, IsNil)
   216  	v, err := tableArg.Table.Get("name")
   217  	c.Assert(err, IsNil)
   218  	c.Assert(v[0].CellType, Equals, gauge.Static)
   219  	c.Assert(v[0].Value, Equals, "something")
   220  }
   221  
   222  func (s *MySuite) TestEachConceptUsageIsUpdatedWithRespectiveParams(c *C) {
   223  	parser := new(SpecParser)
   224  	specText := newSpecBuilder().specHeading("A spec heading").
   225  		scenarioHeading("First scenario").
   226  		step("create user \"sdf\" \"name\" and \"1234\"").
   227  		String()
   228  
   229  	conceptDictionary := gauge.NewConceptDictionary()
   230  	path, _ := filepath.Abs(filepath.Join("testdata", "static_param_concept.cpt"))
   231  	_, _, err := AddConcepts([]string{path}, conceptDictionary)
   232  	c.Assert(err, IsNil)
   233  	spec, _, _ := parser.Parse(specText, conceptDictionary, "")
   234  	concept1 := spec.Scenarios[0].Steps[0]
   235  
   236  	nestedConcept := concept1.ConceptSteps[0]
   237  	nestedConcept1 := concept1.ConceptSteps[1]
   238  
   239  	usernameArg, _ := nestedConcept.GetArg("username")
   240  	c.Assert(usernameArg.Value, Equals, "static-value")
   241  	usernameArg1, _ := nestedConcept1.GetArg("username")
   242  	c.Assert(usernameArg1.Value, Equals, "static-value1")
   243  	useridArg, _ := nestedConcept.GetArg("userid")
   244  	c.Assert(useridArg.Value, Equals, "sdf")
   245  	useridArg1, _ := nestedConcept1.GetArg("userid")
   246  	c.Assert(useridArg1.Value, Equals, "sdf")
   247  }
   248  
   249  func (s *MySuite) TestGetResolveParameterFromTable(c *C) {
   250  	parser := new(SpecParser)
   251  	specText := newSpecBuilder().specHeading("Spec Heading").scenarioHeading("First scenario").step("my step").text("|name|id|").text("|---|---|").text("|john|123|").text("|james|<file:testdata/foo.txt>|").String()
   252  
   253  	specs, _ := parser.ParseSpecText(specText, "")
   254  
   255  	step := specs.Steps()[0]
   256  
   257  	parameters, err := getResolvedParams(step, nil, nil)
   258  
   259  	c.Assert(len(parameters), Equals, 1)
   260  	c.Assert(parameters[0].Table.Rows[0].GetCells()[0], Equals, "john")
   261  	c.Assert(parameters[0].Table.Rows[0].GetCells()[1], Equals, "123")
   262  	c.Assert(parameters[0].Table.Rows[1].GetCells()[0], Equals, "james")
   263  	c.Assert(parameters[0].Table.Rows[1].GetCells()[1], Equals, "007")
   264  
   265  	c.Assert(err, IsNil)
   266  }
   267  
   268  func (s *MySuite) TestGetResolveParameterFromDataTable(c *C) {
   269  	parser := new(SpecParser)
   270  	specText := newSpecBuilder().specHeading("Spec Heading").text("|name|id|").text("|---|---|").text("|john|123|").text("|james|<file:testdata/foo.txt>|").scenarioHeading("First scenario").step("my step <id>").String()
   271  	spec, _ := parser.ParseSpecText(specText, "")
   272  
   273  	GetResolvedDataTablerows(spec.DataTable.Table)
   274  
   275  	c.Assert(spec.DataTable.Table.Columns[0][0].Value, Equals, "john")
   276  	c.Assert(spec.DataTable.Table.Columns[0][1].Value, Equals, "james")
   277  	c.Assert(spec.DataTable.Table.Columns[1][0].Value, Equals, "123")
   278  	c.Assert(spec.DataTable.Table.Columns[1][1].Value, Equals, "007")
   279  }