Skip to content

Commit 4d58df7

Browse files
feat: add mt-router api (#114)
1 parent ebabaf2 commit 4d58df7

File tree

11 files changed

+291
-0
lines changed

11 files changed

+291
-0
lines changed

pom.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -186,6 +186,7 @@
186186
<module>smartling-reports-api</module>
187187
<module>smartling-glossary-api</module>
188188
<module>smartling-file-translations-api</module>
189+
<module>smartling-mt-router-api</module>
189190
<module>smartling-api-sdk-all</module> <!-- keep last -->
190191
</modules>
191192

smartling-mt-router-api/pom.xml

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<project xmlns="http://maven.apache.org/POM/4.0.0"
3+
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4+
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
5+
<modelVersion>4.0.0</modelVersion>
6+
<parent>
7+
<groupId>com.smartling.api</groupId>
8+
<artifactId>smartling-sdk-parent</artifactId>
9+
<version>1.17.1-SNAPSHOT</version>
10+
</parent>
11+
12+
<artifactId>smartling-mt-router-api</artifactId>
13+
<version>1.17.1-SNAPSHOT</version>
14+
<name>Smartling MT Router API</name>
15+
16+
<dependencies>
17+
<dependency>
18+
<groupId>com.smartling.api</groupId>
19+
<artifactId>smartling-api-commons</artifactId>
20+
<version>1.17.1-SNAPSHOT</version>
21+
</dependency>
22+
</dependencies>
23+
24+
</project>
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
package com.smartling.api.mtrouter.v2;
2+
3+
4+
import com.smartling.api.mtrouter.v2.pto.GenerateAccountTranslationCommandPTO;
5+
import com.smartling.api.mtrouter.v2.pto.TranslationPTO;
6+
import com.smartling.api.v2.response.ListResponse;
7+
8+
import javax.ws.rs.Consumes;
9+
import javax.ws.rs.POST;
10+
import javax.ws.rs.Path;
11+
import javax.ws.rs.PathParam;
12+
import javax.ws.rs.Produces;
13+
import javax.ws.rs.core.MediaType;
14+
15+
@Path("/mt-router-api/v2")
16+
@Produces(MediaType.APPLICATION_JSON)
17+
@Consumes(MediaType.APPLICATION_JSON)
18+
public interface MtRouterApi extends AutoCloseable
19+
{
20+
String GENERATE_ACCOUNT_TRANSLATIONS = "/accounts/{accountUid}/smartling-mt";
21+
22+
@POST
23+
@Path(GENERATE_ACCOUNT_TRANSLATIONS)
24+
ListResponse<TranslationPTO> generateAccountTranslations(@PathParam("accountUid") String accountUid, GenerateAccountTranslationCommandPTO command);
25+
26+
}
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
package com.smartling.api.mtrouter.v2;
2+
3+
import com.smartling.api.v2.client.AbstractApiFactory;
4+
import com.smartling.api.v2.client.ClientFactory;
5+
6+
public class MtRouterApiFactory extends AbstractApiFactory<MtRouterApi>
7+
{
8+
public MtRouterApiFactory()
9+
{
10+
super();
11+
}
12+
13+
public MtRouterApiFactory(ClientFactory clientFactory)
14+
{
15+
super(clientFactory);
16+
}
17+
18+
@Override
19+
protected Class<MtRouterApi> getApiClass()
20+
{
21+
return MtRouterApi.class;
22+
}
23+
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
package com.smartling.api.mtrouter.v2.pto;
2+
3+
import com.smartling.api.v2.response.ResponseData;
4+
import lombok.AllArgsConstructor;
5+
import lombok.Builder;
6+
import lombok.Data;
7+
import lombok.NoArgsConstructor;
8+
9+
@Builder
10+
@Data
11+
@AllArgsConstructor
12+
@NoArgsConstructor
13+
public class ErrorPTO implements ResponseData
14+
{
15+
private String code;
16+
private String key;
17+
private String message;
18+
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
package com.smartling.api.mtrouter.v2.pto;
2+
3+
import lombok.AllArgsConstructor;
4+
import lombok.Builder;
5+
import lombok.Data;
6+
import lombok.NoArgsConstructor;
7+
8+
import java.util.List;
9+
10+
@Data
11+
@AllArgsConstructor
12+
@NoArgsConstructor
13+
@Builder
14+
public class GenerateAccountTranslationCommandPTO
15+
{
16+
private String sourceLocaleId;
17+
private String targetLocaleId;
18+
private List<SourceStringCommandPTO> items;
19+
private String profileUid;
20+
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
package com.smartling.api.mtrouter.v2.pto;
2+
3+
import lombok.AllArgsConstructor;
4+
import lombok.Builder;
5+
import lombok.Data;
6+
import lombok.NoArgsConstructor;
7+
8+
@Builder
9+
@Data
10+
@AllArgsConstructor
11+
@NoArgsConstructor
12+
public class SourceStringCommandPTO
13+
{
14+
private String key;
15+
private String sourceText;
16+
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
package com.smartling.api.mtrouter.v2.pto;
2+
3+
import com.smartling.api.v2.response.ResponseData;
4+
import lombok.AllArgsConstructor;
5+
import lombok.Builder;
6+
import lombok.Data;
7+
import lombok.NoArgsConstructor;
8+
9+
@Builder
10+
@Data
11+
@AllArgsConstructor
12+
@NoArgsConstructor
13+
public class TranslationPTO implements ResponseData
14+
{
15+
private String key;
16+
private String mtUid;
17+
private String translationText;
18+
private ErrorPTO error;
19+
private String provider;
20+
}
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
artifactId=${project.artifactId}
2+
version=${project.version}
Lines changed: 105 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,105 @@
1+
package com.smartling.api.mtrouter.v2;
2+
3+
import com.smartling.api.mtrouter.v2.pto.GenerateAccountTranslationCommandPTO;
4+
import com.smartling.api.mtrouter.v2.pto.TranslationPTO;
5+
import com.smartling.api.v2.client.ClientConfiguration;
6+
import com.smartling.api.v2.client.DefaultClientConfiguration;
7+
import com.smartling.api.v2.client.auth.BearerAuthStaticTokenFilter;
8+
import com.smartling.api.v2.response.ListResponse;
9+
import okhttp3.mockwebserver.MockResponse;
10+
import okhttp3.mockwebserver.MockWebServer;
11+
import org.junit.After;
12+
import org.junit.Before;
13+
import org.junit.Test;
14+
15+
import javax.ws.rs.core.HttpHeaders;
16+
17+
import static com.smartling.api.mtrouter.v2.SampleApiResponses.ERRONEOUS_GENERATE_ACCOUNT_TRANSLATION_RESPONSE_BODY;
18+
import static com.smartling.api.mtrouter.v2.SampleApiResponses.SUCCESS_GENERATE_ACCOUNT_TRANSLATION_RESPONSE_BODY;
19+
import static com.smartling.api.mtrouter.v2.SampleApiResponses.SUCCESS_RESPONSE_ENVELOPE;
20+
import static org.junit.Assert.assertEquals;
21+
import static org.junit.Assert.assertNotNull;
22+
import static org.junit.Assert.assertNull;
23+
24+
public class MtRouterApiTest
25+
{
26+
private static final String ACCOUNT_UID = "a11223344";
27+
28+
private MockWebServer mockWebServer;
29+
private MtRouterApi mtRouterApi;
30+
31+
@Before
32+
public void setUp() throws Exception
33+
{
34+
mockWebServer = new MockWebServer();
35+
mockWebServer.start();
36+
37+
final MtRouterApiFactory factory = new MtRouterApiFactory();
38+
final BearerAuthStaticTokenFilter tokenFilter = new BearerAuthStaticTokenFilter("foo");
39+
final ClientConfiguration config = DefaultClientConfiguration.builder().baseUrl(mockWebServer.url("/").url()).build();
40+
41+
mtRouterApi = factory.buildApi(tokenFilter, config);
42+
}
43+
44+
@After
45+
public void tearDown() throws Exception
46+
{
47+
mockWebServer.shutdown();
48+
}
49+
50+
private void assignResponse(final int httpStatusCode, final String body)
51+
{
52+
final MockResponse response = new MockResponse()
53+
.setResponseCode(httpStatusCode)
54+
.setHeader(HttpHeaders.CONTENT_LENGTH, body.length())
55+
.setHeader(HttpHeaders.CONTENT_TYPE, "application/json; charset=utf-8")
56+
.setBody(body);
57+
58+
mockWebServer.enqueue(response);
59+
}
60+
61+
@Test
62+
public void testGenerateAccountTranslationErroneousResponse()
63+
{
64+
assignResponse(200, String.format(SUCCESS_RESPONSE_ENVELOPE, ERRONEOUS_GENERATE_ACCOUNT_TRANSLATION_RESPONSE_BODY));
65+
final GenerateAccountTranslationCommandPTO command = new GenerateAccountTranslationCommandPTO();
66+
67+
ListResponse<TranslationPTO> response = mtRouterApi.generateAccountTranslations(ACCOUNT_UID, command);
68+
69+
assertNotNull(response);
70+
assertEquals(1, response.getTotalCount());
71+
assertEquals(1, response.getItems().size());
72+
73+
TranslationPTO translation = response.getItems().get(0);
74+
assertNotNull(translation);
75+
assertNull(translation.getMtUid());
76+
assertNull(translation.getTranslationText());
77+
assertNull(translation.getProvider());
78+
assertNotNull(translation.getError());
79+
assertEquals("test-key", translation.getKey());
80+
assertEquals("INVALID_SOURCE_TEXT", translation.getError().getCode());
81+
assertEquals("validation.error", translation.getError().getKey());
82+
assertEquals("Source text was invalid", translation.getError().getMessage());
83+
}
84+
85+
@Test
86+
public void testGenerateAccountTranslationSuccessResponse()
87+
{
88+
assignResponse(200, String.format(SUCCESS_RESPONSE_ENVELOPE, SUCCESS_GENERATE_ACCOUNT_TRANSLATION_RESPONSE_BODY));
89+
final GenerateAccountTranslationCommandPTO command = new GenerateAccountTranslationCommandPTO();
90+
91+
ListResponse<TranslationPTO> response = mtRouterApi.generateAccountTranslations(ACCOUNT_UID, command);
92+
93+
assertNotNull(response);
94+
assertEquals(1, response.getTotalCount());
95+
assertEquals(1, response.getItems().size());
96+
97+
TranslationPTO translation = response.getItems().get(0);
98+
assertNotNull(translation);
99+
assertEquals("test-key", translation.getKey());
100+
assertEquals("a36z4bunraj1", translation.getMtUid());
101+
assertEquals("Zu übersetzenden Text testen", translation.getTranslationText());
102+
assertNull(translation.getError());
103+
assertEquals("AUTO_SELECT_PROVIDER", translation.getProvider());
104+
}
105+
}

0 commit comments

Comments
 (0)