Other: Bump liteapi and clean up tests a bit

This commit is contained in:
James Houlahan
2022-10-20 02:41:43 +02:00
parent 04b6571cb8
commit c4343e0124
14 changed files with 259 additions and 89 deletions

View File

@ -19,7 +19,6 @@ package tests
import (
"github.com/Masterminds/semver/v3"
"gitlab.protontech.ch/go/liteapi"
"gitlab.protontech.ch/go/liteapi/server"
)
@ -30,12 +29,10 @@ type API interface {
AddCallWatcher(func(server.Call), ...string)
CreateUser(username, address string, password []byte) (string, string, error)
CreateAddress(userID, address string, password []byte) (string, error)
RemoveAddress(userID, addrID string) error
RevokeUser(userID string) error
GetLabels(userID string) ([]liteapi.Label, error)
CreateLabel(userID, name string, labelType liteapi.LabelType) (string, error)
CreateAddress(userID, address string, password []byte) (string, error)
RemoveAddress(userID, addrID string) error
Close()
}
@ -46,6 +43,6 @@ type fakeAPI struct {
func newFakeAPI() *fakeAPI {
return &fakeAPI{
Server: server.NewTLS(),
Server: server.New(),
}
}

87
tests/ctx_helper_test.go Normal file
View File

@ -0,0 +1,87 @@
// Copyright (c) 2022 Proton AG
//
// This file is part of Proton Mail Bridge.
//
// Proton Mail Bridge is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// Proton Mail Bridge is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with Proton Mail Bridge. If not, see <https://www.gnu.org/licenses/>.
package tests
import (
"context"
"runtime"
"github.com/bradenaw/juniper/stream"
"gitlab.protontech.ch/go/liteapi"
)
func (t *testCtx) withClient(ctx context.Context, username string, fn func(context.Context, *liteapi.Client) error) error {
c, _, err := liteapi.New(
liteapi.WithHostURL(t.api.GetHostURL()),
liteapi.WithTransport(liteapi.InsecureTransport()),
).NewClientWithLogin(ctx, username, []byte(t.getUserPass(t.getUserID(username))))
if err != nil {
return err
}
if err := fn(ctx, c); err != nil {
return err
}
if err := c.AuthDelete(ctx); err != nil {
return err
}
return c.Close()
}
func (t *testCtx) createMessages(ctx context.Context, username, addrID string, req []liteapi.ImportReq) error {
return t.withClient(ctx, username, func(ctx context.Context, c *liteapi.Client) error {
user, err := c.GetUser(ctx)
if err != nil {
return err
}
addr, err := c.GetAddresses(ctx)
if err != nil {
return err
}
salt, err := c.GetSalts(ctx)
if err != nil {
return err
}
keyPass, err := salt.SaltForKey([]byte(t.getUserPass(t.getUserID(username))), user.Keys.Primary().ID)
if err != nil {
return err
}
_, addrKRs, err := liteapi.Unlock(user, addr, keyPass)
if err != nil {
return err
}
if _, err := stream.Collect(ctx, c.ImportMessages(
ctx,
addrKRs[addrID],
runtime.NumCPU(),
runtime.NumCPU(),
req...,
)); err != nil {
return err
}
return nil
})
}

View File

@ -125,6 +125,16 @@ func (t *testCtx) beforeStep() {
t.errors = append(t.errors, nil)
}
func (t *testCtx) getName(wantUserID string) string {
for name, userID := range t.userIDByName {
if userID == wantUserID {
return name
}
}
panic(fmt.Sprintf("unknown user ID %q", wantUserID))
}
func (t *testCtx) getUserID(username string) string {
return t.userIDByName[username]
}
@ -174,20 +184,33 @@ func (t *testCtx) setUserBridgePass(userID string, pass []byte) {
}
func (t *testCtx) getMBoxID(userID string, name string) string {
labels, err := t.api.GetLabels(userID)
if err != nil {
ctx, cancel := context.WithCancel(context.Background())
defer cancel()
var labelID string
if err := t.withClient(ctx, t.getName(userID), func(ctx context.Context, client *liteapi.Client) error {
labels, err := client.GetLabels(ctx, liteapi.LabelTypeLabel, liteapi.LabelTypeFolder, liteapi.LabelTypeSystem)
if err != nil {
panic(err)
}
idx := xslices.IndexFunc(labels, func(label liteapi.Label) bool {
return label.Name == name
})
if idx < 0 {
panic(fmt.Errorf("label %q not found", name))
}
labelID = labels[idx].ID
return nil
}); err != nil {
panic(err)
}
idx := xslices.IndexFunc(labels, func(label liteapi.Label) bool {
return label.Name == name
})
if idx < 0 {
panic(fmt.Errorf("label %q not found", name))
}
return labels[idx].ID
return labelID
}
func (t *testCtx) getLastCall(method, path string) (server.Call, error) {

View File

@ -68,9 +68,7 @@ func (msg Message) Build() []byte {
b = append(b, "Subject: "+msg.Subject+"\r\n"...)
}
if msg.Body != "" {
b = append(b, "\r\n"+msg.Body+"\r\n"...)
}
b = append(b, "\r\n"+msg.Body+"\r\n"...)
return b
}

View File

@ -22,6 +22,8 @@ import (
"errors"
"fmt"
"github.com/bradenaw/juniper/iterator"
"github.com/bradenaw/juniper/xslices"
"github.com/cucumber/godog"
"github.com/google/uuid"
"gitlab.protontech.ch/go/liteapi"
@ -74,26 +76,45 @@ func (s *scenario) theAccountNoLongerHasAdditionalAddress(username, address stri
}
func (s *scenario) theAccountHasCustomFolders(username string, count int) error {
for idx := 0; idx < count; idx++ {
if _, err := s.t.api.CreateLabel(s.t.getUserID(username), uuid.NewString(), liteapi.LabelTypeFolder); err != nil {
return err
}
}
ctx, cancel := context.WithCancel(context.Background())
defer cancel()
return nil
return s.t.withClient(ctx, username, func(ctx context.Context, client *liteapi.Client) error {
for idx := 0; idx < count; idx++ {
if _, err := client.CreateLabel(ctx, liteapi.CreateLabelReq{
Name: uuid.NewString(),
Type: liteapi.LabelTypeFolder,
}); err != nil {
return err
}
}
return nil
})
}
func (s *scenario) theAccountHasCustomLabels(username string, count int) error {
for idx := 0; idx < count; idx++ {
if _, err := s.t.api.CreateLabel(s.t.getUserID(username), uuid.NewString(), liteapi.LabelTypeLabel); err != nil {
return err
}
}
ctx, cancel := context.WithCancel(context.Background())
defer cancel()
return nil
return s.t.withClient(ctx, username, func(ctx context.Context, client *liteapi.Client) error {
for idx := 0; idx < count; idx++ {
if _, err := client.CreateLabel(ctx, liteapi.CreateLabelReq{
Name: uuid.NewString(),
Type: liteapi.LabelTypeLabel,
}); err != nil {
return err
}
}
return nil
})
}
func (s *scenario) theAccountHasTheFollowingCustomMailboxes(username string, table *godog.Table) error {
ctx, cancel := context.WithCancel(context.Background())
defer cancel()
type CustomMailbox struct {
Name string `bdd:"name"`
Type string `bdd:"type"`
@ -104,26 +125,34 @@ func (s *scenario) theAccountHasTheFollowingCustomMailboxes(username string, tab
return err
}
for _, wantMailbox := range wantMailboxes {
var labelType liteapi.LabelType
return s.t.withClient(ctx, username, func(ctx context.Context, client *liteapi.Client) error {
for _, wantMailbox := range wantMailboxes {
var labelType liteapi.LabelType
switch wantMailbox.Type {
case "folder":
labelType = liteapi.LabelTypeFolder
switch wantMailbox.Type {
case "folder":
labelType = liteapi.LabelTypeFolder
case "label":
labelType = liteapi.LabelTypeLabel
case "label":
labelType = liteapi.LabelTypeLabel
}
if _, err := client.CreateLabel(ctx, liteapi.CreateLabelReq{
Name: wantMailbox.Name,
Type: labelType,
}); err != nil {
return err
}
}
if _, err := s.t.api.CreateLabel(s.t.getUserID(username), wantMailbox.Name, labelType); err != nil {
return err
}
}
return nil
return nil
})
}
func (s *scenario) theAddressOfAccountHasTheFollowingMessagesInMailbox(address, username, mailbox string, table *godog.Table) error {
ctx, cancel := context.WithCancel(context.Background())
defer cancel()
userID := s.t.getUserID(username)
addrID := s.t.getUserAddrID(userID, address)
mboxID := s.t.getMBoxID(userID, mailbox)
@ -133,42 +162,42 @@ func (s *scenario) theAddressOfAccountHasTheFollowingMessagesInMailbox(address,
return err
}
for _, wantMessage := range wantMessages {
messageID, err := s.t.api.CreateMessage(userID, addrID, wantMessage.Build(), liteapi.MessageFlagReceived, wantMessage.Unread, false)
if err != nil {
return err
return s.t.createMessages(ctx, username, addrID, xslices.Map(wantMessages, func(message Message) liteapi.ImportReq {
return liteapi.ImportReq{
Metadata: liteapi.ImportMetadata{
AddressID: addrID,
LabelIDs: []string{mboxID},
Unread: liteapi.Bool(message.Unread),
Flags: liteapi.MessageFlagReceived,
},
Message: message.Build(),
}
if err := s.t.api.LabelMessage(userID, messageID, mboxID); err != nil {
return err
}
}
return nil
}))
}
func (s *scenario) theAddressOfAccountHasMessagesInMailbox(address, username string, count int, mailbox string) error {
ctx, cancel := context.WithCancel(context.Background())
defer cancel()
userID := s.t.getUserID(username)
addrID := s.t.getUserAddrID(userID, address)
mboxID := s.t.getMBoxID(userID, mailbox)
for idx := 0; idx < count; idx++ {
messageID, err := s.t.api.CreateMessage(userID, addrID, Message{
Subject: fmt.Sprintf("%d", idx),
To: fmt.Sprintf("%d@pm.me", idx),
From: fmt.Sprintf("%d@pm.me", idx),
Body: fmt.Sprintf("body %d", idx),
}.Build(), liteapi.MessageFlagReceived, idx%2 == 0, false)
if err != nil {
return err
return s.t.createMessages(ctx, username, addrID, iterator.Collect(iterator.Map(iterator.Counter(count), func(idx int) liteapi.ImportReq {
return liteapi.ImportReq{
Metadata: liteapi.ImportMetadata{
AddressID: addrID,
LabelIDs: []string{mboxID},
Flags: liteapi.MessageFlagReceived,
},
Message: Message{
Subject: fmt.Sprintf("%d", idx),
To: fmt.Sprintf("%d@pm.me", idx),
From: fmt.Sprintf("%d@pm.me", idx),
Body: fmt.Sprintf("body %d", idx),
}.Build(),
}
if err := s.t.api.LabelMessage(userID, messageID, mboxID); err != nil {
return err
}
}
return nil
})))
}
func (s *scenario) userLogsInWithUsernameAndPassword(username, password string) error {