godog/run_progress_test.go
MBow 5414f3c5da update gherkin-go to v19.0.3
update messages-go to v16.0.1
bump gomod version
comment on log line in std os.Stderr
examples to non rc version
go mod tidy
update circle (tbd)
2021-06-28 17:19:43 +01:00

263 строки
6,6 КиБ
Go

package godog
import (
"bytes"
"github.com/cucumber/messages-go/v16"
"strings"
"testing"
"github.com/cucumber/gherkin-go/v19"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
"github.com/cucumber/godog/colors"
"github.com/cucumber/godog/internal/formatters"
"github.com/cucumber/godog/internal/models"
"github.com/cucumber/godog/internal/storage"
)
var basicGherkinFeature = `
Feature: basic
Scenario: passing scenario
When one
Then two
`
func Test_ProgressFormatterWhenStepPanics(t *testing.T) {
const path = "any.feature"
gd, err := gherkin.ParseGherkinDocument(strings.NewReader(basicGherkinFeature), (&messages.Incrementing{}).NewId)
require.NoError(t, err)
gd.Uri = path
ft := models.Feature{GherkinDocument: gd}
ft.Pickles = gherkin.Pickles(*gd, path, (&messages.Incrementing{}).NewId)
var buf bytes.Buffer
w := colors.Uncolored(&buf)
r := runner{
fmt: formatters.ProgressFormatterFunc("progress", w),
features: []*models.Feature{&ft},
scenarioInitializer: func(ctx *ScenarioContext) {
ctx.Step(`^one$`, func() error { return nil })
ctx.Step(`^two$`, func() error { panic("omg") })
},
}
r.storage = storage.NewStorage()
r.storage.MustInsertFeature(&ft)
for _, pickle := range ft.Pickles {
r.storage.MustInsertPickle(pickle)
}
failed := r.concurrent(1)
require.True(t, failed)
actual := buf.String()
assert.Contains(t, actual, "godog/run_progress_test.go:")
}
func Test_ProgressFormatterWithPanicInMultistep(t *testing.T) {
const path = "any.feature"
gd, err := gherkin.ParseGherkinDocument(strings.NewReader(basicGherkinFeature), (&messages.Incrementing{}).NewId)
require.NoError(t, err)
gd.Uri = path
ft := models.Feature{GherkinDocument: gd}
ft.Pickles = gherkin.Pickles(*gd, path, (&messages.Incrementing{}).NewId)
var buf bytes.Buffer
w := colors.Uncolored(&buf)
r := runner{
fmt: formatters.ProgressFormatterFunc("progress", w),
features: []*models.Feature{&ft},
scenarioInitializer: func(ctx *ScenarioContext) {
ctx.Step(`^sub1$`, func() error { return nil })
ctx.Step(`^sub-sub$`, func() error { return nil })
ctx.Step(`^sub2$`, func() []string { return []string{"sub-sub", "sub1", "one"} })
ctx.Step(`^one$`, func() error { return nil })
ctx.Step(`^two$`, func() []string { return []string{"sub1", "sub2"} })
},
}
r.storage = storage.NewStorage()
r.storage.MustInsertFeature(&ft)
for _, pickle := range ft.Pickles {
r.storage.MustInsertPickle(pickle)
}
failed := r.concurrent(1)
require.True(t, failed)
}
func Test_ProgressFormatterMultistepTemplates(t *testing.T) {
const path = "any.feature"
gd, err := gherkin.ParseGherkinDocument(strings.NewReader(basicGherkinFeature), (&messages.Incrementing{}).NewId)
require.NoError(t, err)
gd.Uri = path
ft := models.Feature{GherkinDocument: gd}
ft.Pickles = gherkin.Pickles(*gd, path, (&messages.Incrementing{}).NewId)
var buf bytes.Buffer
w := colors.Uncolored(&buf)
r := runner{
fmt: formatters.ProgressFormatterFunc("progress", w),
features: []*models.Feature{&ft},
scenarioInitializer: func(ctx *ScenarioContext) {
ctx.Step(`^sub-sub$`, func() error { return nil })
ctx.Step(`^substep$`, func() Steps { return Steps{"sub-sub", `unavailable "John" cost 5`, "one", "three"} })
ctx.Step(`^one$`, func() error { return nil })
ctx.Step(`^(t)wo$`, func(s string) Steps { return Steps{"undef", "substep"} })
},
}
r.storage = storage.NewStorage()
r.storage.MustInsertFeature(&ft)
for _, pickle := range ft.Pickles {
r.storage.MustInsertPickle(pickle)
}
failed := r.concurrent(1)
require.False(t, failed)
expected := `.U 2
1 scenarios (1 undefined)
2 steps (1 passed, 1 undefined)
0s
You can implement step definitions for undefined steps with these snippets:
func three() error {
return godog.ErrPending
}
func unavailableCost(arg1 string, arg2 int) error {
return godog.ErrPending
}
func undef() error {
return godog.ErrPending
}
func InitializeScenario(ctx *godog.ScenarioContext) {
ctx.Step(` + "`^three$`" + `, three)
ctx.Step(` + "`^unavailable \"([^\"]*)\" cost (\\d+)$`" + `, unavailableCost)
ctx.Step(` + "`^undef$`" + `, undef)
}
`
actual := buf.String()
assert.Equal(t, expected, actual)
}
func Test_ProgressFormatterWhenMultiStepHasArgument(t *testing.T) {
const path = "any.feature"
var featureSource = `
Feature: basic
Scenario: passing scenario
When one
Then two:
"""
text
"""
`
gd, err := gherkin.ParseGherkinDocument(strings.NewReader(featureSource), (&messages.Incrementing{}).NewId)
require.NoError(t, err)
gd.Uri = path
ft := models.Feature{GherkinDocument: gd}
ft.Pickles = gherkin.Pickles(*gd, path, (&messages.Incrementing{}).NewId)
var buf bytes.Buffer
w := colors.Uncolored(&buf)
r := runner{
fmt: formatters.ProgressFormatterFunc("progress", w),
features: []*models.Feature{&ft},
scenarioInitializer: func(ctx *ScenarioContext) {
ctx.Step(`^one$`, func() error { return nil })
ctx.Step(`^two:$`, func(doc *messages.PickleDocString) Steps { return Steps{"one"} })
},
}
r.storage = storage.NewStorage()
r.storage.MustInsertFeature(&ft)
for _, pickle := range ft.Pickles {
r.storage.MustInsertPickle(pickle)
}
failed := r.concurrent(1)
require.False(t, failed)
}
func Test_ProgressFormatterWhenMultiStepHasStepWithArgument(t *testing.T) {
const path = "any.feature"
var featureSource = `
Feature: basic
Scenario: passing scenario
When one
Then two`
gd, err := gherkin.ParseGherkinDocument(strings.NewReader(featureSource), (&messages.Incrementing{}).NewId)
require.NoError(t, err)
gd.Uri = path
ft := models.Feature{GherkinDocument: gd}
ft.Pickles = gherkin.Pickles(*gd, path, (&messages.Incrementing{}).NewId)
var subStep = `three:
"""
content
"""`
var buf bytes.Buffer
w := colors.Uncolored(&buf)
r := runner{
fmt: formatters.ProgressFormatterFunc("progress", w),
features: []*models.Feature{&ft},
scenarioInitializer: func(ctx *ScenarioContext) {
ctx.Step(`^one$`, func() error { return nil })
ctx.Step(`^two$`, func() Steps { return Steps{subStep} })
ctx.Step(`^three:$`, func(doc *messages.PickleDocString) error { return nil })
},
}
r.storage = storage.NewStorage()
r.storage.MustInsertFeature(&ft)
for _, pickle := range ft.Pickles {
r.storage.MustInsertPickle(pickle)
}
failed := r.concurrent(1)
require.True(t, failed)
expected := `.F 2
--- Failed steps:
Scenario: passing scenario # any.feature:4
Then two # any.feature:6
Error: nested steps cannot be multiline and have table or content body argument
1 scenarios (1 failed)
2 steps (1 passed, 1 failed)
0s
`
actual := buf.String()
assert.Equal(t, expected, actual)
}