From d3540c23920316ff9a091453c619f6afe635324c Mon Sep 17 00:00:00 2001 From: jsklan Date: Fri, 5 Dec 2025 18:08:22 -0500 Subject: [PATCH] Update integration tests --- .../intercom/api/integration/AdminsTest.java | 23 +++-- .../api/integration/ArticlesTest.java | 18 ++-- .../api/integration/CompaniesTest.java | 14 ++- .../api/integration/ContactsTest.java | 75 ++++++++------- .../api/integration/ConversationsTest.java | 91 +++++++++++-------- .../api/integration/DataAttributesTest.java | 59 +++++++----- .../api/integration/DataExportTest.java | 11 ++- .../intercom/api/integration/EventsTest.java | 9 +- .../api/integration/IntegrationTest.java | 35 ++++--- .../api/integration/MessagesTest.java | 27 ++++-- .../intercom/api/integration/NotesTest.java | 36 +++++--- .../integration/PhoneCallRedirectTest.java | 17 +--- .../api/integration/SegmentsTest.java | 9 +- .../intercom/api/integration/TagsTest.java | 39 +++++--- .../intercom/api/integration/TeamsTest.java | 6 +- .../api/integration/VisitorsTest.java | 9 +- .../intercom/api/utils/TestClientFactory.java | 17 ++++ 17 files changed, 303 insertions(+), 192 deletions(-) diff --git a/src/test/java/com/intercom/api/integration/AdminsTest.java b/src/test/java/com/intercom/api/integration/AdminsTest.java index 32319f0..28d2d1a 100644 --- a/src/test/java/com/intercom/api/integration/AdminsTest.java +++ b/src/test/java/com/intercom/api/integration/AdminsTest.java @@ -18,12 +18,18 @@ public class AdminsTest { private Intercom client; private String adminId; + private int adminIdInt; @BeforeEach public void before() { // arrange client = TestClientFactory.create(); - adminId = client.admins().list().getAdmins().get(0).getId(); + adminId = client.admins().list().getAdmins() + .orElseThrow(() -> new RuntimeException("Admins list is required")) + .get(0) + .orElseThrow(() -> new RuntimeException("Admin is required")) + .getId(); + adminIdInt = Integer.parseInt(adminId); } @Test @@ -38,8 +44,9 @@ public void testList() { @Test public void testFind() { // act - Admin response = - client.admins().find(FindAdminRequest.builder().adminId(adminId).build()); + Admin response = client.admins() + .find(FindAdminRequest.builder().adminId(adminIdInt).build()) + .orElseThrow(() -> new RuntimeException("Admin not found")); // assert Assertions.assertNotNull(response); @@ -69,10 +76,11 @@ public void testAwayOn() { // act Admin response = client.admins() .away(ConfigureAwayAdminRequest.builder() - .adminId(adminId) + .adminId(adminIdInt) .awayModeEnabled(true) .awayModeReassign(true) - .build()); + .build()) + .orElseThrow(() -> new RuntimeException("Admin not found")); // assert Assertions.assertNotNull(response); @@ -83,10 +91,11 @@ public void testAwayOff() { // act Admin response = client.admins() .away(ConfigureAwayAdminRequest.builder() - .adminId(adminId) + .adminId(adminIdInt) .awayModeEnabled(false) .awayModeReassign(false) - .build()); + .build()) + .orElseThrow(() -> new RuntimeException("Admin not found")); // assert Assertions.assertNotNull(response); diff --git a/src/test/java/com/intercom/api/integration/ArticlesTest.java b/src/test/java/com/intercom/api/integration/ArticlesTest.java index da0ccf3..0849171 100644 --- a/src/test/java/com/intercom/api/integration/ArticlesTest.java +++ b/src/test/java/com/intercom/api/integration/ArticlesTest.java @@ -2,7 +2,7 @@ import com.intercom.api.Intercom; import com.intercom.api.core.pagination.SyncPagingIterable; -import com.intercom.api.resources.articles.requests.CreateArticleRequest; +import com.intercom.api.types.CreateArticleRequest; import com.intercom.api.resources.articles.requests.DeleteArticleRequest; import com.intercom.api.resources.articles.requests.FindArticleRequest; import com.intercom.api.resources.articles.requests.ListArticlesRequest; @@ -26,7 +26,7 @@ public class ArticlesTest { private Intercom client; private Article article; - private String articleId; + private int articleId; private boolean deleteAfter; @BeforeEach @@ -39,11 +39,15 @@ public void before() { AdminList randomAdmins = client.admins().list(); Integer parentId = Integer.parseInt(randomCollections.getItems().get(0).getId()); - int adminId = Integer.parseInt(randomAdmins.getAdmins().get(0).getId()); + int adminId = Integer.parseInt(randomAdmins.getAdmins() + .orElseThrow(() -> new RuntimeException("Admins list is required")) + .get(0) + .orElseThrow(() -> new RuntimeException("Admin is required")) + .getId()); // act article = createArticle(parentId, adminId); - articleId = article.getId(); + articleId = Integer.parseInt(article.getId()); deleteAfter = true; } @@ -108,7 +112,7 @@ public void testDelete() { private Article createArticle(Integer parentId, int adminId) { return client.articles() - .create(CreateArticleRequest.builder() + .create(java.util.Optional.of(CreateArticleRequest.builder() .title(Utils.randomString()) .authorId(adminId) .description(Utils.randomString()) @@ -125,10 +129,10 @@ private Article createArticle(Integer parentId, int adminId) { .state(ArticleContent.State.DRAFT) .build()) .build()) - .build()); + .build())); } - private void tryDeleteArticle(String articleId) { + private void tryDeleteArticle(int articleId) { try { client.articles() .delete(DeleteArticleRequest.builder().articleId(articleId).build()); diff --git a/src/test/java/com/intercom/api/integration/CompaniesTest.java b/src/test/java/com/intercom/api/integration/CompaniesTest.java index 556be3e..64caf6b 100644 --- a/src/test/java/com/intercom/api/integration/CompaniesTest.java +++ b/src/test/java/com/intercom/api/integration/CompaniesTest.java @@ -4,7 +4,7 @@ import com.intercom.api.core.pagination.SyncPage; import com.intercom.api.core.pagination.SyncPagingIterable; import com.intercom.api.resources.companies.requests.AttachContactToCompanyRequest; -import com.intercom.api.resources.companies.requests.CreateOrUpdateCompanyRequest; +import com.intercom.api.types.CreateOrUpdateCompanyRequest; import com.intercom.api.resources.companies.requests.DeleteCompanyRequest; import com.intercom.api.resources.companies.requests.DetachContactFromCompanyRequest; import com.intercom.api.resources.companies.requests.FindCompanyRequest; @@ -42,9 +42,9 @@ public void before() { client.contacts().list(ListContactsRequest.builder().perPage(1).build()); // act - contactId = randomContacts.getItems().get(0).getId(); + contactId = randomContacts.getItems().get(0).getId().orElseThrow(() -> new RuntimeException("Contact ID is required")); company = client.companies() - .createOrUpdate(CreateOrUpdateCompanyRequest.builder() + .createOrUpdate(java.util.Optional.of(CreateOrUpdateCompanyRequest.builder() .name(Utils.randomString()) .companyId(Utils.randomString()) .plan("1. Get pizzaid") @@ -53,7 +53,7 @@ public void before() { .industry("The Best One") .remoteCreatedAt((int) (new Date().toInstant().toEpochMilli() / 1000L)) .monthlySpend(9001) - .build()); + .build())); companyId = company.getId(); deleteAfter = true; @@ -77,7 +77,7 @@ public void testCreate() { public void testUpdate() { // act Company response = client.companies() - .createOrUpdate(CreateOrUpdateCompanyRequest.builder() + .createOrUpdate(java.util.Optional.of(CreateOrUpdateCompanyRequest.builder() .name(Utils.randomString()) .companyId(Utils.randomString()) .plan("1. Get pizzaid") @@ -86,7 +86,7 @@ public void testUpdate() { .industry("The Best One") .remoteCreatedAt((int) (new Date().toInstant().toEpochMilli() / 1000L)) .monthlySpend(9001) - .build()); + .build())); // assert Assertions.assertNotNull(response); @@ -164,8 +164,6 @@ public void testListAttachedContacts() { CompanyAttachedContacts response = client.companies() .listAttachedContacts(ListAttachedContactsRequest.builder() .companyId(companyId) - .page(1) - .perPage(25) .build()); // assert diff --git a/src/test/java/com/intercom/api/integration/ContactsTest.java b/src/test/java/com/intercom/api/integration/ContactsTest.java index 2f24fc8..aa6342c 100644 --- a/src/test/java/com/intercom/api/integration/ContactsTest.java +++ b/src/test/java/com/intercom/api/integration/ContactsTest.java @@ -4,7 +4,11 @@ import com.intercom.api.core.pagination.SyncPage; import com.intercom.api.core.pagination.SyncPagingIterable; import com.intercom.api.resources.companies.requests.AttachContactToCompanyRequest; -import com.intercom.api.resources.companies.requests.CreateOrUpdateCompanyRequest; +import com.intercom.api.resources.contacts.types.ContactsCreateResponse; +import com.intercom.api.resources.contacts.types.ContactsFindResponse; +import com.intercom.api.resources.contacts.types.ContactsUpdateResponse; +import com.intercom.api.resources.contacts.types.ContactsMergeLeadInUserResponse; +import com.intercom.api.types.CreateOrUpdateCompanyRequest; import com.intercom.api.resources.companies.requests.DeleteCompanyRequest; import com.intercom.api.resources.companies.types.Company; import com.intercom.api.resources.contacts.requests.ArchiveContactRequest; @@ -47,7 +51,8 @@ public class ContactsTest { private Intercom client; private String subscriptionId; private Tag tag; - private Contact contact; + private ContactsCreateResponse contact; + private String contactId; private Company company; @BeforeEach @@ -59,10 +64,11 @@ public void before() { .externalId(Utils.randomString()) .phone("+353871234567") .build())); + contactId = contact.getId().orElseThrow(() -> new RuntimeException("Contact ID is required")); // act company = client.companies() - .createOrUpdate(CreateOrUpdateCompanyRequest.builder() + .createOrUpdate(java.util.Optional.of(CreateOrUpdateCompanyRequest.builder() .name(Utils.randomString()) .companyId(Utils.randomString()) .plan("1. Get pizzaid") @@ -71,19 +77,22 @@ public void before() { .industry("The Best One") .remoteCreatedAt((int) (new Date().toInstant().toEpochMilli() / 1000L)) .monthlySpend(9001) - .build()); + .build())); client.companies() .attachContact(AttachContactToCompanyRequest.builder() - .contactId(contact.getId()) + .contactId(contactId) .companyId(company.getId()) .build()); SubscriptionTypeList subscriptionTypes = client.subscriptionTypes().list(); - subscriptionId = subscriptionTypes.getData().get(0).getId(); + subscriptionId = subscriptionTypes.getData() + .orElseThrow(() -> new RuntimeException("No subscription types found")) + .get(0).getId() + .orElseThrow(() -> new RuntimeException("Subscription type ID is required")); client.contacts() .attachSubscription(AttachSubscriptionToContactRequest.builder() - .contactId(contact.getId()) + .contactId(contactId) .subscriptionId(subscriptionId) .consentType("opt_in") .build()); @@ -94,7 +103,7 @@ public void before() { .build())); client.tags() .tagContact(TagContactRequest.builder() - .contactId(contact.getId()) + .contactId(contactId) .tagId(tag.getId()) .build()); } @@ -127,7 +136,7 @@ public void testCreateUser() { @Test public void testCreateLead() { // act - Contact response = client.contacts() + ContactsCreateResponse response = client.contacts() .create(CreateContactRequest.of(CreateContactRequest.WithRole.builder() .role("lead") .name("Roman Bowling") @@ -140,7 +149,7 @@ public void testCreateLead() { try { client.contacts() .delete(DeleteContactRequest.builder() - .contactId(response.getId()) + .contactId(response.getId().orElseThrow(() -> new RuntimeException("Contact ID is required"))) .build()); } catch (Exception e) { throw new RuntimeException("Failed to delete contact.", e); @@ -150,8 +159,8 @@ public void testCreateLead() { @Test public void testFindById() { // act - Contact response = client.contacts() - .find(FindContactRequest.builder().contactId(contact.getId()).build()); + ContactsFindResponse response = client.contacts() + .find(FindContactRequest.builder().contactId(contactId).build()); // assert Assertions.assertNotNull(response); @@ -160,9 +169,9 @@ public void testFindById() { @Test public void testUpdate() { // act - Contact response = client.contacts() + ContactsUpdateResponse response = client.contacts() .update(UpdateContactRequest.builder() - .contactId(contact.getId()) + .contactId(contactId) .name("Nico Bellic") .build()); @@ -175,7 +184,7 @@ public void testArchive() { // act ContactArchived response = client.contacts() .archive(ArchiveContactRequest.builder() - .contactId(contact.getId()) + .contactId(contactId) .build()); // assert @@ -184,7 +193,7 @@ public void testArchive() { // cleanup client.contacts() .unarchive(UnarchiveContactRequest.builder() - .contactId(contact.getId()) + .contactId(contactId) .build()); } @@ -193,11 +202,11 @@ public void testUnarchive() { // act client.contacts() .archive(ArchiveContactRequest.builder() - .contactId(contact.getId()) + .contactId(contactId) .build()); ContactUnarchived response = client.contacts() .unarchive(UnarchiveContactRequest.builder() - .contactId(contact.getId()) + .contactId(contactId) .build()); // assert @@ -207,14 +216,15 @@ public void testUnarchive() { @Test public void testDelete() { // act - Contact created = client.contacts() + ContactsCreateResponse created = client.contacts() .create(CreateContactRequest.of(CreateContactRequest.WithRole.builder() .role("lead") .name("Roman Bowling") .build())); + String createdId = created.getId().orElseThrow(() -> new RuntimeException("Contact ID is required")); ContactDeleted response = client.contacts() .delete(DeleteContactRequest.builder() - .contactId(created.getId()) + .contactId(createdId) .build()); // assert @@ -224,15 +234,16 @@ public void testDelete() { @Test public void testMergeLeadInUser() { // act - Contact lead = client.contacts() + ContactsCreateResponse lead = client.contacts() .create(CreateContactRequest.of(CreateContactRequest.WithRole.builder() .role("lead") .name("Roman Bowling") .build())); - Contact response = client.contacts() + String leadId = lead.getId().orElseThrow(() -> new RuntimeException("Lead ID is required")); + ContactsMergeLeadInUserResponse response = client.contacts() .mergeLeadInUser(MergeContactsRequest.builder() - .leadId(lead.getId()) - .contactId(contact.getId()) + .leadId(leadId) + .contactId(contactId) .build()); // assert @@ -242,7 +253,7 @@ public void testMergeLeadInUser() { try { client.contacts() .delete(DeleteContactRequest.builder() - .contactId(lead.getId()) + .contactId(leadId) .build()); } catch (Exception e) { throw new RuntimeException("Failed to delete contact.", e); @@ -254,7 +265,7 @@ public void testListAttachedCompanies() { // act SyncPagingIterable response = client.contacts() .listAttachedCompanies(ListAttachedCompaniesRequest.builder() - .contactId(contact.getId()) + .contactId(contactId) .build()); // assert @@ -266,7 +277,7 @@ public void testListAttachedEmailSubscriptions() { // act SubscriptionTypeList response = client.contacts() .listAttachedSubscriptions(ListAttachedSubscriptionsRequest.builder() - .contactId(contact.getId()) + .contactId(contactId) .build()); // assert @@ -278,7 +289,7 @@ public void testListAttachedSegments() { // act ContactSegments response = client.contacts() .listAttachedSegments(ListSegmentsAttachedToContactRequest.builder() - .contactId(contact.getId()) + .contactId(contactId) .build()); // assert @@ -290,7 +301,7 @@ public void testListAttachedTags() { // act TagList response = client.contacts() .listAttachedTags(ListTagsAttachedToContactRequest.builder() - .contactId(contact.getId()) + .contactId(contactId) .build()); // assert @@ -356,7 +367,7 @@ private void tryDetachSubscription() { try { client.contacts() .detachSubscription(DetachSubscriptionFromContactRequest.builder() - .contactId(contact.getId()) + .contactId(contactId) .subscriptionId(subscriptionId) .build()); } catch (Exception e) { @@ -368,7 +379,7 @@ private void tryUntagContact() { try { client.tags() .untagContact(UntagContactRequest.builder() - .contactId(contact.getId()) + .contactId(contactId) .tagId(tag.getId()) .build()); } catch (Exception e) { @@ -391,7 +402,7 @@ private void tryDeleteContact() { try { client.contacts() .delete(DeleteContactRequest.builder() - .contactId(contact.getId()) + .contactId(contactId) .build()); } catch (Exception e) { throw new RuntimeException("Failed to delete contact.", e); diff --git a/src/test/java/com/intercom/api/integration/ConversationsTest.java b/src/test/java/com/intercom/api/integration/ConversationsTest.java index a7261ab..ce85848 100644 --- a/src/test/java/com/intercom/api/integration/ConversationsTest.java +++ b/src/test/java/com/intercom/api/integration/ConversationsTest.java @@ -1,11 +1,12 @@ package com.intercom.api.integration; import com.intercom.api.Intercom; +import com.intercom.api.core.ApiVersion; import com.intercom.api.core.pagination.SyncPage; import com.intercom.api.core.pagination.SyncPagingIterable; import com.intercom.api.resources.admins.types.Admin; import com.intercom.api.resources.contacts.requests.DeleteContactRequest; -import com.intercom.api.resources.contacts.types.Contact; +import com.intercom.api.resources.contacts.types.ContactsCreateResponse; import com.intercom.api.resources.conversations.requests.AttachContactToConversationRequest; import com.intercom.api.resources.conversations.requests.AutoAssignConversationRequest; import com.intercom.api.resources.conversations.requests.CreateConversationRequest; @@ -25,7 +26,6 @@ import com.intercom.api.types.ContactReplyIntercomUserIdRequest; import com.intercom.api.types.CreateContactRequest; import com.intercom.api.types.MultipleFilterSearchRequest; -import com.intercom.api.types.MultipleOrSingleFilterSearchRequest; import com.intercom.api.types.OpenConversationRequest; import com.intercom.api.types.RedactConversationRequest; import com.intercom.api.types.ReplyConversationRequest; @@ -51,10 +51,14 @@ public class ConversationsTest { private Intercom client; private String adminId; private String secondAdminId; - private Contact user; - private Contact secondUser; - private Contact lead; + private ContactsCreateResponse user; + private ContactsCreateResponse secondUser; + private ContactsCreateResponse lead; + private String userId; + private String secondUserId; + private String leadId; private Conversation conversation; + private String conversationId; @BeforeEach @SuppressWarnings("CallToPrintStackTrace") @@ -62,7 +66,11 @@ public void before() { // arrange client = TestClientFactory.create(); - List admins = client.admins().list().getAdmins().stream() + List admins = client.admins().list().getAdmins() + .orElseThrow(() -> new RuntimeException("Admins list is required")) + .stream() + .filter(opt -> opt.isPresent()) + .map(opt -> opt.get()) .filter(Admin::getHasInboxSeat) .collect(Collectors.toList()); adminId = admins.get(0).getId(); @@ -73,23 +81,26 @@ public void before() { .externalId(Utils.randomString()) .name("Baba Booey") .build())); + userId = user.getId().orElseThrow(() -> new RuntimeException("User ID is required")); secondUser = client.contacts() .create(CreateContactRequest.of(CreateContactRequest.WithExternalId.builder() .externalId(Utils.randomString()) .name("Babusha Boy") .build())); + secondUserId = secondUser.getId().orElseThrow(() -> new RuntimeException("Second user ID is required")); lead = client.contacts() .create(CreateContactRequest.of(CreateContactRequest.WithExternalId.builder() .externalId(Utils.randomString()) .name("Babushka Lead") .build())); + leadId = lead.getId().orElseThrow(() -> new RuntimeException("Lead ID is required")); Message conversationMessage = client.conversations() .create(CreateConversationRequest.builder() .from(CreateConversationRequest.builder() .from(CreateConversationRequest.From.builder() .type(CreateConversationRequest.From.Type.USER) - .id(user.getId()) + .id(userId) .build()) .body("Raz-dwa-try kalyna, czorniawaja diwczyna") .build()) @@ -104,10 +115,13 @@ public void before() { after(); } + String msgConversationId = conversationMessage.getConversationId() + .orElseThrow(() -> new RuntimeException("Conversation ID is required")); conversation = client.conversations() .find(FindConversationRequest.builder() - .conversationId(conversationMessage.getConversationId()) + .conversationId(msgConversationId) .build()); + conversationId = conversation.getId().orElseThrow(() -> new RuntimeException("Conversation ID is required")); } @AfterEach @@ -130,7 +144,7 @@ public void testCreateConversationWithLead() { .from(CreateConversationRequest.builder() .from(CreateConversationRequest.From.builder() .type(CreateConversationRequest.From.Type.USER) - .id(lead.getId()) + .id(leadId) .build()) .body("Raz-dwa-try kalyna, czorniawaja diwczyna") .build()) @@ -145,7 +159,7 @@ public void testUpdate() { // act Conversation response = client.conversations() .update(UpdateConversationRequest.builder() - .conversationId(conversation.getId()) + .conversationId(conversationId) .read(false) .build()); @@ -158,7 +172,7 @@ public void testReplyByIdAsAdmin() { // act Conversation response = client.conversations() .reply(ReplyToConversationRequest.builder() - .conversationId(conversation.getId()) + .conversationId(conversationId) .body(ReplyConversationRequest.of(AdminReplyConversationRequest.builder() .messageType(AdminReplyConversationRequest.MessageType.COMMENT) .adminId(adminId) @@ -175,11 +189,11 @@ public void testReplyByIdAsUser() { // act Conversation response = client.conversations() .reply(ReplyToConversationRequest.builder() - .conversationId(conversation.getId()) + .conversationId(conversationId) .body(ReplyConversationRequest.of( ContactReplyConversationRequest.of(ContactReplyIntercomUserIdRequest.builder() .body("*click* Nice!") - .intercomUserId(user.getId()) + .intercomUserId(userId) .build()))) .build()); @@ -192,7 +206,7 @@ public void testAssign() { // act Conversation response = client.conversations() .manage(ManageConversationPartsRequest.builder() - .conversationId(conversation.getId()) + .conversationId(conversationId) .body(ConversationsManageRequestBody.assignment(AssignConversationRequest.builder() .type(AssignConversationRequest.Type.ADMIN) .adminId(adminId) @@ -206,14 +220,15 @@ public void testAssign() { @Test public void testRunAssignmentRules() { - // act - Conversation response = client.conversations() + Intercom legacyServiceClient = TestClientFactory.create(ApiVersion._2_11); + // act - runAssignmentRules returns void + legacyServiceClient.conversations() .runAssignmentRules(AutoAssignConversationRequest.builder() - .conversationId(conversation.getId()) + .conversationId(conversationId) .build()); - // assert - Assertions.assertNotNull(response); + // assert - if no exception was thrown, the test passed + Assertions.assertTrue(true); } @Test @@ -221,7 +236,7 @@ public void testSnooze() { // act Conversation response = client.conversations() .manage(ManageConversationPartsRequest.builder() - .conversationId(conversation.getId()) + .conversationId(conversationId) .body(ConversationsManageRequestBody.snoozed(SnoozeConversationRequest.builder() .adminId(adminId) .snoozedUntil((int) @@ -238,7 +253,7 @@ public void testOpen() { // act Conversation response = client.conversations() .manage(ManageConversationPartsRequest.builder() - .conversationId(conversation.getId()) + .conversationId(conversationId) .body(ConversationsManageRequestBody.open(OpenConversationRequest.builder() .adminId(adminId) .build())) @@ -253,10 +268,10 @@ public void testAttachContactAsAdmin() { // act Conversation response = client.conversations() .attachContactAsAdmin(AttachContactToConversationRequest.builder() - .conversationId(conversation.getId()) + .conversationId(conversationId) .customer(AttachContactToConversationRequest.Customer.of( AttachContactToConversationRequest.Customer.IntercomUserId.builder() - .intercomUserId(secondUser.getId()) + .intercomUserId(secondUserId) .build())) .adminId(adminId) .build()); @@ -270,17 +285,17 @@ public void testDetachContactAsAdmin() { // act client.conversations() .attachContactAsAdmin(AttachContactToConversationRequest.builder() - .conversationId(conversation.getId()) + .conversationId(conversationId) .customer(AttachContactToConversationRequest.Customer.of( AttachContactToConversationRequest.Customer.IntercomUserId.builder() - .intercomUserId(secondUser.getId()) + .intercomUserId(secondUserId) .build())) .adminId(adminId) .build()); Conversation response = client.conversations() .detachContactAsAdmin(DetachContactFromConversationRequest.builder() - .conversationId(conversation.getId()) - .contactId(secondUser.getId()) + .conversationId(conversationId) + .contactId(secondUserId) .adminId(adminId) .build()); @@ -294,12 +309,12 @@ public void testRedactConversationPart() { Conversation response = client.conversations() .redactConversationPart( RedactConversationRequest.conversationPart(RedactConversationRequest.ConversationPart.builder() - .conversationId(conversation.getId()) + .conversationId(conversationId) .conversationPartId(conversation .getConversationParts() - .map(conv -> conv.getConversationParts() - .get(2) - .getId()) + .flatMap(parts -> parts.getConversationParts()) + .map(list -> list.get(2)) + .flatMap(part -> part.getId()) .orElse("")) .build())); @@ -312,7 +327,7 @@ public void testClose() { // act Conversation response = client.conversations() .manage(ManageConversationPartsRequest.builder() - .conversationId(conversation.getId()) + .conversationId(conversationId) .body(ConversationsManageRequestBody.close(CloseConversationRequest.builder() .adminId(adminId) .body("Hasta la vista, baby") @@ -326,19 +341,19 @@ public void testClose() { @Test public void testSearch() { // act - List value = new ArrayList<>(); + List value = new ArrayList<>(); SingleFilterSearchRequest query = SingleFilterSearchRequest.builder() .operator(SingleFilterSearchRequest.Operator.NOT_EQUALS) .field("id") .value(SingleFilterSearchRequest.Value.of("123")) .build(); - value.add(MultipleOrSingleFilterSearchRequest.of(query)); + value.add(query); SyncPagingIterable response = client.conversations() .search(SearchRequest.builder() .query(SearchRequest.Query.of(MultipleFilterSearchRequest.builder() .operator(MultipleFilterSearchRequest.Operator.AND) - .value(value) + .value(MultipleFilterSearchRequest.Value.ofListOfSingleFilterSearchRequest(value)) .build())) .build()); @@ -405,15 +420,15 @@ private void tryDeleteContacts() { try { client.contacts() .delete(DeleteContactRequest.builder() - .contactId(user.getId()) + .contactId(userId) .build()); client.contacts() .delete(DeleteContactRequest.builder() - .contactId(secondUser.getId()) + .contactId(secondUserId) .build()); client.contacts() .delete(DeleteContactRequest.builder() - .contactId(lead.getId()) + .contactId(leadId) .build()); } catch (Exception e) { throw new RuntimeException("Failed to delete contacts.", e); diff --git a/src/test/java/com/intercom/api/integration/DataAttributesTest.java b/src/test/java/com/intercom/api/integration/DataAttributesTest.java index e51b93e..c0627ec 100644 --- a/src/test/java/com/intercom/api/integration/DataAttributesTest.java +++ b/src/test/java/com/intercom/api/integration/DataAttributesTest.java @@ -1,15 +1,20 @@ package com.intercom.api.integration; import com.intercom.api.Intercom; -import com.intercom.api.resources.dataattributes.requests.CreateDataAttributeRequest; +import com.intercom.api.core.ObjectMappers; import com.intercom.api.resources.dataattributes.requests.ListDataAttributesRequest; import com.intercom.api.resources.dataattributes.requests.UpdateDataAttributeRequest; import com.intercom.api.resources.dataattributes.types.DataAttribute; import com.intercom.api.resources.dataattributes.types.DataAttributesListRequestModel; +import com.intercom.api.types.CreateDataAttributeRequest; import com.intercom.api.types.DataAttributeList; +import com.intercom.api.types.UpdateDataAttributeRequestBody; import com.intercom.api.utils.TestClientFactory; import com.intercom.api.utils.Utils; +import java.util.Arrays; +import java.util.HashMap; import java.util.List; +import java.util.Map; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -18,6 +23,7 @@ public class DataAttributesTest { private Intercom client; private DataAttribute dataAttribute; + private int dataAttributeId; @BeforeEach public void before() { @@ -25,13 +31,21 @@ public void before() { // The workspace we test on has hit the CDA limit, so we can't create any more // for now. We should reenable this test once we have a new workspace. - dataAttribute = client.dataAttributes() - .create(CreateDataAttributeRequest.builder() - .name("Bebech" + Utils.randomString()) - .model(CreateDataAttributeRequest.Model.CONTACT) - .dataType(CreateDataAttributeRequest.DataType.STRING) - .description("Dummy description") - .build()); + // CreateDataAttributeRequest is a union type, so we need to use ObjectMapper + // to construct it with name, model, data_type, and description fields. + Map createRequestData = new HashMap<>(); + createRequestData.put("name", "Bebech" + Utils.randomString()); + createRequestData.put("model", "contact"); + createRequestData.put("data_type", "string"); + createRequestData.put("description", "Dummy description"); + + CreateDataAttributeRequest createRequest = + ObjectMappers.JSON_MAPPER.convertValue(createRequestData, CreateDataAttributeRequest.class); + + dataAttribute = client.dataAttributes().create(createRequest); + dataAttributeId = dataAttribute + .getId() + .orElseThrow(() -> new RuntimeException("dataAttribute.id is required")); } @Test @@ -42,23 +56,24 @@ public void testCreate() { @Test public void testUpdate() { - // act - if (!dataAttribute.getId().isPresent()) { - throw new RuntimeException("dataAttribute.id is required to update"); - } + // UpdateDataAttributeRequestBody is a union type, so we need to use ObjectMapper + // to construct it with archived, description, and options fields. + Map updateBodyData = new HashMap<>(); + updateBodyData.put("archived", false); + updateBodyData.put("description", "Woo-aaa"); + Map option1 = new HashMap<>(); + option1.put("value", "1-10"); + Map option2 = new HashMap<>(); + option2.put("value", "11-20"); + updateBodyData.put("options", Arrays.asList(option1, option2)); + + UpdateDataAttributeRequestBody updateBody = + ObjectMappers.JSON_MAPPER.convertValue(updateBodyData, UpdateDataAttributeRequestBody.class); DataAttribute response = client.dataAttributes() .update(UpdateDataAttributeRequest.builder() - .dataAttributeId(dataAttribute.getId().get().toString()) - .archived(false) - .description("Woo-aaa") - .options(List.of( - UpdateDataAttributeRequest.OptionsItem.builder() - .value("1-10") - .build(), - UpdateDataAttributeRequest.OptionsItem.builder() - .value("11-20") - .build())) + .dataAttributeId(dataAttributeId) + .body(updateBody) .build()); // assert diff --git a/src/test/java/com/intercom/api/integration/DataExportTest.java b/src/test/java/com/intercom/api/integration/DataExportTest.java index 977bfdc..a7cde20 100644 --- a/src/test/java/com/intercom/api/integration/DataExportTest.java +++ b/src/test/java/com/intercom/api/integration/DataExportTest.java @@ -14,6 +14,7 @@ public class DataExportTest { private Intercom client; private DataExport export; + private String jobIdentifier; @BeforeEach public void before() { @@ -25,6 +26,8 @@ public void before() { .createdAtAfter(1670000000) .createdAtBefore(1670940528) .build()); + jobIdentifier = export.getJobIdentifier() + .orElseThrow(() -> new RuntimeException("Job identifier is required")); } @Test @@ -35,7 +38,7 @@ public void testCreate() { // cleanup client.dataExport() .cancel(CancelDataExportRequest.builder() - .jobIdentifier(export.getJobIdentifier()) + .jobIdentifier(jobIdentifier) .build()); } @@ -44,7 +47,7 @@ public void testFind() { // act DataExport response = client.dataExport() .find(FindDataExportRequest.builder() - .jobIdentifier(export.getJobIdentifier()) + .jobIdentifier(jobIdentifier) .build()); // assert @@ -53,7 +56,7 @@ public void testFind() { // cleanup client.dataExport() .cancel(CancelDataExportRequest.builder() - .jobIdentifier(export.getJobIdentifier()) + .jobIdentifier(jobIdentifier) .build()); } @@ -62,7 +65,7 @@ public void testCancel() { // act DataExport response = client.dataExport() .cancel(CancelDataExportRequest.builder() - .jobIdentifier(export.getJobIdentifier()) + .jobIdentifier(jobIdentifier) .build()); // assert diff --git a/src/test/java/com/intercom/api/integration/EventsTest.java b/src/test/java/com/intercom/api/integration/EventsTest.java index 4c1d9d2..61e3861 100644 --- a/src/test/java/com/intercom/api/integration/EventsTest.java +++ b/src/test/java/com/intercom/api/integration/EventsTest.java @@ -7,7 +7,6 @@ import com.intercom.api.types.CreateDataEventRequest; import com.intercom.api.types.DataEventSummary; import com.intercom.api.types.MultipleFilterSearchRequest; -import com.intercom.api.types.MultipleOrSingleFilterSearchRequest; import com.intercom.api.types.SearchRequest; import com.intercom.api.types.SingleFilterSearchRequest; import com.intercom.api.types.StartingAfterPaging; @@ -32,25 +31,25 @@ public void before() { // arrange client = TestClientFactory.create(); - List value = new ArrayList<>(); + List value = new ArrayList<>(); SingleFilterSearchRequest query1 = SingleFilterSearchRequest.builder() .field("role") .operator(SingleFilterSearchRequest.Operator.EQUALS) .value(SingleFilterSearchRequest.Value.of("user")) .build(); - value.add(MultipleOrSingleFilterSearchRequest.of(query1)); + value.add(query1); SingleFilterSearchRequest query2 = SingleFilterSearchRequest.builder() .field("external_id") .operator(SingleFilterSearchRequest.Operator.NOT_EQUALS) .value(Optional.empty()) .build(); - value.add(MultipleOrSingleFilterSearchRequest.of(query2)); + value.add(query2); SyncPagingIterable randomUsers = client.contacts() .search(SearchRequest.builder() .query(SearchRequest.Query.of(MultipleFilterSearchRequest.builder() .operator(MultipleFilterSearchRequest.Operator.AND) - .value(value) + .value(MultipleFilterSearchRequest.Value.ofListOfSingleFilterSearchRequest(value)) .build())) .pagination(StartingAfterPaging.builder().perPage(1).build()) .build()); diff --git a/src/test/java/com/intercom/api/integration/IntegrationTest.java b/src/test/java/com/intercom/api/integration/IntegrationTest.java index deab9ef..ca522c9 100644 --- a/src/test/java/com/intercom/api/integration/IntegrationTest.java +++ b/src/test/java/com/intercom/api/integration/IntegrationTest.java @@ -2,11 +2,11 @@ import com.intercom.api.Intercom; import com.intercom.api.resources.companies.requests.AttachContactToCompanyRequest; -import com.intercom.api.resources.companies.requests.CreateOrUpdateCompanyRequest; +import com.intercom.api.resources.contacts.types.ContactsCreateResponse; +import com.intercom.api.types.CreateOrUpdateCompanyRequest; import com.intercom.api.resources.companies.requests.DeleteCompanyRequest; import com.intercom.api.resources.companies.types.Company; import com.intercom.api.resources.contacts.requests.DeleteContactRequest; -import com.intercom.api.resources.contacts.types.Contact; import com.intercom.api.resources.conversations.requests.CreateConversationRequest; import com.intercom.api.resources.messages.types.Message; import com.intercom.api.resources.tags.requests.DeleteTagRequest; @@ -28,18 +28,24 @@ public class IntegrationTest { private Intercom client; private String adminId; private Company company; - private Contact user; - private Contact lead; + private ContactsCreateResponse user; + private ContactsCreateResponse lead; + private String userId; + private String leadId; private Tag tag; @BeforeEach public void before() { // arrange client = TestClientFactory.create(); - adminId = client.admins().list().getAdmins().get(0).getId(); + adminId = client.admins().list().getAdmins() + .orElseThrow(() -> new RuntimeException("Admins list is required")) + .get(0) + .orElseThrow(() -> new RuntimeException("Admin is required")) + .getId(); company = client.companies() - .createOrUpdate(CreateOrUpdateCompanyRequest.builder() + .createOrUpdate(java.util.Optional.of(CreateOrUpdateCompanyRequest.builder() .name(Utils.randomString()) .companyId(Utils.randomString()) .plan("1. Get pizzaid") @@ -48,16 +54,18 @@ public void before() { .industry("The Best One") .remoteCreatedAt((int) (new Date().toInstant().toEpochMilli() / 1000L)) .monthlySpend(9001) - .build()); + .build())); user = client.contacts() .create(CreateContactRequest.of(CreateContactRequest.WithExternalId.builder() .externalId(Utils.randomString()) .build())); + userId = user.getId().orElseThrow(() -> new RuntimeException("User ID is required")); lead = client.contacts() .create(CreateContactRequest.of(CreateContactRequest.WithRole.builder() .role("lead") .name("Marek Barek") .build())); + leadId = lead.getId().orElseThrow(() -> new RuntimeException("Lead ID is required")); tag = client.tags() .create(TagsCreateRequestBody.of(CreateOrUpdateTagRequest.builder() .name(Utils.randomString()) @@ -77,7 +85,7 @@ public void testAddContactToCompany() { // act Company response = client.companies() .attachContact(AttachContactToCompanyRequest.builder() - .contactId(user.getId()) + .contactId(userId) .companyId(company.getId()) .build()); @@ -92,7 +100,7 @@ public void testCreateConversationWithContact() { .create(CreateConversationRequest.builder() .from(CreateConversationRequest.From.builder() .type(CreateConversationRequest.From.Type.USER) - .id(user.getId()) + .id(userId) .build()) .body("Welcome to the club, buddy!") .build()); @@ -108,7 +116,7 @@ public void testTagConversation() { .create(CreateConversationRequest.builder() .from(CreateConversationRequest.From.builder() .type(CreateConversationRequest.From.Type.USER) - .id(user.getId()) + .id(userId) .build()) .body("Welcome to the club, buddy!") .build()); @@ -116,7 +124,8 @@ public void testTagConversation() { // act Tag response = client.tags() .tagConversation(TagConversationRequest.builder() - .conversationId(message.getConversationId()) + .conversationId(message.getConversationId() + .orElseThrow(() -> new RuntimeException("Conversation ID is required"))) .tagId(tag.getId()) .adminId(adminId) .build()); @@ -129,11 +138,11 @@ private void tryDeleteContacts() { try { client.contacts() .delete(DeleteContactRequest.builder() - .contactId(user.getId()) + .contactId(userId) .build()); client.contacts() .delete(DeleteContactRequest.builder() - .contactId(lead.getId()) + .contactId(leadId) .build()); } catch (Exception e) { throw new RuntimeException("Failed to delete contacts.", e); diff --git a/src/test/java/com/intercom/api/integration/MessagesTest.java b/src/test/java/com/intercom/api/integration/MessagesTest.java index 0af2244..02568ec 100644 --- a/src/test/java/com/intercom/api/integration/MessagesTest.java +++ b/src/test/java/com/intercom/api/integration/MessagesTest.java @@ -3,7 +3,7 @@ import com.intercom.api.Intercom; import com.intercom.api.core.pagination.SyncPagingIterable; import com.intercom.api.resources.contacts.requests.DeleteContactRequest; -import com.intercom.api.resources.contacts.types.Contact; +import com.intercom.api.resources.contacts.types.ContactsCreateResponse; import com.intercom.api.resources.conversations.types.Conversation; import com.intercom.api.resources.messages.types.Message; import com.intercom.api.types.CreateContactRequest; @@ -22,19 +22,26 @@ public class MessagesTest { private Intercom client; private String adminId; - private Contact user; + private ContactsCreateResponse user; + private String userId; @BeforeEach public void before() { // arrange client = TestClientFactory.create(); - adminId = client.admins().list().getAdmins().get(0).getId(); + adminId = client.admins().list().getAdmins() + .orElseThrow(() -> new RuntimeException("Admins list is required")) + .get(0) + .orElseThrow(() -> new RuntimeException("Admin is required")) + .getId(); user = client.contacts() .create(CreateContactRequest.of(CreateContactRequest.WithExternalId.builder() .externalId(Utils.randomString()) .name("Message Test User") .build())); + userId = user.getId() + .orElseThrow(() -> new RuntimeException("User ID is required")); } @AfterEach @@ -48,17 +55,17 @@ public void after() { public void testMessageThatCreatesAConversation() { // act Message message = client.messages() - .create(CreateMessageRequest.inapp(CreateMessageRequest.Inapp.builder() + .create(java.util.Optional.of(CreateMessageRequest.inapp(CreateMessageRequest.Inapp.builder() .body("Hey, look at me! I am the conversations creator now!") .from(CreateMessageRequest.Inapp.From.builder() .id(Integer.parseInt(adminId)) .build()) .to(CreateMessageRequest.Inapp.To.builder() .type(CreateMessageRequest.Inapp.To.Type.USER) - .id(user.getId()) + .id(userId) .build()) .createConversationWithoutContactReply(true) - .build())); + .build()))); // Allow for some time to index the conversation try { @@ -86,16 +93,16 @@ public void testMessageThatCreatesAConversation() { public void testCreateMessageNoConversation() { // act Message response = client.messages() - .create(CreateMessageRequest.inapp(CreateMessageRequest.Inapp.builder() + .create(java.util.Optional.of(CreateMessageRequest.inapp(CreateMessageRequest.Inapp.builder() .body("Message without creating conversation") .from(CreateMessageRequest.Inapp.From.builder() .id(Integer.parseInt(adminId)) .build()) .to(CreateMessageRequest.Inapp.To.builder() .type(CreateMessageRequest.Inapp.To.Type.USER) - .id(user.getId()) + .id(userId) .build()) - .build())); + .build()))); // assert Assertions.assertNotNull(response); @@ -105,7 +112,7 @@ private void tryDeleteContact() { try { client.contacts() .delete(DeleteContactRequest.builder() - .contactId(user.getId()) + .contactId(userId) .build()); } catch (Exception e) { throw new RuntimeException("Failed to delete contact.", e); diff --git a/src/test/java/com/intercom/api/integration/NotesTest.java b/src/test/java/com/intercom/api/integration/NotesTest.java index e4e6747..df3139c 100644 --- a/src/test/java/com/intercom/api/integration/NotesTest.java +++ b/src/test/java/com/intercom/api/integration/NotesTest.java @@ -4,7 +4,7 @@ import com.intercom.api.core.pagination.SyncPage; import com.intercom.api.core.pagination.SyncPagingIterable; import com.intercom.api.resources.contacts.requests.DeleteContactRequest; -import com.intercom.api.resources.contacts.types.Contact; +import com.intercom.api.resources.contacts.types.ContactsCreateResponse; import com.intercom.api.resources.notes.requests.CreateContactNoteRequest; import com.intercom.api.resources.notes.requests.FindNoteRequest; import com.intercom.api.resources.notes.requests.ListContactNotesRequest; @@ -22,26 +22,36 @@ public class NotesTest { private Intercom client; private String adminId; - private Contact contact; + private ContactsCreateResponse contact; + private String contactId; private Note note; + private int noteId; @BeforeEach public void before() { // arrange client = TestClientFactory.create(); - adminId = client.admins().list().getAdmins().get(0).getId(); + adminId = client.admins().list().getAdmins() + .orElseThrow(() -> new RuntimeException("Admins list is required")) + .get(0) + .orElseThrow(() -> new RuntimeException("Admin is required")) + .getId(); contact = client.contacts() .create(CreateContactRequest.of(CreateContactRequest.WithExternalId.builder() .externalId(Utils.randomString()) .build())); + contactId = contact.getId() + .orElseThrow(() -> new RuntimeException("Contact ID is required")); note = client.notes() .create(CreateContactNoteRequest.builder() - .contactId(contact.getId()) + .contactId(contactId) .body(Utils.randomString()) .adminId(adminId) .build()); + noteId = Integer.parseInt(note.getId() + .orElseThrow(() -> new RuntimeException("Note ID is required"))); } @AfterEach @@ -60,7 +70,7 @@ public void testCreate() { public void testFind() { // act Note response = client.notes() - .find(FindNoteRequest.builder().noteId(note.getId()).build()); + .find(FindNoteRequest.builder().noteId(noteId).build()); // assert Assertions.assertNotNull(response); @@ -71,7 +81,7 @@ public void testList() { // act SyncPagingIterable response = client.notes() .list(ListContactNotesRequest.builder() - .contactId(contact.getId()) + .contactId(contactId) .perPage(25) .page(1) .build()); @@ -86,19 +96,19 @@ public void testPaginationIterator() { int limit = 2; client.notes() .create(CreateContactNoteRequest.builder() - .contactId(contact.getId()) + .contactId(contactId) .body("one") .build()); client.notes() .create(CreateContactNoteRequest.builder() - .contactId(contact.getId()) + .contactId(contactId) .body("two") .build()); // act Iterator iterator = client.notes() .list(ListContactNotesRequest.builder() - .contactId(contact.getId()) + .contactId(contactId) .perPage(1) .build()) .iterator(); @@ -129,19 +139,19 @@ public void testPaginationPager() { int limit = 2; client.notes() .create(CreateContactNoteRequest.builder() - .contactId(contact.getId()) + .contactId(contactId) .body("one") .build()); client.notes() .create(CreateContactNoteRequest.builder() - .contactId(contact.getId()) + .contactId(contactId) .body("two") .build()); // act SyncPagingIterable pager = client.notes() .list(ListContactNotesRequest.builder() - .contactId(contact.getId()) + .contactId(contactId) .perPage(1) .build()); @@ -165,7 +175,7 @@ private void tryDeleteContact() { try { client.contacts() .delete(DeleteContactRequest.builder() - .contactId(contact.getId()) + .contactId(contactId) .build()); } catch (Exception e) { throw new RuntimeException("Failed to delete contact.", e); diff --git a/src/test/java/com/intercom/api/integration/PhoneCallRedirectTest.java b/src/test/java/com/intercom/api/integration/PhoneCallRedirectTest.java index 29b03a7..1377612 100644 --- a/src/test/java/com/intercom/api/integration/PhoneCallRedirectTest.java +++ b/src/test/java/com/intercom/api/integration/PhoneCallRedirectTest.java @@ -1,10 +1,9 @@ package com.intercom.api.integration; import com.intercom.api.Intercom; -import com.intercom.api.resources.phonecallredirects.requests.CreatePhoneCallRedirectRequest; +import com.intercom.api.types.CreatePhoneSwitchRequest; import com.intercom.api.utils.TestClientFactory; -import java.util.HashMap; -import java.util.Map; +import java.util.Optional; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; @@ -21,16 +20,10 @@ public void before() { @Test public void testCreate() { - // arrange - Map customAttributes = new HashMap<>(); - customAttributes.put("issue_type", "Billing"); - customAttributes.put("priority", "High"); - - // assert + // act - CreatePhoneSwitchRequest doesn't support customAttributes as Map client.phoneCallRedirects() - .create(CreatePhoneCallRedirectRequest.builder() + .create(Optional.of(CreatePhoneSwitchRequest.builder() .phone("+353832345678") - .customAttributes(customAttributes) - .build()); + .build())); } } diff --git a/src/test/java/com/intercom/api/integration/SegmentsTest.java b/src/test/java/com/intercom/api/integration/SegmentsTest.java index ca4cce7..840c341 100644 --- a/src/test/java/com/intercom/api/integration/SegmentsTest.java +++ b/src/test/java/com/intercom/api/integration/SegmentsTest.java @@ -13,12 +13,17 @@ public class SegmentsTest { private Intercom client; private Segment segment; + private String segmentId; @BeforeEach public void before() { // arrange client = TestClientFactory.create(); - segment = client.segments().list().getSegments().get(0); + segment = client.segments().list().getSegments() + .orElseThrow(() -> new RuntimeException("Segments list is required")) + .get(0); + segmentId = segment.getId() + .orElseThrow(() -> new RuntimeException("Segment ID is required")); } @Test @@ -34,7 +39,7 @@ public void testList() { public void testFind() { // act Segment response = client.segments() - .find(FindSegmentRequest.builder().segmentId(segment.getId()).build()); + .find(FindSegmentRequest.builder().segmentId(segmentId).build()); // assert Assertions.assertNotNull(response); diff --git a/src/test/java/com/intercom/api/integration/TagsTest.java b/src/test/java/com/intercom/api/integration/TagsTest.java index 5348c5d..6e9bc1a 100644 --- a/src/test/java/com/intercom/api/integration/TagsTest.java +++ b/src/test/java/com/intercom/api/integration/TagsTest.java @@ -1,11 +1,11 @@ package com.intercom.api.integration; import com.intercom.api.Intercom; -import com.intercom.api.resources.companies.requests.CreateOrUpdateCompanyRequest; +import com.intercom.api.resources.contacts.types.ContactsCreateResponse; +import com.intercom.api.types.CreateOrUpdateCompanyRequest; import com.intercom.api.resources.companies.requests.DeleteCompanyRequest; import com.intercom.api.resources.companies.types.Company; import com.intercom.api.resources.contacts.requests.DeleteContactRequest; -import com.intercom.api.resources.contacts.types.Contact; import com.intercom.api.resources.conversations.requests.CreateConversationRequest; import com.intercom.api.resources.conversations.requests.FindConversationRequest; import com.intercom.api.resources.conversations.types.Conversation; @@ -25,6 +25,7 @@ import com.intercom.api.utils.TestClientFactory; import com.intercom.api.utils.Utils; import java.util.List; +import java.util.Optional; import java.util.concurrent.TimeUnit; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.Assertions; @@ -42,7 +43,11 @@ public void before() { // arrange client = TestClientFactory.create(); - adminId = client.admins().list().getAdmins().get(0).getId(); + adminId = client.admins().list().getAdmins() + .orElseThrow(() -> new RuntimeException("Admins list is required")) + .get(0) + .orElseThrow(() -> new RuntimeException("Admin is required")) + .getId(); tag = client.tags() .create(TagsCreateRequestBody.of(CreateOrUpdateTagRequest.builder() @@ -110,15 +115,16 @@ public void testDelete() { @Test public void testTagContact() { // arrange - Contact contact = client.contacts() + ContactsCreateResponse contact = client.contacts() .create(CreateContactRequest.of(CreateContactRequest.WithExternalId.builder() .externalId(Utils.randomString()) .build())); + String contactId = contact.getId().orElseThrow(() -> new RuntimeException("Contact ID is required")); // act Tag response = client.tags() .tagContact(TagContactRequest.builder() - .contactId(contact.getId()) + .contactId(contactId) .tagId(tag.getId()) .build()); @@ -129,7 +135,7 @@ public void testTagContact() { try { client.tags() .untagContact(UntagContactRequest.builder() - .contactId(contact.getId()) + .contactId(contactId) .tagId(tag.getId()) .build()); } catch (Exception e) { @@ -139,7 +145,7 @@ public void testTagContact() { try { client.contacts() .delete(DeleteContactRequest.builder() - .contactId(contact.getId()) + .contactId(contactId) .build()); } catch (Exception e) { throw new RuntimeException("Failed to delete contact.", e); @@ -150,9 +156,9 @@ public void testTagContact() { public void testTagCompany() { // arrange Company company = client.companies() - .createOrUpdate(CreateOrUpdateCompanyRequest.builder() + .createOrUpdate(Optional.of(CreateOrUpdateCompanyRequest.builder() .companyId(Utils.randomString()) - .build()); + .build())); // act Tag response = client.tags() @@ -193,18 +199,19 @@ public void testTagCompany() { @Test public void testTagConversation() { // arrange - Contact contact = client.contacts() + ContactsCreateResponse contact = client.contacts() .create(CreateContactRequest.of(CreateContactRequest.WithExternalId.builder() .externalId(Utils.randomString()) .name("John Smith") .build())); + String contactId = contact.getId().orElseThrow(() -> new RuntimeException("Contact ID is required")); Message conversationMessage = client.conversations() .create(CreateConversationRequest.builder() .from(CreateConversationRequest.builder() .from(CreateConversationRequest.From.builder() .type(CreateConversationRequest.From.Type.USER) - .id(contact.getId()) + .id(contactId) .build()) .body("Raz-dwa-try kalyna, czorniawaja diwczyna") .build()) @@ -221,13 +228,15 @@ public void testTagConversation() { Conversation conversation = client.conversations() .find(FindConversationRequest.builder() - .conversationId(conversationMessage.getConversationId()) + .conversationId(conversationMessage.getConversationId() + .orElseThrow(() -> new RuntimeException("Conversation ID is required"))) .build()); + String conversationId = conversation.getId().orElseThrow(() -> new RuntimeException("Conversation ID is required")); // act Tag response = client.tags() .tagConversation(TagConversationRequest.builder() - .conversationId(conversation.getId()) + .conversationId(conversationId) .tagId(tag.getId()) .adminId(adminId) .build()); @@ -239,7 +248,7 @@ public void testTagConversation() { try { client.tags() .untagConversation(UntagConversationRequest.builder() - .conversationId(conversation.getId()) + .conversationId(conversationId) .tagId(tag.getId()) .adminId(adminId) .build()); @@ -250,7 +259,7 @@ public void testTagConversation() { try { client.contacts() .delete(DeleteContactRequest.builder() - .contactId(contact.getId()) + .contactId(contactId) .build()); } catch (Exception e) { throw new RuntimeException("Failed to delete contact.", e); diff --git a/src/test/java/com/intercom/api/integration/TeamsTest.java b/src/test/java/com/intercom/api/integration/TeamsTest.java index 12e1df6..ee50dcf 100644 --- a/src/test/java/com/intercom/api/integration/TeamsTest.java +++ b/src/test/java/com/intercom/api/integration/TeamsTest.java @@ -18,7 +18,11 @@ public class TeamsTest { public void before() { // arrange client = TestClientFactory.create(); - teamId = client.teams().list().getTeams().get(0).getId(); + teamId = client.teams().list().getTeams() + .orElseThrow(() -> new RuntimeException("Teams list is required")) + .get(0) + .getId() + .orElseThrow(() -> new RuntimeException("Team ID is required")); } @Test diff --git a/src/test/java/com/intercom/api/integration/VisitorsTest.java b/src/test/java/com/intercom/api/integration/VisitorsTest.java index a394035..f96b587 100644 --- a/src/test/java/com/intercom/api/integration/VisitorsTest.java +++ b/src/test/java/com/intercom/api/integration/VisitorsTest.java @@ -30,7 +30,8 @@ public void before() { public void testFindById() { // act Visitor response = client.visitors() - .find(FindVisitorRequest.builder().userId(VISITOR_ID).build()); + .find(FindVisitorRequest.builder().userId(VISITOR_ID).build()) + .orElseThrow(() -> new RuntimeException("Visitor not found")); // assert Assertions.assertNotNull(response); @@ -40,7 +41,8 @@ public void testFindById() { public void testFindByUserId() { // act Visitor response = client.visitors() - .find(FindVisitorRequest.builder().userId(USER_ID).build()); + .find(FindVisitorRequest.builder().userId(USER_ID).build()) + .orElseThrow(() -> new RuntimeException("Visitor not found")); // assert Assertions.assertNotNull(response); @@ -53,7 +55,8 @@ public void testUpdate() { .update(UpdateVisitorRequest.of(UpdateVisitorRequest.WithUserId.builder() .userId(USER_ID) .name("Winston Smith") - .build())); + .build())) + .orElseThrow(() -> new RuntimeException("Visitor not found")); // assert Assertions.assertNotNull(response); diff --git a/src/test/java/com/intercom/api/utils/TestClientFactory.java b/src/test/java/com/intercom/api/utils/TestClientFactory.java index bffb861..11edd37 100644 --- a/src/test/java/com/intercom/api/utils/TestClientFactory.java +++ b/src/test/java/com/intercom/api/utils/TestClientFactory.java @@ -1,6 +1,9 @@ package com.intercom.api.utils; import com.intercom.api.Intercom; +import com.intercom.api.core.ApiVersion; +import com.intercom.api.core.ClientOptions; +import com.intercom.api.core.Environment; public class TestClientFactory { public static Intercom create() { @@ -12,4 +15,18 @@ public static Intercom create() { return Intercom.builder().build(); } + + public static Intercom create(ApiVersion apiVersion) { + String token = System.getenv("INTERCOM_API_KEY"); + + if (token == null || token.isEmpty()) { + throw new IllegalArgumentException("Please provide an API key to run tests"); + } + + return new Intercom(ClientOptions.builder() + .version(apiVersion) + .environment(Environment.US_PRODUCTION) + .addHeader("Authorization", "Bearer " + token) + .build()); + } }