Skip to content

Commit 41b49bd

Browse files
committed
tests: Add integration test for multidomain setups with shared namespaces
1 parent b3ebe4b commit 41b49bd

File tree

1 file changed

+271
-0
lines changed

1 file changed

+271
-0
lines changed

tests/multiple_domains_test.go

Lines changed: 271 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,271 @@
1+
//go:build integration
2+
3+
/*
4+
Maddy Mail Server - Composable all-in-one email server.
5+
Copyright © 2019-2025 Max Mazurov <fox.cpp@disroot.org>, Maddy Mail Server contributors
6+
7+
This program is free software: you can redistribute it and/or modify
8+
it under the terms of the GNU General Public License as published by
9+
the Free Software Foundation, either version 3 of the License, or
10+
(at your option) any later version.
11+
12+
This program is distributed in the hope that it will be useful,
13+
but WITHOUT ANY WARRANTY; without even the implied warranty of
14+
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15+
GNU General Public License for more details.
16+
17+
You should have received a copy of the GNU General Public License
18+
along with this program. If not, see <https://www.gnu.org/licenses/>.
19+
*/
20+
21+
package tests_test
22+
23+
import (
24+
"testing"
25+
26+
"github.com/foxcpp/maddy/tests"
27+
)
28+
29+
// Test cases based on https://maddy.email/multiple-domains/
30+
31+
func TestMultipleDomains_SeparateNamespace(tt *testing.T) {
32+
tt.Parallel()
33+
t := tests.NewT(tt)
34+
t.DNS(nil)
35+
t.Port("submission")
36+
t.Port("imap")
37+
t.Config(`
38+
tls off
39+
hostname test.maddy.email
40+
41+
auth.pass_table local_authdb {
42+
table sql_table {
43+
driver sqlite3
44+
dsn credentials.db
45+
table_name passwords
46+
}
47+
}
48+
storage.imapsql local_mailboxes {
49+
driver sqlite3
50+
dsn imapsql.db
51+
}
52+
53+
submission tcp://0.0.0.0:{env:TEST_PORT_submission} {
54+
auth &local_authdb
55+
reject
56+
}
57+
imap tcp://127.0.0.1:{env:TEST_PORT_imap} {
58+
auth &local_authdb
59+
storage &local_mailboxes
60+
}
61+
`)
62+
63+
t.MustRunCLIGroup(
64+
[]string{"creds", "create", "-p", "user1", "user1@test1.maddy.email"},
65+
[]string{"creds", "create", "-p", "user2", "user2@test1.maddy.email"},
66+
[]string{"creds", "create", "-p", "user3", "user1@test2.maddy.email"},
67+
[]string{"imap-acct", "create", "--no-specialuse", "user1@test1.maddy.email"},
68+
[]string{"imap-acct", "create", "--no-specialuse", "user2@test1.maddy.email"},
69+
[]string{"imap-acct", "create", "--no-specialuse", "user1@test2.maddy.email"},
70+
)
71+
t.Run(2)
72+
73+
user1 := t.Conn("imap")
74+
user1.ExpectPattern(`\* OK *`)
75+
user1.Writeln(`. LOGIN user1@test1.maddy.email user1`)
76+
user1.ExpectPattern(`. OK *`)
77+
user1.Writeln(`. CREATE user1`)
78+
user1.ExpectPattern(`. OK *`)
79+
80+
user2 := t.Conn("imap")
81+
user2.ExpectPattern(`\* OK *`)
82+
user2.Writeln(`. LOGIN user2@test1.maddy.email user2`)
83+
user2.ExpectPattern(`. OK *`)
84+
user2.Writeln(`. CREATE user2`)
85+
user2.ExpectPattern(`. OK *`)
86+
87+
user3 := t.Conn("imap")
88+
user3.ExpectPattern(`\* OK *`)
89+
user3.Writeln(`. LOGIN user1@test2.maddy.email user3`)
90+
user3.ExpectPattern(`. OK *`)
91+
user3.Writeln(`. CREATE user3`)
92+
user3.ExpectPattern(`. OK *`)
93+
94+
user1.Writeln(`. LIST "" "*"`)
95+
user1.Expect(`* LIST (\HasNoChildren) "." INBOX`)
96+
user1.Expect(`* LIST (\HasNoChildren) "." "user1"`)
97+
user1.ExpectPattern(". OK *")
98+
99+
user2.Writeln(`. LIST "" "*"`)
100+
user2.Expect(`* LIST (\HasNoChildren) "." INBOX`)
101+
user2.Expect(`* LIST (\HasNoChildren) "." "user2"`)
102+
user2.ExpectPattern(". OK *")
103+
104+
user3.Writeln(`. LIST "" "*"`)
105+
user3.Expect(`* LIST (\HasNoChildren) "." INBOX`)
106+
user3.Expect(`* LIST (\HasNoChildren) "." "user3"`)
107+
user3.ExpectPattern(". OK *")
108+
}
109+
110+
func TestMultipleDomains_SharedCredentials_DistinctMailboxes(tt *testing.T) {
111+
tt.Parallel()
112+
t := tests.NewT(tt)
113+
t.DNS(nil)
114+
t.Port("submission")
115+
t.Port("imap")
116+
t.Config(`
117+
tls off
118+
hostname test.maddy.email
119+
auth_map email_localpart
120+
121+
auth.pass_table local_authdb {
122+
table sql_table {
123+
driver sqlite3
124+
dsn credentials.db
125+
table_name passwords
126+
}
127+
}
128+
storage.imapsql local_mailboxes {
129+
driver sqlite3
130+
dsn imapsql.db
131+
}
132+
133+
submission tcp://0.0.0.0:{env:TEST_PORT_submission} {
134+
auth &local_authdb
135+
reject
136+
}
137+
imap tcp://127.0.0.1:{env:TEST_PORT_imap} {
138+
auth &local_authdb
139+
storage &local_mailboxes
140+
}
141+
`)
142+
143+
t.MustRunCLIGroup(
144+
[]string{"creds", "create", "-p", "user1", "user1"},
145+
[]string{"creds", "create", "-p", "user2", "user2"},
146+
[]string{"imap-acct", "create", "--no-specialuse", "user1@test1.maddy.email"},
147+
[]string{"imap-acct", "create", "--no-specialuse", "user2@test1.maddy.email"},
148+
[]string{"imap-acct", "create", "--no-specialuse", "user1@test2.maddy.email"},
149+
)
150+
t.Run(2)
151+
152+
user1 := t.Conn("imap")
153+
user1.ExpectPattern(`\* OK *`)
154+
user1.Writeln(`. LOGIN user1@test1.maddy.email user1`)
155+
user1.ExpectPattern(`. OK *`)
156+
user1.Writeln(`. CREATE user1`)
157+
user1.ExpectPattern(`. OK *`)
158+
159+
user2 := t.Conn("imap")
160+
user2.ExpectPattern(`\* OK *`)
161+
user2.Writeln(`. LOGIN user2@test1.maddy.email user2`)
162+
user2.ExpectPattern(`. OK *`)
163+
user2.Writeln(`. CREATE user2`)
164+
user2.ExpectPattern(`. OK *`)
165+
166+
user3 := t.Conn("imap")
167+
user3.ExpectPattern(`\* OK *`)
168+
user3.Writeln(`. LOGIN user1@test2.maddy.email user1`)
169+
user3.ExpectPattern(`. OK *`)
170+
user3.Writeln(`. CREATE user3`)
171+
user3.ExpectPattern(`. OK *`)
172+
173+
user1.Writeln(`. LIST "" "*"`)
174+
user1.Expect(`* LIST (\HasNoChildren) "." INBOX`)
175+
user1.Expect(`* LIST (\HasNoChildren) "." "user1"`)
176+
user1.ExpectPattern(". OK *")
177+
178+
user2.Writeln(`. LIST "" "*"`)
179+
user2.Expect(`* LIST (\HasNoChildren) "." INBOX`)
180+
user2.Expect(`* LIST (\HasNoChildren) "." "user2"`)
181+
user2.ExpectPattern(". OK *")
182+
183+
user3.Writeln(`. LIST "" "*"`)
184+
user3.Expect(`* LIST (\HasNoChildren) "." INBOX`)
185+
user3.Expect(`* LIST (\HasNoChildren) "." "user3"`)
186+
user3.ExpectPattern(". OK *")
187+
}
188+
189+
func TestMultipleDomains_SharedCredentials_SharedMailboxes(tt *testing.T) {
190+
tt.Parallel()
191+
t := tests.NewT(tt)
192+
t.DNS(nil)
193+
t.Port("submission")
194+
t.Port("imap")
195+
t.Config(`
196+
tls off
197+
hostname test.maddy.email
198+
auth_map email_localpart_optional
199+
200+
auth.pass_table local_authdb {
201+
table sql_table {
202+
driver sqlite3
203+
dsn credentials.db
204+
table_name passwords
205+
}
206+
}
207+
storage.imapsql local_mailboxes {
208+
driver sqlite3
209+
dsn imapsql.db
210+
211+
delivery_map email_localpart_optional
212+
}
213+
214+
submission tcp://0.0.0.0:{env:TEST_PORT_submission} {
215+
auth &local_authdb
216+
reject
217+
}
218+
imap tcp://127.0.0.1:{env:TEST_PORT_imap} {
219+
auth &local_authdb
220+
storage &local_mailboxes
221+
222+
storage_map email_localpart_optional
223+
}
224+
`)
225+
226+
t.MustRunCLIGroup(
227+
[]string{"creds", "create", "-p", "user1", "user1"},
228+
[]string{"creds", "create", "-p", "user2", "user2"},
229+
[]string{"imap-acct", "create", "--no-specialuse", "user1"},
230+
[]string{"imap-acct", "create", "--no-specialuse", "user2"},
231+
)
232+
t.Run(2)
233+
234+
user1 := t.Conn("imap")
235+
user1.ExpectPattern(`\* OK *`)
236+
user1.Writeln(`. LOGIN user1 user1`)
237+
user1.ExpectPattern(`. OK *`)
238+
user1.Writeln(`. CREATE user1`)
239+
user1.ExpectPattern(`. OK *`)
240+
241+
user2 := t.Conn("imap")
242+
user2.ExpectPattern(`\* OK *`)
243+
user2.Writeln(`. LOGIN user2@test1.maddy.email user2`)
244+
user2.ExpectPattern(`. OK *`)
245+
user2.Writeln(`. CREATE user2`)
246+
user2.ExpectPattern(`. OK *`)
247+
248+
user12 := t.Conn("imap")
249+
user12.ExpectPattern(`\* OK *`)
250+
user12.Writeln(`. LOGIN user1@test2.maddy.email user1`)
251+
user12.ExpectPattern(`. OK *`)
252+
user12.Writeln(`. CREATE user12`)
253+
user12.ExpectPattern(`. OK *`)
254+
255+
user1.Writeln(`. LIST "" "*"`)
256+
user1.Expect(`* LIST (\HasNoChildren) "." INBOX`)
257+
user1.Expect(`* LIST (\HasNoChildren) "." "user1"`)
258+
user1.Expect(`* LIST (\HasNoChildren) "." "user12"`)
259+
user1.ExpectPattern(". OK *")
260+
261+
user2.Writeln(`. LIST "" "*"`)
262+
user2.Expect(`* LIST (\HasNoChildren) "." INBOX`)
263+
user2.Expect(`* LIST (\HasNoChildren) "." "user2"`)
264+
user2.ExpectPattern(". OK *")
265+
266+
user12.Writeln(`. LIST "" "*"`)
267+
user12.Expect(`* LIST (\HasNoChildren) "." INBOX`)
268+
user12.Expect(`* LIST (\HasNoChildren) "." "user1"`)
269+
user12.Expect(`* LIST (\HasNoChildren) "." "user12"`)
270+
user12.ExpectPattern(". OK *")
271+
}

0 commit comments

Comments
 (0)