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 }