diff --git a/src/main/java/org/zendesk/client/v2/Zendesk.java b/src/main/java/org/zendesk/client/v2/Zendesk.java index 5b42740d0..1de73d221 100644 --- a/src/main/java/org/zendesk/client/v2/Zendesk.java +++ b/src/main/java/org/zendesk/client/v2/Zendesk.java @@ -827,6 +827,11 @@ public User createUser(User user) { Collections.singletonMap("user", user))), handle(User.class, "user"))); } + public User mergeUsers(long userIdThatWillRemain, long userIdThatWillBeMerged) { + return complete(submit(req("PUT", tmpl("/users/{id}/merge.json").set("id", userIdThatWillBeMerged), JSON, json( + Collections.singletonMap("user", Collections.singletonMap("id", userIdThatWillRemain)))), handle(User.class, "user"))); + } + public JobStatus createUsers(User... users) { return createUsers(Arrays.asList(users)); } diff --git a/src/test/java/org/zendesk/client/v2/UserTest.java b/src/test/java/org/zendesk/client/v2/UserTest.java new file mode 100644 index 000000000..5a380253a --- /dev/null +++ b/src/test/java/org/zendesk/client/v2/UserTest.java @@ -0,0 +1,111 @@ +package org.zendesk.client.v2; + +import static com.github.tomakehurst.wiremock.client.WireMock.equalTo; +import static com.github.tomakehurst.wiremock.client.WireMock.equalToJson; +import static com.github.tomakehurst.wiremock.client.WireMock.ok; +import static com.github.tomakehurst.wiremock.client.WireMock.put; +import static com.github.tomakehurst.wiremock.client.WireMock.putRequestedFor; +import static com.github.tomakehurst.wiremock.client.WireMock.urlEqualTo; +import static com.github.tomakehurst.wiremock.client.WireMock.urlPathEqualTo; +import static com.github.tomakehurst.wiremock.core.WireMockConfiguration.options; +import static io.netty.handler.codec.http.HttpHeaders.Values.APPLICATION_JSON; +import static org.assertj.core.api.Assertions.assertThat; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.github.tomakehurst.wiremock.junit.WireMockClassRule; +import java.util.Collections; +import org.apache.commons.text.RandomStringGenerator; +import org.junit.After; +import org.junit.Before; +import org.junit.ClassRule; +import org.junit.Rule; +import org.junit.Test; +import org.zendesk.client.v2.model.User; + +/** + * An initial attempt at a unit test that uses wiremock to test the client without requiring a running zendesk client + * @author rbolles on 2/8/18. + */ +public class UserTest { + + private static final String MOCK_URL_FORMATTED_STRING = "http://localhost:%d"; + public static final RandomStringGenerator RANDOM_STRING_GENERATOR = + new RandomStringGenerator.Builder().withinRange('a', 'z').build(); + private static final String MOCK_API_TOKEN = RANDOM_STRING_GENERATOR.generate(15); + private static final String MOCK_USERNAME = RANDOM_STRING_GENERATOR.generate(10).toLowerCase() + "@cloudbees.com"; + + @ClassRule + public static WireMockClassRule zendeskApiClass = new WireMockClassRule(options() + .dynamicPort() + .dynamicHttpsPort() + ); + + @Rule + public WireMockClassRule zendeskApiMock = zendeskApiClass; + + private Zendesk client; + //use a mapper that is identical to what the client will use + private ObjectMapper objectMapper = Zendesk.createMapper(); + + + @Before + public void setUp() throws Exception { + int ephemeralPort = zendeskApiMock.port(); + + String hostname = String.format(MOCK_URL_FORMATTED_STRING, ephemeralPort); + + client = new Zendesk.Builder(hostname) + .setUsername(MOCK_USERNAME) + .setToken(MOCK_API_TOKEN) + .build(); + } + + @After + public void closeClient() { + if (client != null) { + client.close(); + } + client = null; + } + + + @Test + public void mergeUsers() throws JsonProcessingException { + + long userThatWillBeMerged = 1234L; + long userThatWillRemain = 2345L; + + + User userObjectInRequest = new User(); + userObjectInRequest.setId(userThatWillRemain); + String expectedJsonPayload = objectMapper.writeValueAsString(Collections.singletonMap("user", userObjectInRequest)); + + User userObjectInResponse = new User(); + userObjectInResponse.setId(userThatWillRemain); + userObjectInResponse.setPhone("867-5309"); //a field that wasn't in the request + String expectedJsonResponse = objectMapper.writeValueAsString(Collections.singletonMap("user", userObjectInResponse)); + + zendeskApiMock.stubFor( + put( + urlPathEqualTo("/api/v2/users/1234/merge.json")) + .withRequestBody(equalToJson(expectedJsonPayload)) + .willReturn(ok() + .withBody(expectedJsonResponse) + ) + ); + + User remainingUser = client.mergeUsers(userThatWillRemain, userThatWillBeMerged); + + zendeskApiMock.verify(putRequestedFor( + urlEqualTo("/api/v2/users/1234/merge.json")) + .withHeader("Content-Type", equalTo(APPLICATION_JSON+"; charset=UTF-8")) + .withRequestBody(equalToJson(expectedJsonPayload)) + ); + + assertThat(remainingUser).as("result") + .isNotNull() + .isEqualToComparingFieldByField(userObjectInResponse); + + } +}