From 6c3e2a2103c84b1f16aadcd1133b86f7604c8f21 Mon Sep 17 00:00:00 2001 From: Softonik Date: Mon, 22 Aug 2022 22:04:02 +0300 Subject: [PATCH] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D0=B0=20=D0=BF=D0=BE=D0=B4=D0=B4=D0=B5=D1=80=D0=B6=D0=BA?= =?UTF-8?q?=D0=B0=20focused-=D1=82=D0=B5=D1=81=D1=82=D0=BE=D0=B2=20=D0=B2?= =?UTF-8?q?=D0=BE=20=D0=BC=D0=BD=D0=BE=D0=B6=D0=B5=D1=81=D1=82=D0=B2=D0=B5?= =?UTF-8?q?=20feature-=D1=84=D0=B0=D0=B9=D0=BB=D0=BE=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- features/tags.feature | 44 ++++++++++++++++++++++++++++ internal/parser/parser.go | 46 ++++++++++++++++++++++++++++-- internal/parser/parser_test.go | 52 ++++++++++++++++++++++++++++++++++ suite_context_test.go | 5 +--- 4 files changed, 141 insertions(+), 6 deletions(-) diff --git a/features/tags.feature b/features/tags.feature index 0d058f3..55f2906 100644 --- a/features/tags.feature +++ b/features/tags.feature @@ -153,3 +153,47 @@ Feature: tag filters a feature path "three" a feature path "four" """ + + Scenario: two feature files and scenarios with f-tag - are executed only + Given a feature "normal.feature" file: + """ + Feature: f-tagged + + Scenario: one + Given a feature path "one" + + Scenario: two + Given a feature path "two" + + @f + Scenario: three + Given a feature path "three" + + @f + Scenario: four + Given a feature path "four" + """ + And a feature "another.feature" file: + """ + Feature: non-tagged + + Scenario: five + Given a feature path "five" + + Scenario: six + Given a feature path "six" + + Scenario: seven + Given a feature path "seven" + + Scenario: eight + Given a feature path "eight" + """ + When I run feature suite with tags "" + Then the suite should have passed + And I should have 2 scenario registered + And the following steps should be passed: + """ + a feature path "three" + a feature path "four" + """ diff --git a/internal/parser/parser.go b/internal/parser/parser.go index c505cde..6c6ec4b 100644 --- a/internal/parser/parser.go +++ b/internal/parser/parser.go @@ -157,19 +157,61 @@ func ParseFeatures(filter string, paths []string) ([]*models.Feature, error) { features[idx] = feature } - features = filterFeatures(filter, features) + features = FilterFeatures(filter, features) return features, nil } -func filterFeatures(filter string, features []*models.Feature) (result []*models.Feature) { +func FilterFeatures(filter string, features []*models.Feature) (result []*models.Feature) { + focused := false + for _, ft := range features { ft.Pickles = tags.ApplyTagFilter(filter, ft.Pickles) + if containsFocusedPickle(ft.Pickles) { + focused = true + } + if ft.Feature != nil && len(ft.Pickles) > 0 { result = append(result, ft) } } + if !focused { + return + } + + var resultF []*models.Feature + for _, ft := range result { + ft.Pickles = filterFocusedPickles(ft.Pickles) + resultF = append(resultF, ft) + } + + return resultF +} + +func containsFocusedPickle(pickles []*messages.Pickle) bool { + for _, p := range pickles { + if containsFocusedTag(p.Tags) { + return true + } + } + return false +} +func containsFocusedTag(tags []*messages.PickleTag) bool { + for _, t := range tags { + if t.Name == "@f" { + return true + } + } + return false +} + +func filterFocusedPickles(pickles []*messages.Pickle) (result []*messages.Pickle) { + for _, p := range pickles { + if containsFocusedTag(p.Tags) { + result = append(result, p) + } + } return } diff --git a/internal/parser/parser_test.go b/internal/parser/parser_test.go index 19fbf85..e53397d 100644 --- a/internal/parser/parser_test.go +++ b/internal/parser/parser_test.go @@ -10,6 +10,7 @@ import ( "github.com/stretchr/testify/require" "github.com/cucumber/godog/internal/parser" + "github.com/cucumber/messages-go/v16" ) func Test_FeatureFilePathParser(t *testing.T) { @@ -77,3 +78,54 @@ func Test_ParseFeatures_FromMultiplePaths(t *testing.T) { } } } + +func Test_FilterF_Features_FromMultipleFiles(t *testing.T) { + const featureFileName = "godogs.feature" + const featureFileContentsF = `Feature: focused + + @f + Scenario: Focused + Given something + When do + Then ok` + + const featureFileContentsNormal = `Feature: normal + Scenario: normal + Given something + When do + Then ok` + + baseDir := filepath.Join(os.TempDir(), t.Name(), "godogs") + errA := os.MkdirAll(baseDir+"/a", 0755) + errB := os.MkdirAll(baseDir+"/b", 0755) + defer os.RemoveAll(baseDir) + + require.Nil(t, errA) + require.Nil(t, errB) + + err := ioutil.WriteFile(filepath.Join(baseDir+"/a", featureFileName), []byte(featureFileContentsF), 0644) + require.Nil(t, err) + err = ioutil.WriteFile(filepath.Join(baseDir+"/b", featureFileName), []byte(featureFileContentsNormal), 0644) + require.Nil(t, err) + + features, err := parser.ParseFeatures("", []string{baseDir + "/a", baseDir + "/b"}) + assert.Nil(t, err) + assert.Len(t, features, 2) + + for _, f := range features { + for _, p := range f.Pickles { + if !containsFocusedTag(p.Tags) { + assert.Failf(t, "found not Focused pickle", "Found not Focused pickle", p.Tags) + } + } + } +} + +func containsFocusedTag(tags []*messages.PickleTag) bool { + for _, t := range tags { + if t.Name == "@f" { + return true + } + } + return false +} diff --git a/suite_context_test.go b/suite_context_test.go index e4ae8c7..0f0c626 100644 --- a/suite_context_test.go +++ b/suite_context_test.go @@ -21,7 +21,6 @@ import ( "github.com/cucumber/godog/internal/models" "github.com/cucumber/godog/internal/parser" "github.com/cucumber/godog/internal/storage" - "github.com/cucumber/godog/internal/tags" "github.com/cucumber/godog/internal/utils" ) @@ -233,9 +232,7 @@ func (tc *godogFeaturesScenario) iRunFeatureSuiteWithTagsAndFormatter(filter str return err } - for _, feat := range tc.features { - feat.Pickles = tags.ApplyTagFilter(filter, feat.Pickles) - } + tc.features = parser.FilterFeatures(filter, tc.features) tc.testedSuite.storage = storage.NewStorage() for _, feat := range tc.features {