mirror of
https://github.com/ProtonMail/proton-bridge.git
synced 2025-12-19 00:27:06 +00:00
test(GODT-2298): add integration test for In-Reply-To header use cases.
This commit is contained in:
@ -20,6 +20,7 @@ package tests
|
|||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"os"
|
||||||
"runtime"
|
"runtime"
|
||||||
|
|
||||||
"github.com/ProtonMail/go-proton-api"
|
"github.com/ProtonMail/go-proton-api"
|
||||||
@ -33,6 +34,7 @@ func (t *testCtx) withProton(fn func(*proton.Manager) error) error {
|
|||||||
proton.WithHostURL(t.api.GetHostURL()),
|
proton.WithHostURL(t.api.GetHostURL()),
|
||||||
proton.WithTransport(proton.InsecureTransport()),
|
proton.WithTransport(proton.InsecureTransport()),
|
||||||
proton.WithAppVersion(t.api.GetAppVersion()),
|
proton.WithAppVersion(t.api.GetAppVersion()),
|
||||||
|
proton.WithDebug(os.Getenv("FEATURE_API_DEBUG") != ""),
|
||||||
)
|
)
|
||||||
defer m.Close()
|
defer m.Close()
|
||||||
|
|
||||||
|
|||||||
@ -45,6 +45,7 @@ Feature: SMTP with bcc
|
|||||||
"""
|
"""
|
||||||
|
|
||||||
|
|
||||||
|
@long-black
|
||||||
Scenario: Send message only to bcc
|
Scenario: Send message only to bcc
|
||||||
When SMTP client "1" sends the following message from "[user:user]@[domain]" to "[user:bcc]@[domain]":
|
When SMTP client "1" sends the following message from "[user:user]@[domain]" to "[user:bcc]@[domain]":
|
||||||
"""
|
"""
|
||||||
|
|||||||
@ -7,6 +7,7 @@ Feature: SMTP sending embedded message
|
|||||||
And the user logs in with username "[user:to]" and password "password"
|
And the user logs in with username "[user:to]" and password "password"
|
||||||
And user "[user:user]" connects and authenticates SMTP client "1"
|
And user "[user:user]" connects and authenticates SMTP client "1"
|
||||||
|
|
||||||
|
@long-black
|
||||||
Scenario: Send it
|
Scenario: Send it
|
||||||
When SMTP client "1" sends the following message from "[user:user]@[domain]" to "[user:to]@[domain]":
|
When SMTP client "1" sends the following message from "[user:user]@[domain]" to "[user:to]@[domain]":
|
||||||
"""
|
"""
|
||||||
|
|||||||
@ -6,6 +6,8 @@ Feature: SMTP sending two messages
|
|||||||
And the user logs in with username "[user:user]" and password "password"
|
And the user logs in with username "[user:user]" and password "password"
|
||||||
And the user logs in with username "[user:recp]" and password "password"
|
And the user logs in with username "[user:recp]" and password "password"
|
||||||
|
|
||||||
|
|
||||||
|
@long-black
|
||||||
Scenario: Send from one account to the other
|
Scenario: Send from one account to the other
|
||||||
When user "[user:user]" connects and authenticates SMTP client "1"
|
When user "[user:user]" connects and authenticates SMTP client "1"
|
||||||
And SMTP client "1" sends the following message from "[user:user]@[domain]" to "[user:recp]@[domain]":
|
And SMTP client "1" sends the following message from "[user:user]@[domain]" to "[user:recp]@[domain]":
|
||||||
@ -60,6 +62,8 @@ Feature: SMTP sending two messages
|
|||||||
| from | to | subject | body |
|
| from | to | subject | body |
|
||||||
| [user:user]@[domain] | [user:recp]@[domain] | One account to the other | hello |
|
| [user:user]@[domain] | [user:recp]@[domain] | One account to the other | hello |
|
||||||
|
|
||||||
|
|
||||||
|
@long-black
|
||||||
Scenario: Send from one account to the other with attachments
|
Scenario: Send from one account to the other with attachments
|
||||||
When user "[user:user]" connects and authenticates SMTP client "1"
|
When user "[user:user]" connects and authenticates SMTP client "1"
|
||||||
And SMTP client "1" sends the following message from "[user:user]@[domain]" to "[user:recp]@[domain]":
|
And SMTP client "1" sends the following message from "[user:user]@[domain]" to "[user:recp]@[domain]":
|
||||||
|
|||||||
@ -16,6 +16,7 @@ Feature: SMTP sending the same message twice
|
|||||||
"""
|
"""
|
||||||
And it succeeds
|
And it succeeds
|
||||||
|
|
||||||
|
@long-black
|
||||||
Scenario: The exact same message is not sent twice
|
Scenario: The exact same message is not sent twice
|
||||||
When SMTP client "1" sends the following message from "[user:user]@[domain]" to "[user:to]@[domain]":
|
When SMTP client "1" sends the following message from "[user:user]@[domain]" to "[user:to]@[domain]":
|
||||||
"""
|
"""
|
||||||
@ -36,6 +37,7 @@ Feature: SMTP sending the same message twice
|
|||||||
| [user:user]@[domain] | [user:to]@[domain] | Hello | World |
|
| [user:user]@[domain] | [user:to]@[domain] | Hello | World |
|
||||||
|
|
||||||
|
|
||||||
|
@long-black
|
||||||
Scenario: Slight change means different message and is sent twice
|
Scenario: Slight change means different message and is sent twice
|
||||||
When SMTP client "1" sends the following message from "[user:user]@[domain]" to "[user:to]@[domain]":
|
When SMTP client "1" sends the following message from "[user:user]@[domain]" to "[user:to]@[domain]":
|
||||||
"""
|
"""
|
||||||
|
|||||||
153
tests/features/smtp/send/send_reply.feature
Normal file
153
tests/features/smtp/send/send_reply.feature
Normal file
@ -0,0 +1,153 @@
|
|||||||
|
Feature: SMTP send reply
|
||||||
|
|
||||||
|
Background:
|
||||||
|
Given there exists an account with username "[user:user1]" and password "password"
|
||||||
|
And there exists an account with username "[user:user2]" and password "password"
|
||||||
|
And bridge starts
|
||||||
|
And the user logs in with username "[user:user1]" and password "password"
|
||||||
|
And user "[user:user1]" connects and authenticates SMTP client "1"
|
||||||
|
And user "[user:user1]" connects and authenticates IMAP client "1"
|
||||||
|
And user "[user:user1]" finishes syncing
|
||||||
|
|
||||||
|
@long-black
|
||||||
|
Scenario: Reply with In-Reply-To but no References
|
||||||
|
# User1 send the initial message.
|
||||||
|
When SMTP client "1" sends the following message from "[user:user1]@[domain]" to "[user:user2]@[domain]":
|
||||||
|
"""
|
||||||
|
From: Bridge Test <[user:user1]@[domain]>
|
||||||
|
To: Internal Bridge <[user:user2]@[domain]>
|
||||||
|
Subject: Please Reply
|
||||||
|
Message-ID: <something@protonmail.ch>
|
||||||
|
|
||||||
|
hello
|
||||||
|
|
||||||
|
"""
|
||||||
|
Then it succeeds
|
||||||
|
Then IMAP client "1" eventually sees the following messages in "Sent":
|
||||||
|
| from | to | subject | message-id |
|
||||||
|
| [user:user1]@[domain] | [user:user2]@[domain] | Please Reply | <something@protonmail.ch> |
|
||||||
|
# login user2.
|
||||||
|
And the user logs in with username "[user:user2]" and password "password"
|
||||||
|
And user "[user:user2]" connects and authenticates IMAP client "2"
|
||||||
|
And user "[user:user2]" connects and authenticates SMTP client "2"
|
||||||
|
And user "[user:user2]" finishes syncing
|
||||||
|
# User2 receive the message.
|
||||||
|
Then IMAP client "2" eventually sees the following messages in "INBOX":
|
||||||
|
| from | subject | message-id |
|
||||||
|
| [user:user1]@[domain] | Please Reply | <something@protonmail.ch> |
|
||||||
|
# User2 reply to it.
|
||||||
|
When SMTP client "2" sends the following message from "[user:user2]@[domain]" to "[user:user1]@[domain]":
|
||||||
|
"""
|
||||||
|
From: Internal Bridge <[user:user2]@[domain]>
|
||||||
|
To: Bridge Test <[user:user1]@[domain]>
|
||||||
|
Content-Type: text/plain
|
||||||
|
Subject: FW - Please Reply
|
||||||
|
In-Reply-To: <something@protonmail.ch>
|
||||||
|
|
||||||
|
Heya
|
||||||
|
|
||||||
|
"""
|
||||||
|
Then it succeeds
|
||||||
|
Then IMAP client "2" eventually sees the following messages in "Sent":
|
||||||
|
| from | to | subject | in-reply-to | references |
|
||||||
|
| [user:user2]@[domain] | [user:user1]@[domain] | FW - Please Reply | <something@protonmail.ch> | <something@protonmail.ch> |
|
||||||
|
# User1 receive the reply.|
|
||||||
|
And IMAP client "1" eventually sees the following messages in "INBOX":
|
||||||
|
| from | subject | body | in-reply-to | references |
|
||||||
|
| [user:user2]@[domain] | FW - Please Reply | Heya | <something@protonmail.ch> | <something@protonmail.ch> |
|
||||||
|
|
||||||
|
@long-black
|
||||||
|
Scenario: Reply with References but no In-Reply-To
|
||||||
|
# User1 send the initial message.
|
||||||
|
When SMTP client "1" sends the following message from "[user:user1]@[domain]" to "[user:user2]@[domain]":
|
||||||
|
"""
|
||||||
|
From: Bridge Test <[user:user1]@[domain]>
|
||||||
|
To: Internal Bridge <[user:user2]@[domain]>
|
||||||
|
Subject: Please Reply
|
||||||
|
Message-ID: <something@protonmail.ch>
|
||||||
|
|
||||||
|
hello
|
||||||
|
|
||||||
|
"""
|
||||||
|
Then it succeeds
|
||||||
|
Then IMAP client "1" eventually sees the following messages in "Sent":
|
||||||
|
| from | to | subject | message-id |
|
||||||
|
| [user:user1]@[domain] | [user:user2]@[domain] | Please Reply | <something@protonmail.ch> |
|
||||||
|
# login user2.
|
||||||
|
And the user logs in with username "[user:user2]" and password "password"
|
||||||
|
And user "[user:user2]" connects and authenticates IMAP client "2"
|
||||||
|
And user "[user:user2]" connects and authenticates SMTP client "2"
|
||||||
|
And user "[user:user2]" finishes syncing
|
||||||
|
# User2 receive the message.
|
||||||
|
Then IMAP client "2" eventually sees the following messages in "INBOX":
|
||||||
|
| from | subject | message-id |
|
||||||
|
| [user:user1]@[domain] | Please Reply | <something@protonmail.ch> |
|
||||||
|
# User2 reply to it.
|
||||||
|
When SMTP client "2" sends the following message from "[user:user2]@[domain]" to "[user:user1]@[domain]":
|
||||||
|
"""
|
||||||
|
From: Internal Bridge <[user:user2]@[domain]>
|
||||||
|
To: Bridge Test <[user:user1]@[domain]>
|
||||||
|
Content-Type: text/plain
|
||||||
|
Subject: FW - Please Reply
|
||||||
|
References: <something@protonmail.ch>
|
||||||
|
|
||||||
|
Heya
|
||||||
|
|
||||||
|
"""
|
||||||
|
Then it succeeds
|
||||||
|
Then IMAP client "2" eventually sees the following messages in "Sent":
|
||||||
|
| from | to | subject | in-reply-to | references |
|
||||||
|
| [user:user2]@[domain] | [user:user1]@[domain] | FW - Please Reply | <something@protonmail.ch> | <something@protonmail.ch> |
|
||||||
|
# User1 receive the reply.|
|
||||||
|
And IMAP client "1" eventually sees the following messages in "INBOX":
|
||||||
|
| from | subject | body | in-reply-to | references |
|
||||||
|
| [user:user2]@[domain] | FW - Please Reply | Heya | <something@protonmail.ch> | <something@protonmail.ch> |
|
||||||
|
|
||||||
|
|
||||||
|
@long-black
|
||||||
|
Scenario: Reply with both References and In-Reply-To
|
||||||
|
# User1 send the initial message.
|
||||||
|
When SMTP client "1" sends the following message from "[user:user1]@[domain]" to "[user:user2]@[domain]":
|
||||||
|
"""
|
||||||
|
From: Bridge Test <[user:user1]@[domain]>
|
||||||
|
To: Internal Bridge <[user:user2]@[domain]>
|
||||||
|
Subject: Please Reply
|
||||||
|
Message-ID: <something@protonmail.ch>
|
||||||
|
|
||||||
|
hello
|
||||||
|
|
||||||
|
"""
|
||||||
|
Then it succeeds
|
||||||
|
Then IMAP client "1" eventually sees the following messages in "Sent":
|
||||||
|
| from | to | subject | message-id |
|
||||||
|
| [user:user1]@[domain] | [user:user2]@[domain] | Please Reply | <something@protonmail.ch> |
|
||||||
|
# login user2.
|
||||||
|
And the user logs in with username "[user:user2]" and password "password"
|
||||||
|
And user "[user:user2]" connects and authenticates IMAP client "2"
|
||||||
|
And user "[user:user2]" connects and authenticates SMTP client "2"
|
||||||
|
And user "[user:user2]" finishes syncing
|
||||||
|
# User2 receive the message.
|
||||||
|
Then IMAP client "2" eventually sees the following messages in "INBOX":
|
||||||
|
| from | subject | message-id |
|
||||||
|
| [user:user1]@[domain] | Please Reply | <something@protonmail.ch> |
|
||||||
|
# User2 reply to it.
|
||||||
|
When SMTP client "2" sends the following message from "[user:user2]@[domain]" to "[user:user1]@[domain]":
|
||||||
|
"""
|
||||||
|
From: Internal Bridge <[user:user2]@[domain]>
|
||||||
|
To: Bridge Test <[user:user1]@[domain]>
|
||||||
|
Content-Type: text/plain
|
||||||
|
Subject: FW - Please Reply
|
||||||
|
In-Reply-To: <something@protonmail.ch>
|
||||||
|
References: <something@protonmail.ch>
|
||||||
|
|
||||||
|
Heya
|
||||||
|
|
||||||
|
"""
|
||||||
|
Then it succeeds
|
||||||
|
Then IMAP client "2" eventually sees the following messages in "Sent":
|
||||||
|
| from | to | subject | in-reply-to | references |
|
||||||
|
| [user:user2]@[domain] | [user:user1]@[domain] | FW - Please Reply | <something@protonmail.ch> | <something@protonmail.ch> |
|
||||||
|
# User1 receive the reply.|
|
||||||
|
And IMAP client "1" eventually sees the following messages in "INBOX":
|
||||||
|
| from | subject | body | in-reply-to | references |
|
||||||
|
| [user:user2]@[domain] | FW - Please Reply | Heya | <something@protonmail.ch> | <something@protonmail.ch> |
|
||||||
@ -21,6 +21,7 @@ import (
|
|||||||
"bytes"
|
"bytes"
|
||||||
"fmt"
|
"fmt"
|
||||||
"io"
|
"io"
|
||||||
|
"os"
|
||||||
"reflect"
|
"reflect"
|
||||||
"strconv"
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
@ -49,6 +50,9 @@ type Message struct {
|
|||||||
|
|
||||||
Unread bool `bdd:"unread"`
|
Unread bool `bdd:"unread"`
|
||||||
Deleted bool `bdd:"deleted"`
|
Deleted bool `bdd:"deleted"`
|
||||||
|
|
||||||
|
InReplyTo string `bdd:"in-reply-to"`
|
||||||
|
References string `bdd:"references"`
|
||||||
}
|
}
|
||||||
|
|
||||||
func (msg Message) Build() []byte {
|
func (msg Message) Build() []byte {
|
||||||
@ -74,6 +78,14 @@ func (msg Message) Build() []byte {
|
|||||||
b = append(b, "Subject: "+msg.Subject+"\r\n"...)
|
b = append(b, "Subject: "+msg.Subject+"\r\n"...)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if msg.InReplyTo != "" {
|
||||||
|
b = append(b, "In-Reply-To: "+msg.InReplyTo+"\r\n"...)
|
||||||
|
}
|
||||||
|
|
||||||
|
if msg.References != "" {
|
||||||
|
b = append(b, "References: "+msg.References+"\r\n"...)
|
||||||
|
}
|
||||||
|
|
||||||
if msg.Date != "" {
|
if msg.Date != "" {
|
||||||
date, err := time.Parse(time.RFC822, msg.Date)
|
date, err := time.Parse(time.RFC822, msg.Date)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -125,6 +137,9 @@ func newMessageFromIMAP(msg *imap.Message) Message {
|
|||||||
Unread: !slices.Contains(msg.Flags, imap.SeenFlag),
|
Unread: !slices.Contains(msg.Flags, imap.SeenFlag),
|
||||||
Deleted: slices.Contains(msg.Flags, imap.DeletedFlag),
|
Deleted: slices.Contains(msg.Flags, imap.DeletedFlag),
|
||||||
Date: msg.Envelope.Date.Format(time.RFC822Z),
|
Date: msg.Envelope.Date.Format(time.RFC822Z),
|
||||||
|
InReplyTo: msg.Envelope.InReplyTo,
|
||||||
|
// Go-imap only supports in-reply-to so we have to mimic other client by using it as references.
|
||||||
|
References: msg.Envelope.InReplyTo,
|
||||||
}
|
}
|
||||||
|
|
||||||
if len(msg.Envelope.From) > 0 {
|
if len(msg.Envelope.From) > 0 {
|
||||||
@ -195,7 +210,13 @@ func matchMailboxes(have, want []Mailbox) error {
|
|||||||
func eventually(condition func() error) error {
|
func eventually(condition func() error) error {
|
||||||
ch := make(chan error, 1)
|
ch := make(chan error, 1)
|
||||||
|
|
||||||
timer := time.NewTimer(30 * time.Second)
|
var timerDuration = 30 * time.Second
|
||||||
|
// Extend to 5min for live API.
|
||||||
|
if hostURL := os.Getenv("FEATURE_TEST_HOST_URL"); hostURL != "" {
|
||||||
|
timerDuration = 600 * time.Second
|
||||||
|
}
|
||||||
|
|
||||||
|
timer := time.NewTimer(timerDuration)
|
||||||
defer timer.Stop()
|
defer timer.Stop()
|
||||||
|
|
||||||
ticker := time.NewTicker(100 * time.Millisecond)
|
ticker := time.NewTicker(100 * time.Millisecond)
|
||||||
|
|||||||
Reference in New Issue
Block a user