github.com/getgauge/gauge@v1.6.9/execution/resolve_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 execution
     8  
     9  import (
    10  	"path/filepath"
    11  	"testing"
    12  
    13  	"github.com/getgauge/gauge-proto/go/gauge_messages"
    14  	"github.com/getgauge/gauge/gauge"
    15  	"github.com/getgauge/gauge/parser"
    16  	. "gopkg.in/check.v1"
    17  )
    18  
    19  func (s *MySuite) TestResolveConceptToProtoConceptItem(c *C) {
    20  	conceptDictionary := gauge.NewConceptDictionary()
    21  
    22  	specText := newSpecBuilder().specHeading("A spec heading").
    23  		scenarioHeading("First scenario").
    24  		step("create user \"456\" \"foo\" and \"9900\"").
    25  		String()
    26  	path, _ := filepath.Abs(filepath.Join("testdata", "concept.cpt"))
    27  	_, _, err := parser.AddConcepts([]string{path}, conceptDictionary)
    28  	if err != nil {
    29  		c.Error(err)
    30  	}
    31  	spec, _, err := new(parser.SpecParser).Parse(specText, conceptDictionary, "")
    32  	if err != nil {
    33  		c.Error(err)
    34  	}
    35  
    36  	specExecutor := newSpecExecutor(spec, nil, nil, nil, 0)
    37  	specExecutor.errMap = getValidationErrorMap()
    38  	lookup, err := specExecutor.dataTableLookup()
    39  	c.Assert(err, IsNil)
    40  	cItem, err := resolveToProtoConceptItem(*spec.Scenarios[0].Steps[0], lookup, specExecutor.setSkipInfo)
    41  	c.Assert(err, IsNil)
    42  	protoConcept := cItem.GetConcept()
    43  
    44  	checkConceptParameterValuesInOrder(c, protoConcept, "456", "foo", "9900")
    45  	firstNestedStep := protoConcept.GetSteps()[0].GetConcept().GetSteps()[0].GetStep()
    46  	params := getParameters(firstNestedStep.GetFragments())
    47  	c.Assert(1, Equals, len(params))
    48  	c.Assert(params[0].GetParameterType(), Equals, gauge_messages.Parameter_Dynamic)
    49  	c.Assert(params[0].GetValue(), Equals, "456")
    50  
    51  	secondNestedStep := protoConcept.GetSteps()[0].GetConcept().GetSteps()[1].GetStep()
    52  	params = getParameters(secondNestedStep.GetFragments())
    53  	c.Assert(1, Equals, len(params))
    54  	c.Assert(params[0].GetParameterType(), Equals, gauge_messages.Parameter_Dynamic)
    55  	c.Assert(params[0].GetValue(), Equals, "foo")
    56  
    57  	secondStep := protoConcept.GetSteps()[1].GetStep()
    58  	params = getParameters(secondStep.GetFragments())
    59  	c.Assert(1, Equals, len(params))
    60  	c.Assert(params[0].GetParameterType(), Equals, gauge_messages.Parameter_Dynamic)
    61  	c.Assert(params[0].GetValue(), Equals, "9900")
    62  
    63  }
    64  
    65  func (s *MySuite) TestResolveNestedConceptToProtoConceptItem(c *C) {
    66  	conceptDictionary := gauge.NewConceptDictionary()
    67  
    68  	specText := newSpecBuilder().specHeading("A spec heading").
    69  		scenarioHeading("First scenario").
    70  		step("create user \"456\" \"foo\" and \"9900\"").
    71  		String()
    72  
    73  	path, _ := filepath.Abs(filepath.Join("testdata", "concept.cpt"))
    74  	_, _, err := parser.AddConcepts([]string{path}, conceptDictionary)
    75  	if err != nil {
    76  		c.Error(err)
    77  	}
    78  	specParser := new(parser.SpecParser)
    79  	spec, _, _ := specParser.Parse(specText, conceptDictionary, "")
    80  
    81  	specExecutor := newSpecExecutor(spec, nil, nil, nil, 0)
    82  	specExecutor.errMap = getValidationErrorMap()
    83  	lookup, err := specExecutor.dataTableLookup()
    84  	c.Assert(err, IsNil)
    85  	cItem, err := resolveToProtoConceptItem(*spec.Scenarios[0].Steps[0], lookup, specExecutor.setSkipInfo)
    86  	c.Assert(err, IsNil)
    87  	protoConcept := cItem.GetConcept()
    88  	checkConceptParameterValuesInOrder(c, protoConcept, "456", "foo", "9900")
    89  
    90  	c.Assert(protoConcept.GetSteps()[0].GetItemType(), Equals, gauge_messages.ProtoItem_Concept)
    91  
    92  	nestedConcept := protoConcept.GetSteps()[0].GetConcept()
    93  	checkConceptParameterValuesInOrder(c, nestedConcept, "456", "foo")
    94  
    95  	firstNestedStep := nestedConcept.GetSteps()[0].GetStep()
    96  	params := getParameters(firstNestedStep.GetFragments())
    97  	c.Assert(1, Equals, len(params))
    98  	c.Assert(params[0].GetParameterType(), Equals, gauge_messages.Parameter_Dynamic)
    99  	c.Assert(params[0].GetValue(), Equals, "456")
   100  
   101  	secondNestedStep := nestedConcept.GetSteps()[1].GetStep()
   102  	params = getParameters(secondNestedStep.GetFragments())
   103  	c.Assert(1, Equals, len(params))
   104  	c.Assert(params[0].GetParameterType(), Equals, gauge_messages.Parameter_Dynamic)
   105  	c.Assert(params[0].GetValue(), Equals, "foo")
   106  
   107  	c.Assert(protoConcept.GetSteps()[1].GetItemType(), Equals, gauge_messages.ProtoItem_Step)
   108  	secondStepInConcept := protoConcept.GetSteps()[1].GetStep()
   109  	params = getParameters(secondStepInConcept.GetFragments())
   110  	c.Assert(1, Equals, len(params))
   111  	c.Assert(params[0].GetParameterType(), Equals, gauge_messages.Parameter_Dynamic)
   112  	c.Assert(params[0].GetValue(), Equals, "9900")
   113  }
   114  
   115  func TestResolveNestedConceptAndTableParamToProtoConceptItem(t *testing.T) {
   116  	conceptDictionary := gauge.NewConceptDictionary()
   117  
   118  	specText := newSpecBuilder().specHeading("A spec heading").
   119  		scenarioHeading("First scenario").
   120  		step("create user \"456\"").
   121  		String()
   122  	want := "456"
   123  	path, _ := filepath.Abs(filepath.Join("testdata", "conceptTable.cpt"))
   124  	_, _, err := parser.AddConcepts([]string{path}, conceptDictionary)
   125  	if err != nil {
   126  		t.Error(err)
   127  	}
   128  	specParser := new(parser.SpecParser)
   129  	spec, _, _ := specParser.Parse(specText, conceptDictionary, "")
   130  
   131  	specExecutor := newSpecExecutor(spec, nil, nil, nil, 0)
   132  	specExecutor.errMap = getValidationErrorMap()
   133  	lookup, err := specExecutor.dataTableLookup()
   134  	if err != nil {
   135  		t.Errorf("Expected no error. Got : %s", err.Error())
   136  	}
   137  	cItem, err := resolveToProtoConceptItem(*spec.Scenarios[0].Steps[0], lookup, specExecutor.setSkipInfo)
   138  	if err != nil {
   139  		t.Errorf("Expected no error. Got : %s", err.Error())
   140  	}
   141  	protoConcept := cItem.GetConcept()
   142  	got := getParameters(protoConcept.GetSteps()[0].GetStep().GetFragments())[0].GetTable().GetRows()[1].Cells[0]
   143  
   144  	if want != got {
   145  		t.Errorf("Did not resolve dynamic param in table for concept. Got %s, want: %s", got, want)
   146  	}
   147  }
   148  
   149  func (s *MySuite) TestResolveToProtoConceptItemWithDataTable(c *C) {
   150  	conceptDictionary := gauge.NewConceptDictionary()
   151  
   152  	specText := newSpecBuilder().specHeading("A spec heading").
   153  		tableHeader("id", "name", "phone").
   154  		tableHeader("123", "foo", "8800").
   155  		tableHeader("666", "bar", "9900").
   156  		scenarioHeading("First scenario").
   157  		step("create user <id> <name> and <phone>").
   158  		String()
   159  
   160  	path, _ := filepath.Abs(filepath.Join("testdata", "concept.cpt"))
   161  	_, _, err := parser.AddConcepts([]string{path}, conceptDictionary)
   162  	if err != nil {
   163  		c.Error(err)
   164  	}
   165  	specParser := new(parser.SpecParser)
   166  	spec, _, _ := specParser.Parse(specText, conceptDictionary, "")
   167  
   168  	specExecutor := newSpecExecutor(spec, nil, nil, nil, 0)
   169  
   170  	specExecutor.errMap = gauge.NewBuildErrors()
   171  	lookup, err := specExecutor.dataTableLookup()
   172  	c.Assert(err, IsNil)
   173  	cItem, err := resolveToProtoConceptItem(*spec.Scenarios[0].Steps[0], lookup, specExecutor.setSkipInfo)
   174  	c.Assert(err, IsNil)
   175  	protoConcept := cItem.GetConcept()
   176  	checkConceptParameterValuesInOrder(c, protoConcept, "123", "foo", "8800")
   177  
   178  	c.Assert(protoConcept.GetSteps()[0].GetItemType(), Equals, gauge_messages.ProtoItem_Concept)
   179  	nestedConcept := protoConcept.GetSteps()[0].GetConcept()
   180  	checkConceptParameterValuesInOrder(c, nestedConcept, "123", "foo")
   181  	firstNestedStep := nestedConcept.GetSteps()[0].GetStep()
   182  	params := getParameters(firstNestedStep.GetFragments())
   183  	c.Assert(1, Equals, len(params))
   184  	c.Assert(params[0].GetParameterType(), Equals, gauge_messages.Parameter_Dynamic)
   185  	c.Assert(params[0].GetValue(), Equals, "123")
   186  
   187  	secondNestedStep := nestedConcept.GetSteps()[1].GetStep()
   188  	params = getParameters(secondNestedStep.GetFragments())
   189  	c.Assert(1, Equals, len(params))
   190  	c.Assert(params[0].GetParameterType(), Equals, gauge_messages.Parameter_Dynamic)
   191  	c.Assert(params[0].GetValue(), Equals, "foo")
   192  
   193  	c.Assert(protoConcept.GetSteps()[1].GetItemType(), Equals, gauge_messages.ProtoItem_Step)
   194  	secondStepInConcept := protoConcept.GetSteps()[1].GetStep()
   195  	params = getParameters(secondStepInConcept.GetFragments())
   196  	c.Assert(1, Equals, len(params))
   197  	c.Assert(params[0].GetParameterType(), Equals, gauge_messages.Parameter_Dynamic)
   198  	c.Assert(params[0].GetValue(), Equals, "8800")
   199  }
   200  
   201  func checkConceptParameterValuesInOrder(c *C, concept *gauge_messages.ProtoConcept, paramValues ...string) {
   202  	params := getParameters(concept.GetConceptStep().Fragments)
   203  	c.Assert(len(params), Equals, len(paramValues))
   204  	for i, param := range params {
   205  		c.Assert(param.GetValue(), Equals, paramValues[i])
   206  	}
   207  }