Skip to content

Commit dd89fc7

Browse files
committed
Implemented Projects API
1 parent 0de405b commit dd89fc7

File tree

15 files changed

+390
-1
lines changed

15 files changed

+390
-1
lines changed
Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
package io.mailtrap.api;
2+
3+
import io.mailtrap.Constants;
4+
import io.mailtrap.CustomValidator;
5+
import io.mailtrap.api.abstractions.Projects;
6+
import io.mailtrap.api.abstractions.classes.ApiResourceWithValidation;
7+
import io.mailtrap.config.MailtrapConfig;
8+
import io.mailtrap.http.RequestData;
9+
import io.mailtrap.model.request.CreateUpdateProjectRequest;
10+
import io.mailtrap.model.response.DeleteProjectResponse;
11+
import io.mailtrap.model.response.ProjectsResponse;
12+
13+
import java.util.List;
14+
15+
public class ProjectsImpl extends ApiResourceWithValidation implements Projects {
16+
17+
public ProjectsImpl(MailtrapConfig config, CustomValidator customValidator) {
18+
super(config, customValidator);
19+
this.apiHost = Constants.GENERAL_HOST;
20+
}
21+
22+
@Override
23+
public ProjectsResponse createProject(long accountId, CreateUpdateProjectRequest request) {
24+
25+
validateRequestBodyAndThrowException(request);
26+
27+
return httpClient.post(
28+
String.format(apiHost + "/api/accounts/%s/projects", accountId),
29+
request,
30+
new RequestData(),
31+
ProjectsResponse.class
32+
);
33+
}
34+
35+
@Override
36+
public List<ProjectsResponse> getProjects(long accountId) {
37+
return httpClient.getList(
38+
String.format(apiHost + "/api/accounts/%s/projects", accountId),
39+
new RequestData(),
40+
ProjectsResponse.class
41+
);
42+
}
43+
44+
@Override
45+
public ProjectsResponse getProject(long accountId, long projectId) {
46+
return httpClient.get(
47+
String.format(apiHost + "/api/accounts/%s/projects/%s", accountId, projectId),
48+
new RequestData(),
49+
ProjectsResponse.class
50+
);
51+
}
52+
53+
@Override
54+
public ProjectsResponse updateProject(long accountId, long projectId, CreateUpdateProjectRequest updateRequest) {
55+
56+
validateRequestBodyAndThrowException(updateRequest);
57+
58+
return httpClient.patch(
59+
String.format(apiHost + "/api/accounts/%s/projects/%s", accountId, projectId),
60+
updateRequest,
61+
new RequestData(),
62+
ProjectsResponse.class
63+
);
64+
}
65+
66+
@Override
67+
public DeleteProjectResponse deleteProject(long accountId, long projectId) {
68+
return httpClient.delete(
69+
String.format(apiHost + "/api/accounts/%s/projects/%s", accountId, projectId),
70+
new RequestData(),
71+
DeleteProjectResponse.class
72+
);
73+
}
74+
75+
}
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
package io.mailtrap.api.abstractions;
2+
3+
import io.mailtrap.model.request.CreateUpdateProjectRequest;
4+
import io.mailtrap.model.response.DeleteProjectResponse;
5+
import io.mailtrap.model.response.ProjectsResponse;
6+
7+
import java.util.List;
8+
9+
/**
10+
* Interface representing the Mailtrap Testing API for interaction with projects
11+
*/
12+
public interface Projects {
13+
14+
/**
15+
* Create a project
16+
*
17+
* @param accountId unique account ID
18+
* @param request request data
19+
* @return Returns attributes of the created project. <b>permissions</b> returns the permissions of the token for the project
20+
*/
21+
ProjectsResponse createProject(long accountId, CreateUpdateProjectRequest request);
22+
23+
/**
24+
* List projects and their inboxes to which the API token has access.
25+
*
26+
* @param accountId unique account ID
27+
* @return the list of projects with nested inboxes. <b>permissions</b> returns the permissions of the token for the project
28+
*/
29+
List<ProjectsResponse> getProjects(long accountId);
30+
31+
/**
32+
* Get the project and its inboxes
33+
*
34+
* @param accountId unique account ID
35+
* @param projectId unique project ID
36+
* @return project attributes and inboxes of this project with their attributes. <b>permissions</b> returns the permissions of the token for the project
37+
*/
38+
ProjectsResponse getProject(long accountId, long projectId);
39+
40+
/**
41+
* Update project data
42+
*
43+
* @param accountId unique account ID
44+
* @param projectId unique project ID
45+
* @param updateRequest request data
46+
* @return project attributes and inboxes of this project with their attributes. <b>permissions</b> returns the permissions of the token for the project
47+
*/
48+
ProjectsResponse updateProject(long accountId, long projectId, CreateUpdateProjectRequest updateRequest);
49+
50+
/**
51+
* Delete project and its inboxes
52+
*
53+
* @param accountId unique account ID
54+
* @param projectId unique project ID
55+
* @return id of the deleted project
56+
*/
57+
DeleteProjectResponse deleteProject(long accountId, long projectId);
58+
59+
}

src/main/java/io/mailtrap/client/layers/MailtrapEmailTestingApi.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import io.mailtrap.api.abstractions.Attachments;
44
import io.mailtrap.api.abstractions.Inbox;
5+
import io.mailtrap.api.abstractions.Projects;
56
import io.mailtrap.api.abstractions.TestingEmails;
67
import lombok.Getter;
78
import lombok.RequiredArgsConstructor;
@@ -17,4 +18,5 @@ public class MailtrapEmailTestingApi {
1718
private final TestingEmails emails;
1819
private final Attachments attachments;
1920
private final Inbox inbox;
21+
private final Projects projects;
2022
}

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,8 +56,9 @@ private static MailtrapEmailTestingApi createTestingApi(MailtrapConfig config, C
5656
var emails = new TestingEmailsImpl(config, customValidator);
5757
var attachments = new AttachmentsImpl(config);
5858
var inbox = new InboxImpl(config, customValidator);
59+
var projects = new ProjectsImpl(config, customValidator);
5960

60-
return new MailtrapEmailTestingApi(emails, attachments, inbox);
61+
return new MailtrapEmailTestingApi(emails, attachments, inbox, projects);
6162
}
6263

6364
private static MailtrapBulkSendingApi createBulkSendingApi(MailtrapConfig config, CustomValidator customValidator) {
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
package io.mailtrap.model.request;
2+
3+
import com.fasterxml.jackson.annotation.JsonProperty;
4+
import io.mailtrap.model.AbstractModel;
5+
import lombok.AllArgsConstructor;
6+
import lombok.Getter;
7+
8+
@Getter
9+
@AllArgsConstructor
10+
public class CreateUpdateProjectRequest extends AbstractModel {
11+
12+
@JsonProperty("project")
13+
private CreateData project;
14+
15+
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
package io.mailtrap.model.response;
2+
3+
import lombok.Data;
4+
5+
@Data
6+
public class DeleteProjectResponse {
7+
8+
private long id;
9+
10+
}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
package io.mailtrap.model.response;
2+
3+
import com.fasterxml.jackson.annotation.JsonProperty;
4+
import lombok.Data;
5+
6+
import java.util.List;
7+
8+
@Data
9+
public class ProjectsResponse {
10+
11+
private long id;
12+
13+
private String name;
14+
15+
@JsonProperty("share_links")
16+
private ShareLinks shareLinks;
17+
18+
private List<InboxResponse> inboxes;
19+
20+
private Permissions permissions;
21+
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
package io.mailtrap.model.response;
2+
3+
import lombok.Data;
4+
5+
@Data
6+
public class ShareLinks {
7+
8+
private String admin;
9+
private String viewer;
10+
}
Lines changed: 98 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,98 @@
1+
package io.mailtrap.api;
2+
3+
import io.mailtrap.Constants;
4+
import io.mailtrap.api.abstractions.Projects;
5+
import io.mailtrap.config.MailtrapConfig;
6+
import io.mailtrap.factory.MailtrapClientFactory;
7+
import io.mailtrap.model.request.CreateData;
8+
import io.mailtrap.model.request.CreateUpdateProjectRequest;
9+
import io.mailtrap.model.response.DeleteProjectResponse;
10+
import io.mailtrap.model.response.ProjectsResponse;
11+
import io.mailtrap.testutils.BaseTest;
12+
import io.mailtrap.testutils.DataMock;
13+
import io.mailtrap.testutils.TestHttpClient;
14+
import org.junit.jupiter.api.BeforeEach;
15+
import org.junit.jupiter.api.Test;
16+
17+
import java.util.List;
18+
19+
import static org.junit.jupiter.api.Assertions.assertEquals;
20+
import static org.junit.jupiter.api.Assertions.assertNotNull;
21+
22+
class ProjectsImplTest extends BaseTest {
23+
24+
private Projects api;
25+
26+
@BeforeEach
27+
public void init() {
28+
TestHttpClient httpClient = new TestHttpClient(List.of(
29+
DataMock.build(Constants.GENERAL_HOST + "/api/accounts/" + accountId + "/projects",
30+
"POST", "api/projects/createProjectsRequest.json", "api/projects/projectResponse.json"),
31+
32+
DataMock.build(Constants.GENERAL_HOST + "/api/accounts/" + accountId + "/projects/" + projectId,
33+
"GET", null, "api/projects/projectResponse.json"),
34+
35+
DataMock.build(Constants.GENERAL_HOST + "/api/accounts/" + accountId + "/projects/" + projectId,
36+
"DELETE", null, "api/projects/deleteProjectResponse.json"),
37+
38+
DataMock.build(Constants.GENERAL_HOST + "/api/accounts/" + accountId + "/projects/" + projectId,
39+
"PATCH", "api/projects/updateProjectRequest.json", "api/projects/updateProjectResponse.json"),
40+
41+
DataMock.build(Constants.GENERAL_HOST + "/api/accounts/" + accountId + "/projects",
42+
"GET", null, "api/projects/listProjectsResponse.json")
43+
));
44+
45+
MailtrapConfig testConfig = new MailtrapConfig.Builder()
46+
.httpClient(httpClient)
47+
.token("dummy_token")
48+
.build();
49+
50+
api = MailtrapClientFactory.createMailtrapClient(testConfig).testingApi().projects();
51+
}
52+
53+
@Test
54+
void test_createProject() {
55+
ProjectsResponse createdProject = api.createProject(accountId, new CreateUpdateProjectRequest(new CreateData("My New Project")));
56+
57+
assertNotNull(createdProject);
58+
assertEquals(projectId, createdProject.getId());
59+
assertEquals("My New Project", createdProject.getName());
60+
}
61+
62+
@Test
63+
void test_getProjects() {
64+
List<ProjectsResponse> projects = api.getProjects(accountId);
65+
66+
assertEquals(1, projects.size());
67+
assertEquals(projectId, projects.get(0).getId());
68+
assertEquals("My New Project", projects.get(0).getName());
69+
assertEquals(0, projects.get(0).getInboxes().size());
70+
}
71+
72+
@Test
73+
void test_getProject() {
74+
ProjectsResponse project = api.getProject(accountId, projectId);
75+
76+
assertNotNull(project);
77+
assertEquals(projectId, project.getId());
78+
assertEquals("My New Project", project.getName());
79+
assertEquals(0, project.getInboxes().size());
80+
}
81+
82+
@Test
83+
void test_updateProject() {
84+
ProjectsResponse updatedProject = api.updateProject(accountId, projectId, new CreateUpdateProjectRequest(new CreateData("Updated Project Name")));
85+
86+
assertNotNull(updatedProject);
87+
assertEquals(projectId, updatedProject.getId());
88+
assertEquals("Updated Project Name", updatedProject.getName());
89+
assertEquals(1, updatedProject.getInboxes().size());
90+
}
91+
92+
@Test
93+
void test_deleteProject() {
94+
DeleteProjectResponse deletedProject = api.deleteProject(accountId, projectId);
95+
96+
assertEquals(deletedProject.getId(), projectId);
97+
}
98+
}
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
{
2+
"project": {
3+
"name": "My New Project"
4+
}
5+
}

0 commit comments

Comments
 (0)