Skip to content

Commit 662368c

Browse files
committed
Add GET timezones endpoint, add ianaTimeZone field to User
1 parent e609033 commit 662368c

File tree

5 files changed

+220
-45
lines changed

5 files changed

+220
-45
lines changed

src/main/java/org/zendesk/client/v2/Zendesk.java

Lines changed: 6 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -21,43 +21,7 @@
2121
import org.asynchttpclient.request.body.multipart.StringPart;
2222
import org.slf4j.Logger;
2323
import org.slf4j.LoggerFactory;
24-
import org.zendesk.client.v2.model.AgentRole;
25-
import org.zendesk.client.v2.model.Attachment;
26-
import org.zendesk.client.v2.model.Audit;
27-
import org.zendesk.client.v2.model.Automation;
28-
import org.zendesk.client.v2.model.Brand;
29-
import org.zendesk.client.v2.model.Comment;
30-
import org.zendesk.client.v2.model.ComplianceDeletionStatus;
31-
import org.zendesk.client.v2.model.DeletedTicket;
32-
import org.zendesk.client.v2.model.Field;
33-
import org.zendesk.client.v2.model.Forum;
34-
import org.zendesk.client.v2.model.Group;
35-
import org.zendesk.client.v2.model.GroupMembership;
36-
import org.zendesk.client.v2.model.Identity;
37-
import org.zendesk.client.v2.model.JobStatus;
38-
import org.zendesk.client.v2.model.Macro;
39-
import org.zendesk.client.v2.model.Metric;
40-
import org.zendesk.client.v2.model.Organization;
41-
import org.zendesk.client.v2.model.OrganizationField;
42-
import org.zendesk.client.v2.model.OrganizationMembership;
43-
import org.zendesk.client.v2.model.SatisfactionRating;
44-
import org.zendesk.client.v2.model.SearchResultEntity;
45-
import org.zendesk.client.v2.model.SortOrder;
46-
import org.zendesk.client.v2.model.Status;
47-
import org.zendesk.client.v2.model.SuspendedTicket;
48-
import org.zendesk.client.v2.model.Ticket;
49-
import org.zendesk.client.v2.model.TicketCount;
50-
import org.zendesk.client.v2.model.TicketForm;
51-
import org.zendesk.client.v2.model.TicketImport;
52-
import org.zendesk.client.v2.model.TicketPage;
53-
import org.zendesk.client.v2.model.TicketResult;
54-
import org.zendesk.client.v2.model.Topic;
55-
import org.zendesk.client.v2.model.Trigger;
56-
import org.zendesk.client.v2.model.TwitterMonitor;
57-
import org.zendesk.client.v2.model.User;
58-
import org.zendesk.client.v2.model.UserField;
59-
import org.zendesk.client.v2.model.UserRelatedInfo;
60-
import org.zendesk.client.v2.model.View;
24+
import org.zendesk.client.v2.model.*;
6125
import org.zendesk.client.v2.model.dynamic.DynamicContentItem;
6226
import org.zendesk.client.v2.model.dynamic.DynamicContentItemVariant;
6327
import org.zendesk.client.v2.model.hc.Article;
@@ -2588,6 +2552,11 @@ private Uri buildContentTagsSearchUrl(int pageSize, String namePrefixFilter, Str
25882552
return cnst(uriBuilder.toString());
25892553
}
25902554

2555+
public List<TimeZone> getTimeZones(){
2556+
return complete(submit(req("GET", cnst("/time_zones.json")), handleList(TimeZone.class,
2557+
"time_zones")));
2558+
}
2559+
25912560
//////////////////////////////////////////////////////////////////////
25922561
// Helper methods
25932562
//////////////////////////////////////////////////////////////////////
Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
package org.zendesk.client.v2.model;
2+
3+
import com.fasterxml.jackson.annotation.JsonProperty;
4+
5+
import java.util.Objects;
6+
7+
/**
8+
* @author nkharabaruk
9+
* @since 22/06/2023 22:00
10+
*/
11+
public class TimeZone {
12+
13+
private String translatedName;
14+
private String name;
15+
private String ianaName;
16+
private String url;
17+
private int offset;
18+
private String formattedOffset;
19+
20+
@JsonProperty("translated_name")
21+
public String getTranslatedName() {
22+
return translatedName;
23+
}
24+
25+
public void setTranslatedName(String translatedName) {
26+
this.translatedName = translatedName;
27+
}
28+
29+
public String getName() {
30+
return name;
31+
}
32+
33+
public void setName(String name) {
34+
this.name = name;
35+
}
36+
37+
@JsonProperty("iana_name")
38+
public String getIanaName() {
39+
return ianaName;
40+
}
41+
42+
public void setIanaName(String ianaName) {
43+
this.ianaName = ianaName;
44+
}
45+
46+
public String getUrl() {
47+
return url;
48+
}
49+
50+
public void setUrl(String url) {
51+
this.url = url;
52+
}
53+
54+
public int getOffset() {
55+
return offset;
56+
}
57+
58+
public void setOffset(int offset) {
59+
this.offset = offset;
60+
}
61+
62+
@JsonProperty("formatted_offset")
63+
public String getFormattedOffset() {
64+
return formattedOffset;
65+
}
66+
67+
public void setFormattedOffset(String formattedOffset) {
68+
this.formattedOffset = formattedOffset;
69+
}
70+
71+
@Override
72+
public boolean equals(Object o) {
73+
if (this == o) return true;
74+
if (o == null || getClass() != o.getClass()) return false;
75+
TimeZone timeZone = (TimeZone) o;
76+
return offset == timeZone.offset && Objects.equals(translatedName, timeZone.translatedName) &&
77+
Objects.equals(name, timeZone.name) && Objects.equals(ianaName, timeZone.ianaName) &&
78+
Objects.equals(url, timeZone.url) && Objects.equals(formattedOffset, timeZone.formattedOffset);
79+
}
80+
81+
@Override
82+
public int hashCode() {
83+
return Objects.hash(translatedName, name, ianaName, url, offset, formattedOffset);
84+
}
85+
}

src/main/java/org/zendesk/client/v2/model/User.java

Lines changed: 17 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ public class User extends Collaborator implements SearchResultEntity, Serializab
3030
private Long localeId;
3131
private String locale;
3232
private String timeZone;
33+
private String ianaTimeZone;
3334
private Date lastLoginAt;
3435
private String phone;
3536
private Boolean restrictedAgent;
@@ -291,6 +292,15 @@ public void setTimeZone(String timeZone) {
291292
this.timeZone = timeZone;
292293
}
293294

295+
@JsonProperty("iana_time_zone")
296+
public String getIanaTimeZone() {
297+
return ianaTimeZone;
298+
}
299+
300+
public void setIanaTimeZone(String ianaTimeZone) {
301+
this.ianaTimeZone = ianaTimeZone;
302+
}
303+
294304
@JsonProperty("updated_at")
295305
public Date getUpdatedAt() {
296306
return updatedAt;
@@ -408,12 +418,12 @@ public boolean equals(Object o) {
408418
Objects.equals(active, user.active) && Objects.equals(verified, user.verified) &&
409419
Objects.equals(shared, user.shared) && Objects.equals(localeId, user.localeId) &&
410420
Objects.equals(locale, user.locale) && Objects.equals(timeZone, user.timeZone) &&
411-
Objects.equals(lastLoginAt, user.lastLoginAt) && Objects.equals(phone, user.phone) &&
412-
Objects.equals(restrictedAgent, user.restrictedAgent) && Objects.equals(signature, user.signature) &&
413-
Objects.equals(details, user.details) && Objects.equals(notes, user.notes) &&
414-
Objects.equals(organizationId, user.organizationId) && role == user.role &&
415-
Objects.equals(customRoleId, user.customRoleId) && Objects.equals(moderator, user.moderator) &&
416-
ticketRestriction == user.ticketRestriction &&
421+
Objects.equals(ianaTimeZone, user.ianaTimeZone) && Objects.equals(lastLoginAt, user.lastLoginAt) &&
422+
Objects.equals(phone, user.phone) && Objects.equals(restrictedAgent, user.restrictedAgent) &&
423+
Objects.equals(signature, user.signature) && Objects.equals(details, user.details) &&
424+
Objects.equals(notes, user.notes) && Objects.equals(organizationId, user.organizationId)
425+
&& role == user.role && Objects.equals(customRoleId, user.customRoleId)
426+
&& Objects.equals(moderator, user.moderator) && ticketRestriction == user.ticketRestriction &&
417427
Objects.equals(onlyPrivateComments, user.onlyPrivateComments) &&
418428
Objects.equals(tags, user.tags) && Objects.equals(suspended, user.suspended) &&
419429
Objects.equals(photo, user.photo) && Objects.equals(identities, user.identities) &&
@@ -427,7 +437,7 @@ public boolean equals(Object o) {
427437
@Override
428438
public int hashCode() {
429439
return Objects.hash(id, url, externalId, alias, createdAt, updatedAt, active, verified, shared, localeId,
430-
locale, timeZone, lastLoginAt, phone, restrictedAgent, signature, details, notes, organizationId,
440+
locale, timeZone, ianaTimeZone, lastLoginAt, phone, restrictedAgent, signature, details, notes, organizationId,
431441
role, customRoleId, moderator, ticketRestriction, onlyPrivateComments, tags, suspended, photo,
432442
identities, remotePhotoUrl, userFields, chatOnly, sharedPhoneNumber, defaultGroupId, roleType,
433443
twoFactorAuthEnabled, reportCsv);

src/test/java/org/zendesk/client/v2/RealSmokeTest.java

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -911,6 +911,22 @@ public void createUsers() throws Exception {
911911
}
912912
}
913913

914+
@Test
915+
public void createUser() throws Exception {
916+
// given
917+
createClientWithTokenOrPassword();
918+
final User userToCreate = newTestUser();
919+
userToCreate.setTimeZone("Pacific Time (US & Canada)");
920+
921+
// when
922+
User createdUser = instance.createUser(userToCreate);
923+
924+
// then
925+
assertThat("A unique ID must be set", createdUser.getId(), notNullValue());
926+
assertEquals("Time Zone must be set", userToCreate.getTimeZone(), createdUser.getTimeZone());
927+
assertEquals("Iana Time Zone must be automatically set", "America/Los_Angeles", createdUser.getIanaTimeZone());
928+
}
929+
914930
@Test
915931
public void updateUsers() throws Exception {
916932
createClientWithTokenOrPassword();
@@ -1266,7 +1282,7 @@ public void getUsersById() throws Exception {
12661282
assertThat(user.getName(), notNullValue());
12671283
}
12681284
}
1269-
1285+
12701286
@Test
12711287
public void getUsersIncrementally() throws Exception {
12721288
createClientWithTokenOrPassword();
Lines changed: 95 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,95 @@
1+
package org.zendesk.client.v2.model;
2+
3+
import com.fasterxml.jackson.core.JsonProcessingException;
4+
import com.fasterxml.jackson.databind.ObjectMapper;
5+
import com.github.tomakehurst.wiremock.junit.WireMockClassRule;
6+
import org.apache.commons.text.RandomStringGenerator;
7+
import org.junit.*;
8+
import org.zendesk.client.v2.Zendesk;
9+
10+
import java.util.Arrays;
11+
import java.util.Collections;
12+
import java.util.List;
13+
14+
import static com.github.tomakehurst.wiremock.client.WireMock.*;
15+
import static com.github.tomakehurst.wiremock.core.WireMockConfiguration.options;
16+
import static org.assertj.core.api.Assertions.assertThat;
17+
18+
public class TimeZoneTest {
19+
20+
private static final String MOCK_URL_FORMATTED_STRING = "http://localhost:%d";
21+
public static final RandomStringGenerator RANDOM_STRING_GENERATOR =
22+
new RandomStringGenerator.Builder().withinRange('a', 'z').build();
23+
private static final String MOCK_API_TOKEN = RANDOM_STRING_GENERATOR.generate(15);
24+
private static final String MOCK_USERNAME = RANDOM_STRING_GENERATOR.generate(10).toLowerCase() + "@cloudbees.com";
25+
26+
@ClassRule
27+
public static WireMockClassRule zendeskApiClass = new WireMockClassRule(options()
28+
.dynamicPort()
29+
.dynamicHttpsPort()
30+
.usingFilesUnderClasspath("wiremock")
31+
);
32+
33+
@Rule
34+
public WireMockClassRule zendeskApiMock = zendeskApiClass;
35+
private final int ephemeralPort = zendeskApiMock.port();
36+
private final String hostname = String.format(MOCK_URL_FORMATTED_STRING, ephemeralPort);
37+
38+
private Zendesk client;
39+
private final ObjectMapper objectMapper = Zendesk.createMapper();
40+
41+
@Before
42+
public void setUp() {
43+
client = new Zendesk.Builder(hostname)
44+
.setUsername(MOCK_USERNAME)
45+
.setToken(MOCK_API_TOKEN)
46+
.build();
47+
}
48+
49+
@After
50+
public void closeClient() {
51+
if (client != null) {
52+
client.close();
53+
}
54+
client = null;
55+
}
56+
57+
@Test
58+
public void getTimeZones() throws JsonProcessingException {
59+
60+
TimeZone timeZone1 = new TimeZone();
61+
timeZone1.setTranslatedName("Pacific Time (US & Canada)");
62+
timeZone1.setName("Pacific Time (US & Canada)");
63+
timeZone1.setIanaName("America/Los_Angeles");
64+
timeZone1.setUrl(hostname + "/api/v2/time_zones/Pacific%20Time%20(US%20&%20Canada).json");
65+
timeZone1.setOffset(-420);
66+
timeZone1.setFormattedOffset("GMT-07:00");
67+
68+
TimeZone timeZone2 = new TimeZone();
69+
timeZone1.setTranslatedName("Kyiv");
70+
timeZone1.setName("Kyiv");
71+
timeZone1.setIanaName("Europe/Kiev");
72+
timeZone1.setUrl(hostname + "/api/v2/time_zones/Kyiv.json");
73+
timeZone1.setOffset(180);
74+
timeZone1.setFormattedOffset("GMT+03:00");
75+
76+
String expectedJsonResponse = objectMapper.writeValueAsString(
77+
Collections.singletonMap("time_zones", Arrays.asList(timeZone1, timeZone2)));
78+
79+
zendeskApiMock.stubFor(
80+
get(
81+
urlPathEqualTo("/api/v2/time_zones.json"))
82+
.willReturn(ok()
83+
.withBody(expectedJsonResponse)
84+
)
85+
);
86+
87+
List<TimeZone> timeZones = client.getTimeZones();
88+
89+
zendeskApiMock.verify(getRequestedFor(
90+
urlPathEqualTo("/api/v2/time_zones.json"))
91+
);
92+
93+
assertThat(timeZones).containsExactly(timeZone1, timeZone2);
94+
}
95+
}

0 commit comments

Comments
 (0)