mirror of
https://github.com/ProtonMail/proton-bridge.git
synced 2025-12-16 23:26:44 +00:00
GODT-2181(test): Use [user:NAME] for test user name
This commit is contained in:
@ -31,10 +31,33 @@ type scenario struct {
|
|||||||
t *testCtx
|
t *testCtx
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// reset resets the test context for a new scenario.
|
||||||
func (s *scenario) reset(tb testing.TB) {
|
func (s *scenario) reset(tb testing.TB) {
|
||||||
s.t = newTestCtx(tb)
|
s.t = newTestCtx(tb)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// replace replaces the placeholders in the scenario with the values from the test context.
|
||||||
|
func (s *scenario) replace(sc *godog.Scenario) {
|
||||||
|
for _, step := range sc.Steps {
|
||||||
|
step.Text = s.t.replace(step.Text)
|
||||||
|
|
||||||
|
if arg := step.Argument; arg != nil {
|
||||||
|
if table := arg.DataTable; table != nil {
|
||||||
|
for _, row := range table.Rows {
|
||||||
|
for _, cell := range row.Cells {
|
||||||
|
cell.Value = s.t.replace(cell.Value)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if doc := arg.DocString; doc != nil {
|
||||||
|
doc.Content = s.t.replace(doc.Content)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// close closes the test context.
|
||||||
func (s *scenario) close(_ testing.TB) {
|
func (s *scenario) close(_ testing.TB) {
|
||||||
s.t.close(context.Background())
|
s.t.close(context.Background())
|
||||||
}
|
}
|
||||||
@ -54,8 +77,9 @@ func TestFeatures(testingT *testing.T) {
|
|||||||
},
|
},
|
||||||
|
|
||||||
ScenarioInitializer: func(ctx *godog.ScenarioContext) {
|
ScenarioInitializer: func(ctx *godog.ScenarioContext) {
|
||||||
ctx.Before(func(ctx context.Context, _ *godog.Scenario) (context.Context, error) {
|
ctx.Before(func(ctx context.Context, sc *godog.Scenario) (context.Context, error) {
|
||||||
s.reset(testingT)
|
s.reset(testingT)
|
||||||
|
s.replace(sc)
|
||||||
return ctx, nil
|
return ctx, nil
|
||||||
})
|
})
|
||||||
|
|
||||||
@ -66,9 +90,7 @@ func TestFeatures(testingT *testing.T) {
|
|||||||
|
|
||||||
ctx.StepContext().Before(func(ctx context.Context, st *godog.Step) (context.Context, error) {
|
ctx.StepContext().Before(func(ctx context.Context, st *godog.Step) (context.Context, error) {
|
||||||
logrus.Debugf("Running step: %s", st.Text)
|
logrus.Debugf("Running step: %s", st.Text)
|
||||||
|
|
||||||
s.t.beforeStep(st)
|
s.t.beforeStep(st)
|
||||||
|
|
||||||
return ctx, nil
|
return ctx, nil
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|||||||
@ -37,6 +37,7 @@ import (
|
|||||||
"github.com/bradenaw/juniper/xslices"
|
"github.com/bradenaw/juniper/xslices"
|
||||||
"github.com/cucumber/godog"
|
"github.com/cucumber/godog"
|
||||||
"github.com/emersion/go-imap/client"
|
"github.com/emersion/go-imap/client"
|
||||||
|
"github.com/google/uuid"
|
||||||
"github.com/sirupsen/logrus"
|
"github.com/sirupsen/logrus"
|
||||||
"golang.org/x/exp/maps"
|
"golang.org/x/exp/maps"
|
||||||
"google.golang.org/grpc"
|
"google.golang.org/grpc"
|
||||||
@ -69,6 +70,7 @@ type testCtx struct {
|
|||||||
clientEventCh *queue.QueuedChannel[*frontend.StreamEvent]
|
clientEventCh *queue.QueuedChannel[*frontend.StreamEvent]
|
||||||
|
|
||||||
// These maps hold expected userIDByName, their primary addresses and bridge passwords.
|
// These maps hold expected userIDByName, their primary addresses and bridge passwords.
|
||||||
|
userUUIDByName map[string]string
|
||||||
userIDByName map[string]string
|
userIDByName map[string]string
|
||||||
userAddrByEmail map[string]map[string]string
|
userAddrByEmail map[string]map[string]string
|
||||||
userPassByID map[string]string
|
userPassByID map[string]string
|
||||||
@ -111,6 +113,7 @@ func newTestCtx(tb testing.TB) *testCtx {
|
|||||||
events: newEventCollector(),
|
events: newEventCollector(),
|
||||||
reporter: newReportRecorder(tb),
|
reporter: newReportRecorder(tb),
|
||||||
|
|
||||||
|
userUUIDByName: make(map[string]string),
|
||||||
userIDByName: make(map[string]string),
|
userIDByName: make(map[string]string),
|
||||||
userAddrByEmail: make(map[string]map[string]string),
|
userAddrByEmail: make(map[string]map[string]string),
|
||||||
userPassByID: make(map[string]string),
|
userPassByID: make(map[string]string),
|
||||||
@ -137,26 +140,22 @@ func (t *testCtx) replace(value string) string {
|
|||||||
// Replace [domain] with the domain of the test server.
|
// Replace [domain] with the domain of the test server.
|
||||||
value = strings.ReplaceAll(value, "[domain]", t.api.GetDomain())
|
value = strings.ReplaceAll(value, "[domain]", t.api.GetDomain())
|
||||||
|
|
||||||
|
// Replace [user:NAME] with a unique ID for the user NAME.
|
||||||
|
value = regexp.MustCompile(`\[user:(\w+)\]`).ReplaceAllStringFunc(value, func(match string) string {
|
||||||
|
name := regexp.MustCompile(`\[user:(\w+)\]`).FindStringSubmatch(match)[1]
|
||||||
|
|
||||||
|
// Create a new user if it doesn't exist yet.
|
||||||
|
if _, ok := t.userUUIDByName[name]; !ok {
|
||||||
|
t.userUUIDByName[name] = uuid.NewString()
|
||||||
|
}
|
||||||
|
|
||||||
|
return t.userUUIDByName[name]
|
||||||
|
})
|
||||||
|
|
||||||
return value
|
return value
|
||||||
}
|
}
|
||||||
|
|
||||||
func (t *testCtx) beforeStep(st *godog.Step) {
|
func (t *testCtx) beforeStep(st *godog.Step) {
|
||||||
st.Text = t.replace(st.Text)
|
|
||||||
|
|
||||||
if argument := st.Argument; argument != nil {
|
|
||||||
if table := argument.DataTable; table != nil {
|
|
||||||
for _, row := range table.Rows {
|
|
||||||
for _, cell := range row.Cells {
|
|
||||||
cell.Value = t.replace(cell.Value)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if doc := argument.DocString; doc != nil {
|
|
||||||
doc.Content = t.replace(doc.Content)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
t.callsLock.Lock()
|
t.callsLock.Lock()
|
||||||
defer t.callsLock.Unlock()
|
defer t.callsLock.Unlock()
|
||||||
|
|
||||||
@ -165,7 +164,6 @@ func (t *testCtx) beforeStep(st *godog.Step) {
|
|||||||
|
|
||||||
t.calls = append(t.calls, nil)
|
t.calls = append(t.calls, nil)
|
||||||
t.errors = append(t.errors, nil)
|
t.errors = append(t.errors, nil)
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (t *testCtx) getName(wantUserID string) string {
|
func (t *testCtx) getName(wantUserID string) string {
|
||||||
|
|||||||
@ -1,36 +1,36 @@
|
|||||||
Feature: A user can login
|
Feature: A user can login
|
||||||
Background:
|
Background:
|
||||||
Given there exists an account with username "user" and password "password"
|
Given there exists an account with username "[user:user]" and password "password"
|
||||||
And bridge starts
|
And bridge starts
|
||||||
|
|
||||||
Scenario: Login to account
|
Scenario: Login to account
|
||||||
When the user logs in with username "user" and password "password"
|
When the user logs in with username "[user:user]" and password "password"
|
||||||
Then user "user" is listed and connected
|
Then user "[user:user]" is listed and connected
|
||||||
|
|
||||||
Scenario: Login to account with wrong password
|
Scenario: Login to account with wrong password
|
||||||
When the user logs in with username "user" and password "wrong"
|
When the user logs in with username "[user:user]" and password "wrong"
|
||||||
Then user "user" is not listed
|
Then user "[user:user]" is not listed
|
||||||
|
|
||||||
Scenario: Login to nonexistent account
|
Scenario: Login to nonexistent account
|
||||||
When the user logs in with username "other" and password "unknown"
|
When the user logs in with username "[user:other]" and password "unknown"
|
||||||
Then user "other" is not listed
|
Then user "[user:other]" is not listed
|
||||||
|
|
||||||
Scenario: Login to account without internet
|
Scenario: Login to account without internet
|
||||||
Given the internet is turned off
|
Given the internet is turned off
|
||||||
When the user logs in with username "user" and password "password"
|
When the user logs in with username "[user:user]" and password "password"
|
||||||
Then user "user" is not listed
|
Then user "[user:user]" is not listed
|
||||||
|
|
||||||
Scenario: Login to account without internet but the connection is later restored
|
Scenario: Login to account without internet but the connection is later restored
|
||||||
When the user logs in with username "user" and password "password"
|
When the user logs in with username "[user:user]" and password "password"
|
||||||
And bridge stops
|
And bridge stops
|
||||||
And the internet is turned off
|
And the internet is turned off
|
||||||
And bridge starts
|
And bridge starts
|
||||||
And the internet is turned on
|
And the internet is turned on
|
||||||
Then user "user" is eventually listed and connected
|
Then user "[user:user]" is eventually listed and connected
|
||||||
|
|
||||||
Scenario: Login to multiple accounts
|
Scenario: Login to multiple accounts
|
||||||
Given there exists an account with username "additional" and password "other"
|
Given there exists an account with username "[user:additional]" and password "password"
|
||||||
When the user logs in with username "user" and password "password"
|
When the user logs in with username "[user:user]" and password "password"
|
||||||
And the user logs in with username "additional" and password "other"
|
And the user logs in with username "[user:additional]" and password "password"
|
||||||
Then user "user" is listed and connected
|
Then user "[user:user]" is listed and connected
|
||||||
And user "additional" is listed and connected
|
And user "[user:additional]" is listed and connected
|
||||||
@ -76,10 +76,10 @@ func (s *scenario) theAccountHasAdditionalAddress(username, address string) erro
|
|||||||
if err := s.t.runQuarkCmd(
|
if err := s.t.runQuarkCmd(
|
||||||
context.Background(),
|
context.Background(),
|
||||||
"user:create:address",
|
"user:create:address",
|
||||||
|
"--gen-keys", "RSA2048",
|
||||||
userID,
|
userID,
|
||||||
s.t.getUserPass(userID),
|
s.t.getUserPass(userID),
|
||||||
address,
|
address,
|
||||||
"--gen-keys", "RSA2048",
|
|
||||||
); err != nil {
|
); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user