Skip to content

Commit f15224b

Browse files
committed
Cover sub account endpoints
1 parent 58b48a3 commit f15224b

12 files changed

Lines changed: 223 additions & 1 deletion

File tree

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
package io.mailtrap.api.subaccounts;
2+
3+
import io.mailtrap.model.request.subaccounts.CreateSubAccountRequest;
4+
import io.mailtrap.model.response.subaccounts.SubAccount;
5+
6+
import java.util.List;
7+
8+
public interface SubAccounts {
9+
10+
/**
11+
* Get a list of sub accounts for the specified organization.
12+
* Requires sub account management permissions for the organization.
13+
*
14+
* @param organizationId unique organization ID
15+
* @return list of sub accounts
16+
*/
17+
List<SubAccount> getSubAccounts(long organizationId);
18+
19+
/**
20+
* Create a new sub account under the specified organization.
21+
* Requires sub account management permissions for the organization.
22+
*
23+
* @param organizationId unique organization ID
24+
* @param request sub account data
25+
* @return created sub account
26+
*/
27+
SubAccount createSubAccount(long organizationId, CreateSubAccountRequest request);
28+
29+
}
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
package io.mailtrap.api.subaccounts;
2+
3+
import io.mailtrap.Constants;
4+
import io.mailtrap.api.apiresource.ApiResource;
5+
import io.mailtrap.config.MailtrapConfig;
6+
import io.mailtrap.http.RequestData;
7+
import io.mailtrap.model.request.subaccounts.CreateSubAccountRequest;
8+
import io.mailtrap.model.response.subaccounts.SubAccount;
9+
10+
import java.util.List;
11+
12+
public class SubAccountsImpl extends ApiResource implements SubAccounts {
13+
14+
public SubAccountsImpl(final MailtrapConfig config) {
15+
super(config);
16+
this.apiHost = Constants.GENERAL_HOST;
17+
}
18+
19+
@Override
20+
public List<SubAccount> getSubAccounts(final long organizationId) {
21+
return httpClient.getList(
22+
String.format(apiHost + "/api/organizations/%d/sub_accounts", organizationId),
23+
new RequestData(),
24+
SubAccount.class
25+
);
26+
}
27+
28+
@Override
29+
public SubAccount createSubAccount(final long organizationId, final CreateSubAccountRequest request) {
30+
return httpClient.post(
31+
String.format(apiHost + "/api/organizations/%d/sub_accounts", organizationId),
32+
request,
33+
new RequestData(),
34+
SubAccount.class
35+
);
36+
}
37+
}

src/main/java/io/mailtrap/client/MailtrapClient.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,12 @@ public class MailtrapClient {
5656
@Getter
5757
private final MailtrapEmailTemplatesApi emailTemplatesApi;
5858

59+
/**
60+
* API for Mailtrap.io Organizations functionality
61+
*/
62+
@Getter
63+
private final MailtrapOrganizationsApi organizationsApi;
64+
5965
/**
6066
* Utility class which holds sending context (which API to use: Email Sending API, Bulk Sending API or
6167
* Email Testing API, inbox id for Email Testing API) to make it possible to perform send directly from MailtrapClient
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
package io.mailtrap.client.api;
2+
3+
import io.mailtrap.api.subaccounts.SubAccounts;
4+
import lombok.Getter;
5+
import lombok.RequiredArgsConstructor;
6+
import lombok.experimental.Accessors;
7+
8+
/**
9+
* Represents an API for Mailtrap Organizations functionality
10+
*/
11+
@Getter
12+
@Accessors(fluent = true)
13+
@RequiredArgsConstructor
14+
public class MailtrapOrganizationsApi {
15+
private final SubAccounts subAccounts;
16+
}

src/main/java/io/mailtrap/factory/MailtrapClientFactory.java

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
import io.mailtrap.api.sendingdomains.SendingDomainsImpl;
2323
import io.mailtrap.api.sendingemails.SendingEmailsImpl;
2424
import io.mailtrap.api.stats.StatsImpl;
25+
import io.mailtrap.api.subaccounts.SubAccountsImpl;
2526
import io.mailtrap.api.suppressions.SuppressionsImpl;
2627
import io.mailtrap.api.testingemails.TestingEmailsImpl;
2728
import io.mailtrap.client.MailtrapClient;
@@ -70,11 +71,18 @@ public static MailtrapClient createMailtrapClient(final MailtrapConfig config) {
7071
final var generalApi = createGeneralApi(config);
7172
final var contactsApi = createContactsApi(config);
7273
final var emailTemplatesApi = createEmailTemplatesApi(config);
74+
final var organizationsApi = createOrganizationsApi(config);
7375

7476
final var sendingContextHolder = configureSendingContext(config);
7577

7678
return new MailtrapClient(sendingApi, testingApi, bulkSendingApi, generalApi, contactsApi, emailTemplatesApi,
77-
sendingContextHolder);
79+
organizationsApi, sendingContextHolder);
80+
}
81+
82+
private static MailtrapOrganizationsApi createOrganizationsApi(final MailtrapConfig config) {
83+
final var subAccounts = new SubAccountsImpl(config);
84+
85+
return new MailtrapOrganizationsApi(subAccounts);
7886
}
7987

8088
private static MailtrapContactsApi createContactsApi(final MailtrapConfig config) {
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
package io.mailtrap.model.request.subaccounts;
2+
3+
import io.mailtrap.model.AbstractModel;
4+
import lombok.AllArgsConstructor;
5+
import lombok.Getter;
6+
import lombok.NoArgsConstructor;
7+
import lombok.Setter;
8+
9+
@Getter
10+
@Setter
11+
@NoArgsConstructor
12+
@AllArgsConstructor
13+
public class CreateSubAccountRequest extends AbstractModel {
14+
15+
private SubAccountInput account;
16+
17+
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
package io.mailtrap.model.request.subaccounts;
2+
3+
import lombok.AllArgsConstructor;
4+
import lombok.Data;
5+
import lombok.NoArgsConstructor;
6+
7+
@Data
8+
@NoArgsConstructor
9+
@AllArgsConstructor
10+
public class SubAccountInput {
11+
12+
private String name;
13+
14+
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
package io.mailtrap.model.response.subaccounts;
2+
3+
import lombok.Data;
4+
5+
@Data
6+
public class SubAccount {
7+
8+
private long id;
9+
10+
private String name;
11+
12+
}
Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
package io.mailtrap.api.subaccounts;
2+
3+
import io.mailtrap.Constants;
4+
import io.mailtrap.config.MailtrapConfig;
5+
import io.mailtrap.factory.MailtrapClientFactory;
6+
import io.mailtrap.model.request.subaccounts.CreateSubAccountRequest;
7+
import io.mailtrap.model.request.subaccounts.SubAccountInput;
8+
import io.mailtrap.model.response.subaccounts.SubAccount;
9+
import io.mailtrap.testutils.BaseTest;
10+
import io.mailtrap.testutils.DataMock;
11+
import io.mailtrap.testutils.TestHttpClient;
12+
import org.junit.jupiter.api.BeforeEach;
13+
import org.junit.jupiter.api.Test;
14+
15+
import java.util.List;
16+
17+
import static org.junit.jupiter.api.Assertions.assertEquals;
18+
import static org.junit.jupiter.api.Assertions.assertNotNull;
19+
20+
class SubAccountsImplTest extends BaseTest {
21+
22+
private final long organizationId = 1001L;
23+
24+
private SubAccounts api;
25+
26+
@BeforeEach
27+
public void init() {
28+
final TestHttpClient httpClient = new TestHttpClient(List.of(
29+
DataMock.build(Constants.GENERAL_HOST + "/api/organizations/" + organizationId + "/sub_accounts",
30+
"GET", null, "api/subaccounts/getSubAccountsResponse.json"),
31+
32+
DataMock.build(Constants.GENERAL_HOST + "/api/organizations/" + organizationId + "/sub_accounts",
33+
"POST", "api/subaccounts/createSubAccountRequest.json", "api/subaccounts/createSubAccountResponse.json")
34+
));
35+
36+
final MailtrapConfig testConfig = new MailtrapConfig.Builder()
37+
.httpClient(httpClient)
38+
.token("dummy_token")
39+
.build();
40+
41+
api = MailtrapClientFactory.createMailtrapClient(testConfig).organizationsApi().subAccounts();
42+
}
43+
44+
@Test
45+
void test_getSubAccounts() {
46+
final List<SubAccount> subAccounts = api.getSubAccounts(organizationId);
47+
48+
assertEquals(2, subAccounts.size());
49+
assertEquals(12345L, subAccounts.get(0).getId());
50+
assertEquals("Development Team Account", subAccounts.get(0).getName());
51+
assertEquals(12346L, subAccounts.get(1).getId());
52+
}
53+
54+
@Test
55+
void test_createSubAccount() {
56+
final CreateSubAccountRequest request = new CreateSubAccountRequest(new SubAccountInput("New Team Account"));
57+
58+
final SubAccount response = api.createSubAccount(organizationId, request);
59+
60+
assertNotNull(response);
61+
assertEquals(12347L, response.getId());
62+
assertEquals("New Team Account", response.getName());
63+
}
64+
}
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
{
2+
"account": {
3+
"name": "New Team Account"
4+
}
5+
}

0 commit comments

Comments
 (0)