diff --git a/config/findbugs/excludeFilter.xml b/config/findbugs/excludeFilter.xml index cfcbf506f..c70cca556 100644 --- a/config/findbugs/excludeFilter.xml +++ b/config/findbugs/excludeFilter.xml @@ -25,6 +25,16 @@ + + + + + + + + + + diff --git a/src/integrationTest/java/com/pubnub/api/integration/objects/ObjectsApiBaseIT.java b/src/integrationTest/java/com/pubnub/api/integration/objects/ObjectsApiBaseIT.java index bce7df75d..79c8b4a89 100644 --- a/src/integrationTest/java/com/pubnub/api/integration/objects/ObjectsApiBaseIT.java +++ b/src/integrationTest/java/com/pubnub/api/integration/objects/ObjectsApiBaseIT.java @@ -6,8 +6,12 @@ import com.pubnub.api.enums.PNLogVerbosity; import com.pubnub.api.integration.util.ITTestConfig; import org.aeonbits.owner.ConfigFactory; +import org.apache.commons.lang3.RandomStringUtils; import org.junit.Before; +import java.util.HashMap; +import java.util.Map; + import static org.hamcrest.Matchers.isEmptyOrNullString; import static org.hamcrest.Matchers.not; import static org.junit.Assume.assumeThat; @@ -15,6 +19,8 @@ public abstract class ObjectsApiBaseIT { //See README.md in integrationTest directory for more info on running integration tests private ITTestConfig itTestConfig = ConfigFactory.create(ITTestConfig.class, System.getenv()); + public static final String STATUS_ACTIVE = "Active"; + public static final String TYPE_HUMAN = "Human"; protected final PubNub pubNubUnderTest = pubNub(); @@ -35,4 +41,39 @@ private PubNub pubNub() { public void assumeTestsAreConfiguredProperly() { assumeThat("Subscription key must be set in test.properties", itTestConfig.subscribeKey(), not(isEmptyOrNullString())); } + + protected String randomName() { + return RandomStringUtils.randomAlphabetic(5, 10) + " " + RandomStringUtils.randomAlphabetic(5, 10); + } + + protected Map customUserObject() { + return getCustomObject(); + } + + protected Map customSpaceObject() { + return getCustomObject(); + } + + private Map getCustomObject(){ + final Map customMap = new HashMap<>(); + customMap.putIfAbsent("param1", "val1"); + customMap.putIfAbsent("param2", "val2"); + return customMap; + } + + protected Map updatedCustomUserObject() { + return updatedCustomObject(); + } + + protected Map updatedCustomSpaceObject() { + return updatedCustomObject(); + } + + private Map updatedCustomObject() { + final Map customMap = new HashMap<>(); + customMap.putIfAbsent("param1", "val1_updated"); + customMap.putIfAbsent("param2", "val2_updated"); + customMap.putIfAbsent("param3", "added"); + return customMap; + } } diff --git a/src/integrationTest/java/com/pubnub/api/integration/objects/uuid/UUIDMetadataIT.java b/src/integrationTest/java/com/pubnub/api/integration/objects/uuid/UUIDMetadataIT.java index 56eb5b4ba..953bf9bc2 100644 --- a/src/integrationTest/java/com/pubnub/api/integration/objects/uuid/UUIDMetadataIT.java +++ b/src/integrationTest/java/com/pubnub/api/integration/objects/uuid/UUIDMetadataIT.java @@ -194,10 +194,6 @@ private String randomEmail() { return RandomStringUtils.randomAlphabetic(6) + "@example.com"; } - private String randomName() { - return RandomStringUtils.randomAlphabetic(5, 10) + " " + RandomStringUtils.randomAlphabetic(5, 10); - } - private String randomProfileUrl() { return "http://" + RandomStringUtils.randomAlphabetic(5, 15) + ".com"; } diff --git a/src/integrationTest/java/com/pubnub/api/integration/objects_vsp/space/SpaceIT.java b/src/integrationTest/java/com/pubnub/api/integration/objects_vsp/space/SpaceIT.java new file mode 100644 index 000000000..842371757 --- /dev/null +++ b/src/integrationTest/java/com/pubnub/api/integration/objects_vsp/space/SpaceIT.java @@ -0,0 +1,294 @@ +package com.pubnub.api.integration.objects_vsp.space; + +import com.pubnub.api.PubNubException; +import com.pubnub.api.SpaceId; +import com.pubnub.api.integration.objects.ObjectsApiBaseIT; +import com.pubnub.api.models.consumer.objects_vsp.space.RemoveSpaceResult; +import com.pubnub.api.models.consumer.objects_vsp.space.Space; +import org.apache.commons.lang3.RandomStringUtils; +import org.apache.http.HttpStatus; +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + +import java.util.Map; +import java.util.Random; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; + +public class SpaceIT extends ObjectsApiBaseIT { + + private final String randomSpaceIdValue = getRandomSpaceIdValue(); + private SpaceId randomSpaceId; + private final String randomName = randomName(); + private final String randomDescription = randomDescription(); + + @Before + public void setUp() throws Exception { + randomSpaceId = new SpaceId(randomSpaceIdValue); + } + + @Test + public void createUserHappyPath() throws PubNubException { + //given + + //when + Space space = pubNubUnderTest.createSpace(randomSpaceId) + .name(randomName) + .description(randomDescription) + .custom(customSpaceObject()) + .includeCustom(true) + .status(STATUS_ACTIVE) + .type(TYPE_HUMAN) + .sync(); + + //then + assertNotNull(space); + assertEquals(randomSpaceId.getValue(), space.getId().getValue()); + assertEquals(randomName, space.getName()); + assertEquals(randomDescription, space.getDescription()); + assertEquals("val1", space.getCustom().get("param1").toString()); + assertEquals("val2", space.getCustom().get("param2").toString()); + assertEquals(STATUS_ACTIVE, space.getStatus()); + assertEquals(TYPE_HUMAN, space.getType()); +// assertNotNull(space.getUpdated()); waiting on https://pubnub.atlassian.net/browse/ENG-4203 +// assertNotNull(space.getETag()); + } + + + @Test(expected = PubNubException.class) + public void should_throw_exception_when_space_with_the_spaceId_exists() throws PubNubException { + //given + pubNubUnderTest.createSpace(randomSpaceId) + .name(randomName) + .description(randomDescription) + .custom(customSpaceObject()) + .includeCustom(true) + .status(STATUS_ACTIVE) + .type(TYPE_HUMAN) + .sync(); + + //when + pubNubUnderTest.createSpace(randomSpaceId) + .name(randomName) + .description(randomDescription) + .custom(customSpaceObject()) + .includeCustom(true) + .status(STATUS_ACTIVE) + .type(TYPE_HUMAN) + .sync(); + + //then + } + + @Test + public void removeSpaceHappyPath() throws PubNubException { + //given + pubNubUnderTest.createSpace(randomSpaceId) + .name(randomName) + .description(randomDescription) + .custom(customSpaceObject()) + .includeCustom(true) + .status(STATUS_ACTIVE) + .type(TYPE_HUMAN) + .sync(); + + //when + RemoveSpaceResult removeSpaceResult = pubNubUnderTest.removeSpace(randomSpaceId).sync(); + + //then + assertEquals(HttpStatus.SC_OK, removeSpaceResult.getStatus()); + } + + @Test + public void fetchSpaceHappyPath() throws PubNubException { + //given + pubNubUnderTest.createSpace(randomSpaceId) + .name(randomName) + .description(randomDescription) + .custom(customSpaceObject()) + .includeCustom(true) + .status(STATUS_ACTIVE) + .type(TYPE_HUMAN) + .sync(); + + //when + Space space = pubNubUnderTest.fetchSpace(randomSpaceId) + .sync(); + + //then + assertNotNull(space); + assertEquals(randomSpaceIdValue, space.getId().getValue()); + assertEquals(randomName, space.getName()); + assertEquals(randomDescription, space.getDescription()); + assertNotNull(space.getCustom()); + assertEquals(STATUS_ACTIVE, space.getStatus()); + assertEquals(TYPE_HUMAN, space.getType()); +// assertNotNull(space.getUpdated()); +// assertNotNull(space.getETag()); + } + + @Test + public void updateSpace_passing_full_object_happyPath() throws PubNubException { + //given + String updatedName = "updatedName" + randomName(); + String updatedDescription = "updatedDescription" + randomName(); + Map updateCustom = updatedCustomSpaceObject(); + String updatedStatus = "updatedStatus" + STATUS_ACTIVE; + String updatedType = "updatedType" + TYPE_HUMAN; + + pubNubUnderTest.createSpace(randomSpaceId) + .name(randomName) + .description(randomDescription) + .custom(customSpaceObject()) + .includeCustom(true) + .status(STATUS_ACTIVE) + .type(TYPE_HUMAN) + .sync(); + + //when + Space updatedSpace = pubNubUnderTest.updateSpace(randomSpaceId) + .name(updatedName) + .description(updatedDescription) + .custom(updateCustom) + .status(updatedStatus) + .type(updatedType) + .sync(); + + //then + assertNotNull(updatedSpace); + assertEquals(randomSpaceIdValue, updatedSpace.getId().getValue()); + assertEquals(updatedName, updatedSpace.getName()); + assertEquals(updatedDescription, updatedSpace.getDescription()); + assertEquals(updatedDescription, updatedSpace.getDescription()); + assertEquals("val1_updated", updatedSpace.getCustom().get("param1").toString()); + assertEquals("val2_updated", updatedSpace.getCustom().get("param2").toString()); + assertEquals("added", updatedSpace.getCustom().get("param3").toString()); + assertEquals(updatedStatus, updatedSpace.getStatus()); + assertEquals(updatedType, updatedSpace.getType()); +// assertNotNull(updatedSpace.getUpdated()); +// assertNotNull(updatedSpace.getETag()); + + Space space = pubNubUnderTest.fetchSpace(randomSpaceId) + .sync(); + + assertNotNull(space); + assertEquals(randomSpaceIdValue, space.getId().getValue()); + assertEquals(updatedName, space.getName()); + assertEquals(updatedDescription, space.getDescription()); + assertNotNull(space.getCustom()); + assertEquals(updatedStatus, space.getStatus()); + assertEquals(updatedType, space.getType()); +// assertNotNull(space.getUpdated()); +// assertNotNull(space.getETag()); + } + + @Test(expected = PubNubException.class) + public void updateSpace_should_throw_exception_when_updating_space_that_does_not_exist() throws PubNubException { + //given + String updatedName = "updatedName" + randomName(); + + //when + pubNubUnderTest.updateSpace(randomSpaceId) + .name(updatedName) + .sync(); + + //then + + } + + @Test + public void upsertSpaceHappyPath_newSpaceCreated() throws PubNubException { + //given + + //when + Space space = pubNubUnderTest.upsertSpace(randomSpaceId) + .name(randomName) + .description(randomDescription) + .custom(customSpaceObject()) + .includeCustom(true) + .status(STATUS_ACTIVE) + .type(TYPE_HUMAN) + .sync(); + + //then + assertNotNull(space); + assertEquals(randomSpaceIdValue, space.getId().getValue()); + assertEquals(randomName, space.getName()); + assertEquals(randomDescription, space.getDescription()); + assertNotNull(space.getCustom()); + assertEquals(STATUS_ACTIVE, space.getStatus()); + assertEquals(TYPE_HUMAN, space.getType()); +// assertNotNull(space.getUpdated()); +// assertNotNull(space.getETag()); + } + + @Test + public void upsertSpaceHappyPath_existingSpaceUpdated() throws PubNubException { + //given + String updatedName = "updatedName" + randomName(); + String updatedDescription = "updatedDescription" + randomName(); + Map updateCustom = updatedCustomSpaceObject(); + String updatedStatus = "updatedStatus" + STATUS_ACTIVE; + String updatedType = "updatedType" + TYPE_HUMAN; + + pubNubUnderTest.createSpace(randomSpaceId) + .name(randomName) + .description(randomDescription) + .custom(customSpaceObject()) + .includeCustom(true) + .status(STATUS_ACTIVE) + .type(TYPE_HUMAN) + .sync(); + + //when + Space spaceAfterUpsert = pubNubUnderTest.upsertSpace(randomSpaceId) + .name(updatedName) + .description(updatedDescription) + .custom(updateCustom) + .status(updatedStatus) + .type(updatedType) + .sync(); + + //then + assertNotNull(spaceAfterUpsert); + assertEquals(randomSpaceIdValue, spaceAfterUpsert.getId().getValue()); + assertEquals(updatedName, spaceAfterUpsert.getName()); + assertEquals(updatedDescription, spaceAfterUpsert.getDescription()); + assertEquals(updatedDescription, spaceAfterUpsert.getDescription()); + assertEquals("val1_updated", spaceAfterUpsert.getCustom().get("param1").toString()); + assertEquals("val2_updated", spaceAfterUpsert.getCustom().get("param2").toString()); + assertEquals("added", spaceAfterUpsert.getCustom().get("param3").toString()); + assertEquals(updatedStatus, spaceAfterUpsert.getStatus()); + assertEquals(updatedType, spaceAfterUpsert.getType()); +// assertNotNull(spaceAfterUpsert.getUpdated()); +// assertNotNull(spaceAfterUpsert.getETag()); + + Space space = pubNubUnderTest.fetchSpace(randomSpaceId) + .sync(); + + assertNotNull(space); + assertEquals(randomSpaceIdValue, space.getId().getValue()); + assertEquals(updatedName, space.getName()); + assertEquals(updatedDescription, space.getDescription()); + assertNotNull(space.getCustom()); + assertEquals(updatedStatus, space.getStatus()); + assertEquals(updatedType, space.getType()); +// assertNotNull(space.getUpdated()); +// assertNotNull(space.getETag()); + } + + @After + public void tearDown() throws Exception { + pubNubUnderTest.removeSpace(randomSpaceId).sync(); + } + + private String getRandomSpaceIdValue() { + return "spaceId" + new Random().nextInt(100000); + } + + private static String randomDescription() { + return RandomStringUtils.randomAlphabetic(50, 160); + } +} diff --git a/src/integrationTest/java/com/pubnub/api/integration/objects_vsp/user/UserIT.java b/src/integrationTest/java/com/pubnub/api/integration/objects_vsp/user/UserIT.java new file mode 100644 index 000000000..bdc56706b --- /dev/null +++ b/src/integrationTest/java/com/pubnub/api/integration/objects_vsp/user/UserIT.java @@ -0,0 +1,327 @@ +package com.pubnub.api.integration.objects_vsp.user; + +import com.pubnub.api.PubNubException; +import com.pubnub.api.UserId; +import com.pubnub.api.endpoints.objects_vsp.user.FetchUser; +import com.pubnub.api.integration.objects.ObjectsApiBaseIT; +import com.pubnub.api.models.consumer.objects_vsp.user.RemoveUserResult; +import com.pubnub.api.models.consumer.objects_vsp.user.User; +import org.apache.commons.lang3.RandomStringUtils; +import org.apache.http.HttpStatus; +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + +import java.util.Map; +import java.util.Random; +import java.util.UUID; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertThrows; +import static org.junit.Assert.assertTrue; + +public class UserIT extends ObjectsApiBaseIT { + private final String randomUserIdValue = getRandomUserIdValue(); + private UserId randomUserId; + private final String randomName = randomName(); + private final String randomEmail = randomEmail(); + private final String randomProfileUrl = randomProfileUrl(); + private final String randomExternalId = randomExternalId(); + + @Before + public void setUp() throws Exception { + randomUserId = new UserId(randomUserIdValue); + } + + @Test + public void createUserHappyPath() throws PubNubException { + //given + + //when + final User user = pubNubUnderTest.createUser() + .userId(randomUserId) + .name(randomName) + .email(randomEmail) + .profileUrl(randomProfileUrl) + .externalId(randomExternalId) + .custom(customUserObject()) + .includeCustom(true) + .status(STATUS_ACTIVE) + .type(TYPE_HUMAN) + .sync(); + + //then + assertNotNull(user); + assertEquals(randomUserIdValue, user.getId().getValue()); + assertEquals(randomName, user.getName()); + assertEquals(randomEmail, user.getEmail()); + assertEquals(randomProfileUrl, user.getProfileUrl()); + assertEquals(randomExternalId, user.getExternalId()); + assertNotNull(user.getCustom()); + assertEquals(STATUS_ACTIVE, user.getStatus()); + assertEquals(TYPE_HUMAN, user.getType()); +// assertNotNull(user.getUpdated()); +// assertNotNull(user.getETag()); + } + + @Test + public void fetchUserHappyPath() throws PubNubException { + //given + pubNubUnderTest.createUser() + .userId(randomUserId) + .name(randomName) + .email(randomEmail) + .profileUrl(randomProfileUrl) + .externalId(randomExternalId) + .custom(customUserObject()) + .includeCustom(true) + .status(STATUS_ACTIVE) + .type(TYPE_HUMAN) + .sync(); + + //when + User user = pubNubUnderTest.fetchUser() + .userId(randomUserId) + .includeCustom(true) + .sync(); + + assertNotNull(user); + assertEquals(randomUserIdValue, user.getId().getValue()); + assertEquals(randomName, user.getName()); + assertEquals(randomEmail, user.getEmail()); + assertEquals(randomProfileUrl, user.getProfileUrl()); + assertEquals(randomExternalId, user.getExternalId()); + assertNotNull(user.getCustom()); + assertEquals(STATUS_ACTIVE, user.getStatus()); + assertEquals(TYPE_HUMAN, user.getType()); +// assertNotNull(user.getUpdated()); +// assertNotNull(user.getETag()); + } + + + @Test + public void removeUserHappyPath() throws PubNubException { + // given + pubNubUnderTest.createUser() + .userId(randomUserId) + .name(randomName) + .email(randomEmail) + .profileUrl(randomProfileUrl) + .externalId(randomExternalId) + .custom(customUserObject()) + .includeCustom(true) + .status(STATUS_ACTIVE) + .type(TYPE_HUMAN) + .sync(); + + //when + RemoveUserResult removeUserResult = pubNubUnderTest.removeUser() + .userId(randomUserId) + .sync(); + + //then + assertNotNull(removeUserResult); + assertEquals(HttpStatus.SC_OK, removeUserResult.getStatus()); + + //verify if user not exist + FetchUser fetchUser = pubNubUnderTest.fetchUser() + .userId(randomUserId) + .includeCustom(true); + + PubNubException exception = assertThrows(PubNubException.class, () -> fetchUser.sync()); + + assertTrue(exception.getMessage().contains("Requested resource not found")); + } + + @Test + public void updateUser_passing_full_object_happyPath() throws PubNubException { + // given + String updatedName = "updatedName" + randomName(); + String updatedEmail = "updatedEmail" + randomEmail(); + String updatedProfileUrl = "updatedProfileUrl" + randomProfileUrl(); + String updatedExternalId = "updatedExternalId" + randomExternalId(); + Map updatedCustom = updatedCustomUserObject(); + String updatedStatus = "updatedStatus" + STATUS_ACTIVE; + String updatedType = "updatedType" + TYPE_HUMAN; + + pubNubUnderTest.createUser() + .userId(randomUserId) + .name(randomName) + .email(randomEmail) + .profileUrl(randomProfileUrl) + .externalId(randomExternalId) + .custom(customUserObject()) + .includeCustom(true) + .status(STATUS_ACTIVE) + .type(TYPE_HUMAN) + .sync(); + + // when + User userAfterUpdate = pubNubUnderTest.updateUser() + .userId(randomUserId) + .name(updatedName) + .email(updatedEmail) + .profileUrl(updatedProfileUrl) + .externalId(updatedExternalId) + .custom(updatedCustom) + .includeCustom(true) + .status(updatedStatus) + .type(updatedType) + .sync(); + + // then + assertNotNull(userAfterUpdate); + assertEquals(randomUserIdValue, userAfterUpdate.getId().getValue()); + assertEquals(updatedName, userAfterUpdate.getName()); + assertEquals(updatedEmail, userAfterUpdate.getEmail()); + assertEquals(updatedProfileUrl, userAfterUpdate.getProfileUrl()); + assertEquals(updatedExternalId, userAfterUpdate.getExternalId()); + assertEquals("val1_updated", userAfterUpdate.getCustom().get("param1")); + assertEquals("val2_updated", userAfterUpdate.getCustom().get("param2").toString()); + assertEquals("added", userAfterUpdate.getCustom().get("param3").toString()); + assertEquals(updatedStatus, userAfterUpdate.getStatus()); + assertEquals(updatedType, userAfterUpdate.getType()); +// assertNotNull(userAfterUpdate.getUpdated()); //waiting for https://pubnub.atlassian.net/browse/ENG-4203 +// assertNotNull(userAfterUpdate.getETag()); + + User user = pubNubUnderTest.fetchUser() + .userId(randomUserId) + .includeCustom(true) + .sync(); + + assertNotNull(user); + assertEquals(randomUserIdValue, user.getId().getValue()); + assertEquals(updatedName, user.getName()); + assertEquals(updatedEmail, user.getEmail()); + assertEquals(updatedProfileUrl, user.getProfileUrl()); + assertEquals(updatedExternalId, user.getExternalId()); + assertNotNull(user.getCustom()); + assertEquals(updatedStatus, user.getStatus()); + assertEquals(updatedType, user.getType()); +// assertNotNull(user.getUpdated()); waiting on https://pubnub.atlassian.net/browse/ENG-4203 +// assertNotNull(user.getETag()); + } + + @Test(expected = PubNubException.class) + public void updateUser_should_throw_exception_when_updating_user_that_does_not_exist() throws PubNubException { + // given + String updatedName = "updatedName" + randomName(); + + // when + User user = pubNubUnderTest.updateUser() + .userId(randomUserId) + .name(updatedName) + .sync(); + + //then + assertEquals(randomUserIdValue, user.getId()); + assertEquals(updatedName, user.getName()); + } + + @Test + public void upsertUserHappyPath_newUserCreated() throws PubNubException { + //given + + //when + User user = pubNubUnderTest.upsertUser() + .userId(randomUserId) + .name(randomName) + .email(randomEmail) + .profileUrl(randomProfileUrl) + .externalId(randomExternalId) + .custom(customUserObject()) + .includeCustom(true) + .status(STATUS_ACTIVE) + .type(TYPE_HUMAN) + .sync(); + + //then + assertNotNull(user); + assertEquals(randomUserIdValue, user.getId().getValue()); + assertEquals(randomName, user.getName()); + assertEquals(randomEmail, user.getEmail()); + assertEquals(randomProfileUrl, user.getProfileUrl()); + assertEquals(randomExternalId, user.getExternalId()); + assertNotNull(user.getCustom()); + assertEquals(STATUS_ACTIVE, user.getStatus()); + assertEquals(TYPE_HUMAN, user.getType()); +// assertNotNull(user.getUpdated()); +// assertNotNull(user.getETag()); + } + + @Test + public void upsertUserHappyPath_existingUserUpdated() throws PubNubException { + //given + String updatedName = "updatedName" + randomName(); + String updatedEmail = "updatedEmail" + randomEmail(); + String updatedProfileUrl = "updatedProfileUrl" + randomProfileUrl(); + String updatedExternalId = "updatedExternalId" + randomExternalId(); + Map updateCustom = updatedCustomUserObject(); + String updatedStatus = "updatedStatus" + STATUS_ACTIVE; + String updatedType = "updatedType" + TYPE_HUMAN; + + pubNubUnderTest.createUser() + .userId(randomUserId) + .name(randomName) + .email(randomEmail) + .profileUrl(randomProfileUrl) + .externalId(randomExternalId) + .custom(customUserObject()) + .includeCustom(true) + .status(STATUS_ACTIVE) + .type(TYPE_HUMAN) + .sync(); + + //when + User user = pubNubUnderTest.upsertUser() + .userId(randomUserId) + .name(updatedName) + .email(updatedEmail) + .profileUrl(updatedProfileUrl) + .externalId(updatedExternalId) + .custom(updateCustom) + .includeCustom(true) + .status(updatedStatus) + .type(updatedType) + .sync(); + + //then + assertNotNull(user); + assertEquals(randomUserIdValue, user.getId().getValue()); + assertEquals(updatedName, user.getName()); + assertEquals(updatedEmail, user.getEmail()); + assertEquals(updatedProfileUrl, user.getProfileUrl()); + assertEquals(updatedExternalId, user.getExternalId()); + assertEquals("val1_updated", user.getCustom().get("param1").toString()); + assertEquals("val2_updated", user.getCustom().get("param2").toString()); + assertEquals("added", user.getCustom().get("param3").toString()); + assertEquals(updatedStatus, user.getStatus()); + assertEquals(updatedType, user.getType()); +// assertNotNull(user.getUpdated()); +// assertNotNull(user.getETag()); + } + + @After + public void tearDown() throws Exception { + pubNubUnderTest.removeUser() + .userId(randomUserId) + .sync(); + } + + private String getRandomUserIdValue() { + return "userId" + new Random().nextInt(100000); + } + + private String randomExternalId() { + return UUID.randomUUID().toString(); + } + + private String randomEmail() { + return RandomStringUtils.randomAlphabetic(6) + "@example.com"; + } + + private String randomProfileUrl() { + return "http://" + RandomStringUtils.randomAlphabetic(5, 15) + ".com"; + } +} diff --git a/src/main/java/com/pubnub/api/PubNub.java b/src/main/java/com/pubnub/api/PubNub.java index cb23884aa..706efb632 100644 --- a/src/main/java/com/pubnub/api/PubNub.java +++ b/src/main/java/com/pubnub/api/PubNub.java @@ -44,6 +44,16 @@ import com.pubnub.api.endpoints.objects_api.uuid.GetUUIDMetadata; import com.pubnub.api.endpoints.objects_api.uuid.RemoveUUIDMetadata; import com.pubnub.api.endpoints.objects_api.uuid.SetUUIDMetadata; +import com.pubnub.api.endpoints.objects_vsp.space.CreateSpace; +import com.pubnub.api.endpoints.objects_vsp.space.FetchSpace; +import com.pubnub.api.endpoints.objects_vsp.space.RemoveSpace; +import com.pubnub.api.endpoints.objects_vsp.space.UpdateSpace; +import com.pubnub.api.endpoints.objects_vsp.space.UpsertSpace; +import com.pubnub.api.endpoints.objects_vsp.user.CreateUser; +import com.pubnub.api.endpoints.objects_vsp.user.FetchUser; +import com.pubnub.api.endpoints.objects_vsp.user.RemoveUser; +import com.pubnub.api.endpoints.objects_vsp.user.UpdateUser; +import com.pubnub.api.endpoints.objects_vsp.user.UpsertUser; import com.pubnub.api.endpoints.presence.GetState; import com.pubnub.api.endpoints.presence.HereNow; import com.pubnub.api.endpoints.presence.SetState; @@ -303,6 +313,34 @@ public DeleteChannelGroup deleteChannelGroup() { // Start Objects API + @NotNull + public CreateUser createUser() { + return CreateUser.create(this, this.telemetryManager, this.retrofitManager, this.tokenManager); + } + + @NotNull + public FetchUser fetchUser() { + return FetchUser.create(this, this.telemetryManager, this.retrofitManager, this.tokenManager); + } + + @NotNull + public UpdateUser updateUser() { + return UpdateUser.create(this, this.telemetryManager, this.retrofitManager, this.tokenManager); + } + + @NotNull + public UpsertUser upsertUser() { + return UpsertUser.create(this, this.telemetryManager, this.retrofitManager, this.tokenManager); + } + + @NotNull + public RemoveUser removeUser() { + return new RemoveUser(this, this.telemetryManager, this.retrofitManager, this.tokenManager); + } + + /** + * @deprecated Use {@link #createUser()} or {@link #updateUser()} or {@link #upsertUser()} instead. + */ public SetUUIDMetadata setUUIDMetadata() { return SetUUIDMetadata.create(this, this.telemetryManager, this.retrofitManager, this.tokenManager); } @@ -312,16 +350,50 @@ public GetAllUUIDMetadata getAllUUIDMetadata() { return GetAllUUIDMetadata.create(this, this.telemetryManager, this.retrofitManager, this.tokenManager); } + /** + * @deprecated Use {@link #fetchUser()} instead. + */ @NotNull public GetUUIDMetadata getUUIDMetadata() { return GetUUIDMetadata.create(this, this.telemetryManager, this.retrofitManager, this.tokenManager); } + /** + * @deprecated Use {@link #removeUser()} instead. + */ @NotNull public RemoveUUIDMetadata removeUUIDMetadata() { return new RemoveUUIDMetadata(this, this.telemetryManager, this.retrofitManager, this.tokenManager); } + @NotNull + public CreateSpace createSpace(@NotNull SpaceId spaceId) { + return CreateSpace.create(spaceId, this, this.telemetryManager, this.retrofitManager, this.tokenManager); + } + + @NotNull + public FetchSpace fetchSpace(@NotNull SpaceId spaceId) { + return FetchSpace.create(spaceId, this, this.telemetryManager, this.retrofitManager, this.tokenManager); + } + + @NotNull + public UpdateSpace updateSpace(@NotNull SpaceId spaceId) { + return UpdateSpace.create(spaceId, this, this.telemetryManager, this.retrofitManager, this.tokenManager); + } + + @NotNull + public UpsertSpace upsertSpace(@NotNull SpaceId spaceId) { + return UpsertSpace.create(spaceId, this, this.telemetryManager, this.retrofitManager, this.tokenManager); + } + + @NotNull + public RemoveSpace removeSpace(@NotNull SpaceId spaceId) { + return new RemoveSpace(spaceId, this, this.telemetryManager, this.retrofitManager, this.tokenManager); + } + + /** + * @deprecated Use {@link #createSpace(SpaceId)} or {@link #updateSpace(SpaceId)} or {@link #upsertSpace(SpaceId)} instead. + */ public SetChannelMetadata.Builder setChannelMetadata() { return SetChannelMetadata.builder(this, this.telemetryManager, this.retrofitManager, this.tokenManager); } @@ -331,11 +403,17 @@ public GetAllChannelsMetadata getAllChannelsMetadata() { return GetAllChannelsMetadata.create(this, this.telemetryManager, this.retrofitManager, this.tokenManager); } + /** + * @deprecated Use {@link #fetchSpace(SpaceId)} instead. + */ @NotNull public GetChannelMetadata.Builder getChannelMetadata() { return GetChannelMetadata.builder(this, this.telemetryManager, this.retrofitManager, this.tokenManager); } + /** + * @deprecated Use {@link #removeSpace(SpaceId)} instead. + */ public RemoveChannelMetadata.Builder removeChannelMetadata() { return RemoveChannelMetadata.builder(this, this.telemetryManager, this.retrofitManager, this.tokenManager); } diff --git a/src/main/java/com/pubnub/api/endpoints/objects_api/utils/Include.java b/src/main/java/com/pubnub/api/endpoints/objects_api/utils/Include.java index 2c7104193..331405523 100644 --- a/src/main/java/com/pubnub/api/endpoints/objects_api/utils/Include.java +++ b/src/main/java/com/pubnub/api/endpoints/objects_api/utils/Include.java @@ -1,6 +1,7 @@ package com.pubnub.api.endpoints.objects_api.utils; import com.pubnub.api.endpoints.Endpoint; +import com.pubnub.api.endpoints.remoteaction.RemoteAction; import java.util.ArrayList; import java.util.Collection; @@ -17,11 +18,11 @@ public class Include implements ParameterEnricher { static final String INCLUDE_UUID_PARAM_VALUE = "uuid"; static final String INCLUDE_UUID_CUSTOM_PARAM_VALUE = "uuid.custom"; - public interface CustomIncludeAware> { + public interface CustomIncludeAware> { T includeCustom(boolean includeCustom); } - public interface HavingCustomInclude> + public interface HavingCustomInclude> extends CustomIncludeAware, HavingCompositeParameterEnricher { @Override default T includeCustom(boolean includeCustom) { diff --git a/src/main/java/com/pubnub/api/endpoints/objects_vsp/space/CreateSpace.java b/src/main/java/com/pubnub/api/endpoints/objects_vsp/space/CreateSpace.java new file mode 100644 index 000000000..db17d5c01 --- /dev/null +++ b/src/main/java/com/pubnub/api/endpoints/objects_vsp/space/CreateSpace.java @@ -0,0 +1,37 @@ +package com.pubnub.api.endpoints.objects_vsp.space; + +import com.pubnub.api.PubNub; +import com.pubnub.api.SpaceId; +import com.pubnub.api.endpoints.objects_api.CompositeParameterEnricher; +import com.pubnub.api.endpoints.objects_api.utils.Include.CustomIncludeAware; +import com.pubnub.api.endpoints.remoteaction.RemoteAction; +import com.pubnub.api.managers.RetrofitManager; +import com.pubnub.api.managers.TelemetryManager; +import com.pubnub.api.managers.token_manager.TokenManager; +import com.pubnub.api.models.consumer.objects_vsp.space.Space; + +import java.util.Map; + +public interface CreateSpace extends RemoteAction, CustomIncludeAware { + + static CreateSpace create( + final SpaceId spaceId, + final PubNub pubNub, + final TelemetryManager telemetryManager, + final RetrofitManager retrofitManager, + final TokenManager tokenManager) { + final CompositeParameterEnricher compositeParameterEnricher = CompositeParameterEnricher.createDefault(); + return new CreateSpaceCommand(spaceId, pubNub, telemetryManager, retrofitManager, tokenManager, compositeParameterEnricher); + } + + CreateSpace name(String name); + + CreateSpace description(String description); + + CreateSpace custom(Map custom); + + CreateSpace status(String status); + + CreateSpace type(String type); + +} diff --git a/src/main/java/com/pubnub/api/endpoints/objects_vsp/space/CreateSpaceCommand.java b/src/main/java/com/pubnub/api/endpoints/objects_vsp/space/CreateSpaceCommand.java new file mode 100644 index 000000000..52a372a06 --- /dev/null +++ b/src/main/java/com/pubnub/api/endpoints/objects_vsp/space/CreateSpaceCommand.java @@ -0,0 +1,83 @@ +package com.pubnub.api.endpoints.objects_vsp.space; + +import com.pubnub.api.PubNub; +import com.pubnub.api.PubNubException; +import com.pubnub.api.SpaceId; +import com.pubnub.api.builder.PubNubErrorBuilder; +import com.pubnub.api.endpoints.objects_api.CompositeParameterEnricher; +import com.pubnub.api.endpoints.objects_api.ObjectApiEndpoint; +import com.pubnub.api.endpoints.objects_api.utils.Include.HavingCustomInclude; +import com.pubnub.api.enums.PNOperationType; +import com.pubnub.api.managers.RetrofitManager; +import com.pubnub.api.managers.TelemetryManager; +import com.pubnub.api.managers.token_manager.TokenManager; +import com.pubnub.api.models.consumer.objects_vsp.space.Space; +import com.pubnub.api.models.server.objects_api.EntityEnvelope; +import com.pubnub.api.models.server.objects_vsp.space.CreateSpacePayload; +import lombok.Setter; +import lombok.experimental.Accessors; +import retrofit2.Call; +import retrofit2.Response; + +import java.util.HashMap; +import java.util.Map; + +@Accessors(chain = true, fluent = true) +final class CreateSpaceCommand extends ObjectApiEndpoint, Space> implements CreateSpace, HavingCustomInclude { + private final SpaceId spaceId; + @Setter + private String name; + @Setter + private String description; + @Setter + private Map custom; + @Setter + private String status; + @Setter + private String type; + + CreateSpaceCommand( + final SpaceId spaceId, + final PubNub pubNub, + final TelemetryManager telemetryManager, + final RetrofitManager retrofitManager, + final TokenManager tokenManager, + final CompositeParameterEnricher compositeParameterEnricher) { + super(pubNub, telemetryManager, retrofitManager, compositeParameterEnricher, tokenManager); + this.spaceId = spaceId; + } + + @Override + protected Call> executeCommand(Map effectiveParams) throws PubNubException { + //This is workaround to accept custom maps that are instances of anonymous classes not handled by gson + final HashMap customHashMap = new HashMap<>(); + if (custom != null) { + customHashMap.putAll(custom); + } + + final CreateSpacePayload createSpacePayload = new CreateSpacePayload(name, description, customHashMap, status, type); + String subscribeKey = getPubnub().getConfiguration().getSubscribeKey(); + return getRetrofit() + .getSpaceService() + .createSpace(subscribeKey, spaceId.getValue(), createSpacePayload, effectiveParams); + } + + @Override + public CompositeParameterEnricher getCompositeParameterEnricher() { + return super.getCompositeParameterEnricher(); + } + + @Override + protected Space createResponse(Response> input) throws PubNubException { + if (input.body() != null) { + return input.body().getData(); + } else { + throw PubNubException.builder().pubnubError(PubNubErrorBuilder.PNERROBJ_INTERNAL_ERROR).build(); + } + } + + @Override + protected PNOperationType getOperationType() { + return PNOperationType.PNCreateSpaceOperation; + } +} diff --git a/src/main/java/com/pubnub/api/endpoints/objects_vsp/space/FetchSpace.java b/src/main/java/com/pubnub/api/endpoints/objects_vsp/space/FetchSpace.java new file mode 100644 index 000000000..497fb9249 --- /dev/null +++ b/src/main/java/com/pubnub/api/endpoints/objects_vsp/space/FetchSpace.java @@ -0,0 +1,24 @@ +package com.pubnub.api.endpoints.objects_vsp.space; + +import com.pubnub.api.PubNub; +import com.pubnub.api.SpaceId; +import com.pubnub.api.endpoints.objects_api.CompositeParameterEnricher; +import com.pubnub.api.endpoints.objects_api.utils.Include.CustomIncludeAware; +import com.pubnub.api.endpoints.remoteaction.RemoteAction; +import com.pubnub.api.managers.RetrofitManager; +import com.pubnub.api.managers.TelemetryManager; +import com.pubnub.api.managers.token_manager.TokenManager; +import com.pubnub.api.models.consumer.objects_vsp.space.Space; + +public interface FetchSpace extends RemoteAction, CustomIncludeAware { + + static FetchSpace create( + final SpaceId spaceId, + final PubNub pubNub, + final TelemetryManager telemetryManager, + final RetrofitManager retrofitManager, + final TokenManager tokenManager) { + final CompositeParameterEnricher compositeParameterEnricher = CompositeParameterEnricher.createDefault(); + return new FetchSpaceCommand(spaceId, pubNub, telemetryManager, retrofitManager, tokenManager, compositeParameterEnricher); + } +} diff --git a/src/main/java/com/pubnub/api/endpoints/objects_vsp/space/FetchSpaceCommand.java b/src/main/java/com/pubnub/api/endpoints/objects_vsp/space/FetchSpaceCommand.java new file mode 100644 index 000000000..528987ea5 --- /dev/null +++ b/src/main/java/com/pubnub/api/endpoints/objects_vsp/space/FetchSpaceCommand.java @@ -0,0 +1,60 @@ +package com.pubnub.api.endpoints.objects_vsp.space; + +import com.pubnub.api.PubNub; +import com.pubnub.api.PubNubException; +import com.pubnub.api.SpaceId; +import com.pubnub.api.builder.PubNubErrorBuilder; +import com.pubnub.api.endpoints.objects_api.CompositeParameterEnricher; +import com.pubnub.api.endpoints.objects_api.ObjectApiEndpoint; +import com.pubnub.api.endpoints.objects_api.utils.Include.HavingCustomInclude; +import com.pubnub.api.enums.PNOperationType; +import com.pubnub.api.managers.RetrofitManager; +import com.pubnub.api.managers.TelemetryManager; +import com.pubnub.api.managers.token_manager.TokenManager; +import com.pubnub.api.models.consumer.objects_vsp.space.Space; +import com.pubnub.api.models.server.objects_api.EntityEnvelope; +import retrofit2.Call; +import retrofit2.Response; + +import java.util.Map; + +final class FetchSpaceCommand extends ObjectApiEndpoint, Space> implements FetchSpace, HavingCustomInclude { + private SpaceId spaceId; + + FetchSpaceCommand( + final SpaceId spaceId, + final PubNub pubNub, + final TelemetryManager telemetryManager, + final RetrofitManager retrofitManager, + final TokenManager tokenManager, + final CompositeParameterEnricher compositeParameterEnricher) { + super(pubNub, telemetryManager, retrofitManager, compositeParameterEnricher, tokenManager); + this.spaceId = spaceId; + } + + @Override + protected Call> executeCommand(Map effectiveParams) throws PubNubException { + return getRetrofit() + .getSpaceService() + .fetchSpace(getPubnub().getConfiguration().getSubscribeKey(), spaceId.getValue(), effectiveParams); + } + + @Override + protected Space createResponse(Response> input) throws PubNubException { + if (input.body() != null) { + return input.body().getData(); + } else { + throw PubNubException.builder().pubnubError(PubNubErrorBuilder.PNERROBJ_INTERNAL_ERROR).build(); + } + } + + @Override + protected PNOperationType getOperationType() { + return PNOperationType.PNFetchSpaceOperation; + } + + @Override + public CompositeParameterEnricher getCompositeParameterEnricher() { + return super.getCompositeParameterEnricher(); + } +} diff --git a/src/main/java/com/pubnub/api/endpoints/objects_vsp/space/RemoveSpace.java b/src/main/java/com/pubnub/api/endpoints/objects_vsp/space/RemoveSpace.java new file mode 100644 index 000000000..6a9902b17 --- /dev/null +++ b/src/main/java/com/pubnub/api/endpoints/objects_vsp/space/RemoveSpace.java @@ -0,0 +1,52 @@ +package com.pubnub.api.endpoints.objects_vsp.space; + +import com.google.gson.JsonElement; +import com.pubnub.api.PubNub; +import com.pubnub.api.PubNubException; +import com.pubnub.api.SpaceId; +import com.pubnub.api.endpoints.objects_api.CompositeParameterEnricher; +import com.pubnub.api.endpoints.objects_api.ObjectApiEndpoint; +import com.pubnub.api.enums.PNOperationType; +import com.pubnub.api.managers.RetrofitManager; +import com.pubnub.api.managers.TelemetryManager; +import com.pubnub.api.managers.token_manager.TokenManager; +import com.pubnub.api.models.consumer.objects_vsp.space.RemoveSpaceResult; +import com.pubnub.api.models.server.objects_api.EntityEnvelope; +import retrofit2.Call; +import retrofit2.Response; + +import java.util.Collections; +import java.util.Map; + +public class RemoveSpace extends ObjectApiEndpoint, RemoveSpaceResult> { + private SpaceId spaceId; + + public RemoveSpace( + final SpaceId spaceId, + final PubNub pubNub, + final TelemetryManager telemetry, + final RetrofitManager retrofitInstance, + final TokenManager tokenManager) { + super(pubNub, telemetry, retrofitInstance, CompositeParameterEnricher.createDefault(), tokenManager); + this.spaceId = spaceId; + } + + @Override + protected Call> executeCommand(Map effectiveParams) throws PubNubException { + return getRetrofit() + .getSpaceService() + .removeSpace(getPubnub().getConfiguration().getSubscribeKey(), spaceId.getValue(), Collections.emptyMap()); + } + + @Override + protected RemoveSpaceResult createResponse(Response> input) throws PubNubException { + int status = input.body().getStatus(); + return new RemoveSpaceResult(status); + } + + @Override + protected PNOperationType getOperationType() { + return PNOperationType.PNRemoveUserOperation; + } + +} diff --git a/src/main/java/com/pubnub/api/endpoints/objects_vsp/space/UpdateSpace.java b/src/main/java/com/pubnub/api/endpoints/objects_vsp/space/UpdateSpace.java new file mode 100644 index 000000000..0d5ab8a13 --- /dev/null +++ b/src/main/java/com/pubnub/api/endpoints/objects_vsp/space/UpdateSpace.java @@ -0,0 +1,37 @@ +package com.pubnub.api.endpoints.objects_vsp.space; + +import com.pubnub.api.PubNub; +import com.pubnub.api.SpaceId; +import com.pubnub.api.endpoints.objects_api.CompositeParameterEnricher; +import com.pubnub.api.endpoints.objects_api.utils.Include.CustomIncludeAware; +import com.pubnub.api.endpoints.remoteaction.RemoteAction; +import com.pubnub.api.managers.RetrofitManager; +import com.pubnub.api.managers.TelemetryManager; +import com.pubnub.api.managers.token_manager.TokenManager; +import com.pubnub.api.models.consumer.objects_vsp.space.Space; + +import java.util.Map; + +public interface UpdateSpace extends RemoteAction, CustomIncludeAware { + + static UpdateSpace create( + final SpaceId spaceId, + final PubNub pubNub, + final TelemetryManager telemetryManager, + final RetrofitManager retrofitManager, + final TokenManager tokenManager) { + final CompositeParameterEnricher compositeParameterEnricher = CompositeParameterEnricher.createDefault(); + return new UpdateSpaceCommand(spaceId, pubNub, telemetryManager, retrofitManager, tokenManager, compositeParameterEnricher); + } + + UpdateSpace name(String name); + + UpdateSpace description(String description); + + UpdateSpace custom(Map custom); + + UpdateSpace status(String status); + + UpdateSpace type(String type); + +} diff --git a/src/main/java/com/pubnub/api/endpoints/objects_vsp/space/UpdateSpaceCommand.java b/src/main/java/com/pubnub/api/endpoints/objects_vsp/space/UpdateSpaceCommand.java new file mode 100644 index 000000000..d2845ca1e --- /dev/null +++ b/src/main/java/com/pubnub/api/endpoints/objects_vsp/space/UpdateSpaceCommand.java @@ -0,0 +1,84 @@ +package com.pubnub.api.endpoints.objects_vsp.space; + +import com.pubnub.api.PubNub; +import com.pubnub.api.PubNubException; +import com.pubnub.api.SpaceId; +import com.pubnub.api.builder.PubNubErrorBuilder; +import com.pubnub.api.endpoints.objects_api.CompositeParameterEnricher; +import com.pubnub.api.endpoints.objects_api.ObjectApiEndpoint; +import com.pubnub.api.endpoints.objects_api.utils.Include.HavingCustomInclude; +import com.pubnub.api.enums.PNOperationType; +import com.pubnub.api.managers.RetrofitManager; +import com.pubnub.api.managers.TelemetryManager; +import com.pubnub.api.managers.token_manager.TokenManager; +import com.pubnub.api.models.consumer.objects_vsp.space.Space; +import com.pubnub.api.models.server.objects_api.EntityEnvelope; +import com.pubnub.api.models.server.objects_vsp.space.UpdateSpacePayload; +import lombok.Setter; +import lombok.experimental.Accessors; +import retrofit2.Call; +import retrofit2.Response; + +import java.util.HashMap; +import java.util.Map; + +@Accessors(chain = true, fluent = true) +final class UpdateSpaceCommand extends ObjectApiEndpoint, Space> implements UpdateSpace, HavingCustomInclude { + private final SpaceId spaceId; + @Setter + private String name; + @Setter + private String description; + @Setter + private Map custom; + @Setter + private String status; + @Setter + private String type; + + UpdateSpaceCommand( + final SpaceId spaceId, + final PubNub pubNub, + final TelemetryManager telemetryManager, + final RetrofitManager retrofitManager, + final TokenManager tokenManager, + final CompositeParameterEnricher compositeParameterEnricher) { + super(pubNub, telemetryManager, retrofitManager, compositeParameterEnricher, tokenManager); + this.spaceId = spaceId; + } + + @Override + protected Call> executeCommand(Map effectiveParams) throws PubNubException { + //This is workaround to accept custom maps that are instances of anonymous classes not handled by gson + final HashMap customHashMap = new HashMap<>(); + if (custom != null) { + customHashMap.putAll(custom); + } + + final UpdateSpacePayload updateSpacePayload = new UpdateSpacePayload(name, description, customHashMap, status, type); + + String subscribeKey = getPubnub().getConfiguration().getSubscribeKey(); + return getRetrofit() + .getSpaceService() + .updateSpace(subscribeKey, spaceId.getValue(), updateSpacePayload, effectiveParams); + } + + @Override + protected Space createResponse(Response> input) throws PubNubException { + if (input.body() != null) { + return input.body().getData(); + } else { + throw PubNubException.builder().pubnubError(PubNubErrorBuilder.PNERROBJ_INTERNAL_ERROR).build(); + } + } + + @Override + protected PNOperationType getOperationType() { + return PNOperationType.PNUpdateSpaceOperation; + } + + @Override + public CompositeParameterEnricher getCompositeParameterEnricher() { + return super.getCompositeParameterEnricher(); + } +} diff --git a/src/main/java/com/pubnub/api/endpoints/objects_vsp/space/UpsertSpace.java b/src/main/java/com/pubnub/api/endpoints/objects_vsp/space/UpsertSpace.java new file mode 100644 index 000000000..998d39597 --- /dev/null +++ b/src/main/java/com/pubnub/api/endpoints/objects_vsp/space/UpsertSpace.java @@ -0,0 +1,36 @@ +package com.pubnub.api.endpoints.objects_vsp.space; + +import com.pubnub.api.PubNub; +import com.pubnub.api.SpaceId; +import com.pubnub.api.endpoints.objects_api.CompositeParameterEnricher; +import com.pubnub.api.endpoints.objects_api.utils.Include.CustomIncludeAware; +import com.pubnub.api.endpoints.remoteaction.RemoteAction; +import com.pubnub.api.managers.RetrofitManager; +import com.pubnub.api.managers.TelemetryManager; +import com.pubnub.api.managers.token_manager.TokenManager; +import com.pubnub.api.models.consumer.objects_vsp.space.Space; + +import java.util.Map; + +public interface UpsertSpace extends RemoteAction, CustomIncludeAware { + + static UpsertSpace create( + final SpaceId spaceId, + final PubNub pubNub, + final TelemetryManager telemetryManager, + final RetrofitManager retrofitManager, + final TokenManager tokenManager) { + final CompositeParameterEnricher compositeParameterEnricher = CompositeParameterEnricher.createDefault(); + return new UpsertSpaceCommand(spaceId, pubNub, telemetryManager, retrofitManager, tokenManager, compositeParameterEnricher); + } + + UpsertSpace name(String name); + + UpsertSpace description(String description); + + UpsertSpace custom(Map custom); + + UpsertSpace status(String status); + + UpsertSpace type(String type); +} diff --git a/src/main/java/com/pubnub/api/endpoints/objects_vsp/space/UpsertSpaceCommand.java b/src/main/java/com/pubnub/api/endpoints/objects_vsp/space/UpsertSpaceCommand.java new file mode 100644 index 000000000..330cfb2dc --- /dev/null +++ b/src/main/java/com/pubnub/api/endpoints/objects_vsp/space/UpsertSpaceCommand.java @@ -0,0 +1,81 @@ +package com.pubnub.api.endpoints.objects_vsp.space; + +import com.pubnub.api.PubNub; +import com.pubnub.api.PubNubException; +import com.pubnub.api.SpaceId; +import com.pubnub.api.builder.PubNubErrorBuilder; +import com.pubnub.api.endpoints.objects_api.CompositeParameterEnricher; +import com.pubnub.api.endpoints.objects_api.ObjectApiEndpoint; +import com.pubnub.api.endpoints.objects_api.utils.Include.HavingCustomInclude; +import com.pubnub.api.enums.PNOperationType; +import com.pubnub.api.managers.RetrofitManager; +import com.pubnub.api.managers.TelemetryManager; +import com.pubnub.api.managers.token_manager.TokenManager; +import com.pubnub.api.models.consumer.objects_vsp.space.Space; +import com.pubnub.api.models.server.objects_api.EntityEnvelope; +import com.pubnub.api.models.server.objects_vsp.space.UpsertSpacePayload; +import lombok.Setter; +import lombok.experimental.Accessors; +import retrofit2.Call; +import retrofit2.Response; + +import java.util.HashMap; +import java.util.Map; + +@Accessors(chain = true, fluent = true) +final class UpsertSpaceCommand extends ObjectApiEndpoint, Space> implements UpsertSpace, HavingCustomInclude { + private final SpaceId spaceId; + @Setter + private String name; + @Setter + private String description; + @Setter + private Map custom; + @Setter + private String status; + @Setter + private String type; + + UpsertSpaceCommand( + final SpaceId spaceId, + final PubNub pubNub, + final TelemetryManager telemetryManager, + final RetrofitManager retrofitManager, + final TokenManager tokenManager, + final CompositeParameterEnricher compositeParameterEnricher) { + super(pubNub, telemetryManager, retrofitManager, compositeParameterEnricher, tokenManager); + this.spaceId = spaceId; + } + + @Override + protected Call> executeCommand(Map effectiveParams) throws PubNubException { + final HashMap customHashMap = new HashMap<>(); + if (custom != null) { + customHashMap.putAll(custom); + } + + final UpsertSpacePayload upsertUserPayload = new UpsertSpacePayload(name, description, customHashMap, status, type); + + String subscribeKey = getPubnub().getConfiguration().getSubscribeKey(); + return getRetrofit().getSpaceService().upsertSpace(subscribeKey, spaceId.getValue(), upsertUserPayload, effectiveParams); + } + + @Override + protected Space createResponse(Response> input) throws PubNubException { + if (input != null) { + return input.body().getData(); + } else { + throw PubNubException.builder().pubnubError(PubNubErrorBuilder.PNERROBJ_INTERNAL_ERROR).build(); + } + } + + @Override + protected PNOperationType getOperationType() { + return PNOperationType.PNUpsertSpaceOperation; + } + + @Override + public CompositeParameterEnricher getCompositeParameterEnricher() { + return super.getCompositeParameterEnricher(); + } +} diff --git a/src/main/java/com/pubnub/api/endpoints/objects_vsp/user/CreateUser.java b/src/main/java/com/pubnub/api/endpoints/objects_vsp/user/CreateUser.java new file mode 100644 index 000000000..e4e7675c1 --- /dev/null +++ b/src/main/java/com/pubnub/api/endpoints/objects_vsp/user/CreateUser.java @@ -0,0 +1,41 @@ +package com.pubnub.api.endpoints.objects_vsp.user; + +import com.pubnub.api.PubNub; +import com.pubnub.api.UserId; +import com.pubnub.api.endpoints.objects_api.CompositeParameterEnricher; +import com.pubnub.api.endpoints.objects_api.utils.Include.CustomIncludeAware; +import com.pubnub.api.endpoints.remoteaction.RemoteAction; +import com.pubnub.api.managers.RetrofitManager; +import com.pubnub.api.managers.TelemetryManager; +import com.pubnub.api.managers.token_manager.TokenManager; +import com.pubnub.api.models.consumer.objects_vsp.user.User; + +import java.util.Map; + +public interface CreateUser extends RemoteAction, CustomIncludeAware { + + static CreateUser create( + final PubNub pubNub, + final TelemetryManager telemetryManager, + final RetrofitManager retrofitManager, + final TokenManager tokenManager) { + final CompositeParameterEnricher compositeParameterEnricher = CompositeParameterEnricher.createDefault(); + return new CreateUserCommand(pubNub, telemetryManager, retrofitManager, tokenManager, compositeParameterEnricher); + } + + CreateUser userId(UserId userId); + + CreateUser name(String name); + + CreateUser email(String email); + + CreateUser profileUrl(String profileUrl); + + CreateUser externalId(String externalId); + + CreateUser custom(Map custom); + + CreateUser status(String status); + + CreateUser type(String type); +} diff --git a/src/main/java/com/pubnub/api/endpoints/objects_vsp/user/CreateUserCommand.java b/src/main/java/com/pubnub/api/endpoints/objects_vsp/user/CreateUserCommand.java new file mode 100644 index 000000000..30be74c7e --- /dev/null +++ b/src/main/java/com/pubnub/api/endpoints/objects_vsp/user/CreateUserCommand.java @@ -0,0 +1,95 @@ +package com.pubnub.api.endpoints.objects_vsp.user; + +import com.pubnub.api.PubNub; +import com.pubnub.api.PubNubException; +import com.pubnub.api.UserId; +import com.pubnub.api.builder.PubNubErrorBuilder; +import com.pubnub.api.endpoints.objects_api.CompositeParameterEnricher; +import com.pubnub.api.endpoints.objects_api.ObjectApiEndpoint; +import com.pubnub.api.endpoints.objects_api.utils.Include.HavingCustomInclude; +import com.pubnub.api.enums.PNOperationType; +import com.pubnub.api.managers.RetrofitManager; +import com.pubnub.api.managers.TelemetryManager; +import com.pubnub.api.managers.token_manager.TokenManager; +import com.pubnub.api.models.consumer.objects_vsp.user.User; +import com.pubnub.api.models.server.objects_api.EntityEnvelope; +import com.pubnub.api.models.server.objects_vsp.user.CreateUserPayload; +import lombok.Setter; +import lombok.experimental.Accessors; +import retrofit2.Call; +import retrofit2.Response; + +import java.util.HashMap; +import java.util.Map; + +@Accessors(chain = true, fluent = true) +final class CreateUserCommand extends ObjectApiEndpoint, User> implements CreateUser, HavingCustomInclude { + @Setter + private UserId userId; + @Setter + private String name; + @Setter + private String email; + @Setter + private String profileUrl; + @Setter + private String externalId; + @Setter + private Map custom; + @Setter + private String status; + @Setter + private String type; + + CreateUserCommand( + final PubNub pubNub, + final TelemetryManager telemetryManager, + final RetrofitManager retrofitManager, + final TokenManager tokenManager, + final CompositeParameterEnricher compositeParameterEnricher) { + super(pubNub, telemetryManager, retrofitManager, compositeParameterEnricher, tokenManager); + } + + @Override + protected Call> executeCommand(Map effectiveParams) throws PubNubException { + //This is workaround to accept custom maps that are instances of anonymous classes not handled by gson + final HashMap customHashMap = new HashMap<>(); + if (custom != null) { + customHashMap.putAll(custom); + } + + final CreateUserPayload createUserPayload = new CreateUserPayload(name, email, externalId, profileUrl, customHashMap, status, type); + String subscribeKey = getPubnub().getConfiguration().getSubscribeKey(); + return getRetrofit() + .getUserService() + .createUser(subscribeKey, effectiveUserId().getValue(), createUserPayload, effectiveParams); + } + + @Override + public CompositeParameterEnricher getCompositeParameterEnricher() { + return super.getCompositeParameterEnricher(); + } + + @Override + protected User createResponse(Response> input) throws PubNubException { + if (input.body() != null) { + return input.body().getData(); + } else { + throw PubNubException.builder().pubnubError(PubNubErrorBuilder.PNERROBJ_INTERNAL_ERROR).build(); + } + } + + @Override + protected PNOperationType getOperationType() { + return PNOperationType.PNCreateUserOperation; + } + + private UserId effectiveUserId() { + try { + return (userId != null) ? userId : getPubnub().getConfiguration().getUserId(); + } catch (PubNubException e) { + throw new RuntimeException(e); + } + } + +} diff --git a/src/main/java/com/pubnub/api/endpoints/objects_vsp/user/FetchUser.java b/src/main/java/com/pubnub/api/endpoints/objects_vsp/user/FetchUser.java new file mode 100644 index 000000000..34a11dda9 --- /dev/null +++ b/src/main/java/com/pubnub/api/endpoints/objects_vsp/user/FetchUser.java @@ -0,0 +1,28 @@ +package com.pubnub.api.endpoints.objects_vsp.user; + +import com.pubnub.api.PubNub; +import com.pubnub.api.UserId; +import com.pubnub.api.endpoints.objects_api.CompositeParameterEnricher; +import com.pubnub.api.endpoints.objects_api.utils.Include.CustomIncludeAware; +import com.pubnub.api.endpoints.remoteaction.RemoteAction; +import com.pubnub.api.managers.RetrofitManager; +import com.pubnub.api.managers.TelemetryManager; +import com.pubnub.api.managers.token_manager.TokenManager; +import com.pubnub.api.models.consumer.objects_vsp.user.User; +import lombok.experimental.Accessors; + +@Accessors(chain = true, fluent = true) +public interface FetchUser extends RemoteAction, CustomIncludeAware { + + static FetchUser create( + final PubNub pubNub, + final TelemetryManager telemetryManager, + final RetrofitManager retrofitManager, + final TokenManager tokenManager) { + final CompositeParameterEnricher compositeParameterEnricher = CompositeParameterEnricher.createDefault(); + return new FetchUserCommand(pubNub, telemetryManager, retrofitManager, tokenManager, compositeParameterEnricher); + } + + FetchUser userId(UserId userId); + +} diff --git a/src/main/java/com/pubnub/api/endpoints/objects_vsp/user/FetchUserCommand.java b/src/main/java/com/pubnub/api/endpoints/objects_vsp/user/FetchUserCommand.java new file mode 100644 index 000000000..d023daf21 --- /dev/null +++ b/src/main/java/com/pubnub/api/endpoints/objects_vsp/user/FetchUserCommand.java @@ -0,0 +1,70 @@ +package com.pubnub.api.endpoints.objects_vsp.user; + +import com.pubnub.api.PubNub; +import com.pubnub.api.PubNubException; +import com.pubnub.api.UserId; +import com.pubnub.api.builder.PubNubErrorBuilder; +import com.pubnub.api.endpoints.objects_api.CompositeParameterEnricher; +import com.pubnub.api.endpoints.objects_api.ObjectApiEndpoint; +import com.pubnub.api.endpoints.objects_api.utils.Include.HavingCustomInclude; +import com.pubnub.api.enums.PNOperationType; +import com.pubnub.api.managers.RetrofitManager; +import com.pubnub.api.managers.TelemetryManager; +import com.pubnub.api.managers.token_manager.TokenManager; +import com.pubnub.api.models.consumer.objects_vsp.user.User; +import com.pubnub.api.models.server.objects_api.EntityEnvelope; +import lombok.Setter; +import lombok.experimental.Accessors; +import retrofit2.Call; +import retrofit2.Response; + +import java.util.Map; + +@Accessors(chain = true, fluent = true) +final class FetchUserCommand extends ObjectApiEndpoint, User> implements FetchUser, HavingCustomInclude { + @Setter + private UserId userId; + + FetchUserCommand( + final PubNub pubNub, + final TelemetryManager telemetryManager, + final RetrofitManager retrofitManager, + final TokenManager tokenManager, + final CompositeParameterEnricher compositeParameterEnricher) { + super(pubNub, telemetryManager, retrofitManager, compositeParameterEnricher, tokenManager); + } + + @Override + protected Call> executeCommand(Map effectiveParams) throws PubNubException { + return getRetrofit() + .getUserService() + .fetchUser(getPubnub().getConfiguration().getSubscribeKey(), effectiveUserId().getValue(), effectiveParams); + } + + @Override + protected User createResponse(Response> input) throws PubNubException { + if (input.body() != null) { + return input.body().getData(); + } else { + throw PubNubException.builder().pubnubError(PubNubErrorBuilder.PNERROBJ_INTERNAL_ERROR).build(); + } + } + + @Override + protected PNOperationType getOperationType() { + return PNOperationType.PNFetchUserOperation; + } + + @Override + public CompositeParameterEnricher getCompositeParameterEnricher() { + return super.getCompositeParameterEnricher(); + } + + protected UserId effectiveUserId() { + try { + return (userId != null) ? userId : getPubnub().getConfiguration().getUserId(); + } catch (PubNubException e) { + throw new RuntimeException(e); + } + } +} diff --git a/src/main/java/com/pubnub/api/endpoints/objects_vsp/user/RemoveUser.java b/src/main/java/com/pubnub/api/endpoints/objects_vsp/user/RemoveUser.java new file mode 100644 index 000000000..51601d9eb --- /dev/null +++ b/src/main/java/com/pubnub/api/endpoints/objects_vsp/user/RemoveUser.java @@ -0,0 +1,60 @@ +package com.pubnub.api.endpoints.objects_vsp.user; + +import com.google.gson.JsonElement; +import com.pubnub.api.PubNub; +import com.pubnub.api.PubNubException; +import com.pubnub.api.UserId; +import com.pubnub.api.endpoints.objects_api.CompositeParameterEnricher; +import com.pubnub.api.endpoints.objects_api.ObjectApiEndpoint; +import com.pubnub.api.enums.PNOperationType; +import com.pubnub.api.managers.RetrofitManager; +import com.pubnub.api.managers.TelemetryManager; +import com.pubnub.api.managers.token_manager.TokenManager; +import com.pubnub.api.models.consumer.objects_vsp.user.RemoveUserResult; +import com.pubnub.api.models.server.objects_api.EntityEnvelope; +import lombok.Setter; +import lombok.experimental.Accessors; +import retrofit2.Call; +import retrofit2.Response; + +import java.util.Collections; +import java.util.Map; + +@Accessors(chain = true, fluent = true) +public class RemoveUser extends ObjectApiEndpoint, RemoveUserResult> { + @Setter + private UserId userId; + + public RemoveUser( + final PubNub pubnubInstance, + final TelemetryManager telemetry, + final RetrofitManager retrofitInstance, + final TokenManager tokenManager) { + super(pubnubInstance, telemetry, retrofitInstance, CompositeParameterEnricher.createDefault(), tokenManager); + } + + @Override + protected Call> executeCommand(Map effectiveParams) throws PubNubException { + return getRetrofit() + .getUserService() + .removeUser(getPubnub().getConfiguration().getSubscribeKey(), effectiveUserId().getValue(), Collections.emptyMap()); + } + + @Override + protected RemoveUserResult createResponse(Response> input) throws PubNubException { + return new RemoveUserResult(input.body()); + } + + @Override + protected PNOperationType getOperationType() { + return PNOperationType.PNRemoveUserOperation; + } + + private UserId effectiveUserId() { + try { + return (userId != null) ? userId : getPubnub().getConfiguration().getUserId(); + } catch (PubNubException e) { + throw new RuntimeException(e); + } + } +} diff --git a/src/main/java/com/pubnub/api/endpoints/objects_vsp/user/UpdateUser.java b/src/main/java/com/pubnub/api/endpoints/objects_vsp/user/UpdateUser.java new file mode 100644 index 000000000..1dab54d3c --- /dev/null +++ b/src/main/java/com/pubnub/api/endpoints/objects_vsp/user/UpdateUser.java @@ -0,0 +1,41 @@ +package com.pubnub.api.endpoints.objects_vsp.user; + +import com.pubnub.api.PubNub; +import com.pubnub.api.UserId; +import com.pubnub.api.endpoints.objects_api.CompositeParameterEnricher; +import com.pubnub.api.endpoints.objects_api.utils.Include.CustomIncludeAware; +import com.pubnub.api.endpoints.remoteaction.RemoteAction; +import com.pubnub.api.managers.RetrofitManager; +import com.pubnub.api.managers.TelemetryManager; +import com.pubnub.api.managers.token_manager.TokenManager; +import com.pubnub.api.models.consumer.objects_vsp.user.User; + +import java.util.Map; + +public interface UpdateUser extends RemoteAction, CustomIncludeAware { + + static UpdateUser create( + final PubNub pubNub, + final TelemetryManager telemetryManager, + final RetrofitManager retrofitManager, + final TokenManager tokenManager) { + final CompositeParameterEnricher compositeParameterEnricher = CompositeParameterEnricher.createDefault(); + return new UpdateUserCommand(pubNub, telemetryManager, retrofitManager, tokenManager, compositeParameterEnricher); + } + + UpdateUser userId(UserId userId); + + UpdateUser name(String name); + + UpdateUser email(String email); + + UpdateUser profileUrl(String profileUrl); + + UpdateUser externalId(String externalId); + + UpdateUser custom(Map custom); + + UpdateUser status(String status); + + UpdateUser type(String type); +} diff --git a/src/main/java/com/pubnub/api/endpoints/objects_vsp/user/UpdateUserCommand.java b/src/main/java/com/pubnub/api/endpoints/objects_vsp/user/UpdateUserCommand.java new file mode 100644 index 000000000..e71e576e3 --- /dev/null +++ b/src/main/java/com/pubnub/api/endpoints/objects_vsp/user/UpdateUserCommand.java @@ -0,0 +1,95 @@ +package com.pubnub.api.endpoints.objects_vsp.user; + +import com.pubnub.api.PubNub; +import com.pubnub.api.PubNubException; +import com.pubnub.api.UserId; +import com.pubnub.api.builder.PubNubErrorBuilder; +import com.pubnub.api.endpoints.objects_api.CompositeParameterEnricher; +import com.pubnub.api.endpoints.objects_api.ObjectApiEndpoint; +import com.pubnub.api.endpoints.objects_api.utils.Include.HavingCustomInclude; +import com.pubnub.api.enums.PNOperationType; +import com.pubnub.api.managers.RetrofitManager; +import com.pubnub.api.managers.TelemetryManager; +import com.pubnub.api.managers.token_manager.TokenManager; +import com.pubnub.api.models.consumer.objects_vsp.user.User; +import com.pubnub.api.models.server.objects_api.EntityEnvelope; +import com.pubnub.api.models.server.objects_vsp.user.UpdateUserPayload; +import lombok.Setter; +import lombok.experimental.Accessors; +import retrofit2.Call; +import retrofit2.Response; + +import java.util.HashMap; +import java.util.Map; + +@Accessors(chain = true, fluent = true) +class UpdateUserCommand extends ObjectApiEndpoint, User> implements UpdateUser, HavingCustomInclude { + @Setter + private UserId userId; + @Setter + private String name; + @Setter + private String email; + @Setter + private String profileUrl; + @Setter + private String externalId; + @Setter + private Map custom; + @Setter + private String status; + @Setter + private String type; + + UpdateUserCommand( + final PubNub pubNub, + final TelemetryManager telemetryManager, + final RetrofitManager retrofitManager, + final TokenManager tokenManager, + final CompositeParameterEnricher compositeParameterEnricher) { + super(pubNub, telemetryManager, retrofitManager, compositeParameterEnricher, tokenManager); + } + + @Override + protected Call> executeCommand(Map effectiveParams) throws PubNubException { + //This is workaround to accept custom maps that are instances of anonymous classes not handled by gson + final HashMap customHashMap = new HashMap<>(); + if (custom != null) { + customHashMap.putAll(custom); + } + + final UpdateUserPayload updateUserPayload = new UpdateUserPayload(name, email, externalId, profileUrl, customHashMap, status, type); + + String subscribeKey = getPubnub().getConfiguration().getSubscribeKey(); + return getRetrofit() + .getUserService() + .updateUser(subscribeKey, effectiveUserId().getValue(), updateUserPayload, effectiveParams); + } + + @Override + protected User createResponse(Response> input) throws PubNubException { + if (input.body() != null) { + return input.body().getData(); + } else { + throw PubNubException.builder().pubnubError(PubNubErrorBuilder.PNERROBJ_INTERNAL_ERROR).build(); + } + } + + @Override + protected PNOperationType getOperationType() { + return PNOperationType.PNUpdateUserOperation; + } + + @Override + public CompositeParameterEnricher getCompositeParameterEnricher() { + return super.getCompositeParameterEnricher(); + } + + private UserId effectiveUserId() { + try { + return (userId != null) ? userId : getPubnub().getConfiguration().getUserId(); + } catch (PubNubException e) { + throw new RuntimeException(e); + } + } +} diff --git a/src/main/java/com/pubnub/api/endpoints/objects_vsp/user/UpsertUser.java b/src/main/java/com/pubnub/api/endpoints/objects_vsp/user/UpsertUser.java new file mode 100644 index 000000000..ed0ffcafb --- /dev/null +++ b/src/main/java/com/pubnub/api/endpoints/objects_vsp/user/UpsertUser.java @@ -0,0 +1,41 @@ +package com.pubnub.api.endpoints.objects_vsp.user; + +import com.pubnub.api.PubNub; +import com.pubnub.api.UserId; +import com.pubnub.api.endpoints.objects_api.CompositeParameterEnricher; +import com.pubnub.api.endpoints.objects_api.utils.Include.CustomIncludeAware; +import com.pubnub.api.endpoints.remoteaction.RemoteAction; +import com.pubnub.api.managers.RetrofitManager; +import com.pubnub.api.managers.TelemetryManager; +import com.pubnub.api.managers.token_manager.TokenManager; +import com.pubnub.api.models.consumer.objects_vsp.user.User; + +import java.util.Map; + +public interface UpsertUser extends RemoteAction, CustomIncludeAware { + + static UpsertUser create( + final PubNub pubNub, + final TelemetryManager telemetryManager, + final RetrofitManager retrofitManager, + final TokenManager tokenManager) { + final CompositeParameterEnricher compositeParameterEnricher = CompositeParameterEnricher.createDefault(); + return new UpsertUserCommand(pubNub, telemetryManager, retrofitManager, tokenManager, compositeParameterEnricher); + } + + UpsertUser userId(UserId userId); + + UpsertUser name(String name); + + UpsertUser email(String email); + + UpsertUser profileUrl(String profileUrl); + + UpsertUser externalId(String externalId); + + UpsertUser custom(Map custom); + + UpsertUser status(String status); + + UpsertUser type(String type); +} diff --git a/src/main/java/com/pubnub/api/endpoints/objects_vsp/user/UpsertUserCommand.java b/src/main/java/com/pubnub/api/endpoints/objects_vsp/user/UpsertUserCommand.java new file mode 100644 index 000000000..45c7ce23c --- /dev/null +++ b/src/main/java/com/pubnub/api/endpoints/objects_vsp/user/UpsertUserCommand.java @@ -0,0 +1,92 @@ +package com.pubnub.api.endpoints.objects_vsp.user; + +import com.pubnub.api.PubNub; +import com.pubnub.api.PubNubException; +import com.pubnub.api.UserId; +import com.pubnub.api.builder.PubNubErrorBuilder; +import com.pubnub.api.endpoints.objects_api.CompositeParameterEnricher; +import com.pubnub.api.endpoints.objects_api.ObjectApiEndpoint; +import com.pubnub.api.endpoints.objects_api.utils.Include.HavingCustomInclude; +import com.pubnub.api.enums.PNOperationType; +import com.pubnub.api.managers.RetrofitManager; +import com.pubnub.api.managers.TelemetryManager; +import com.pubnub.api.managers.token_manager.TokenManager; +import com.pubnub.api.models.consumer.objects_vsp.user.User; +import com.pubnub.api.models.server.objects_api.EntityEnvelope; +import com.pubnub.api.models.server.objects_vsp.user.UpsertUserPayload; +import lombok.Setter; +import lombok.experimental.Accessors; +import retrofit2.Call; +import retrofit2.Response; + +import java.util.HashMap; +import java.util.Map; + +@Accessors(chain = true, fluent = true) +class UpsertUserCommand extends ObjectApiEndpoint, User> implements UpsertUser, HavingCustomInclude { + @Setter + private UserId userId; + @Setter + private String name; + @Setter + private String email; + @Setter + private String profileUrl; + @Setter + private String externalId; + @Setter + private Map custom; + @Setter + private String status; + @Setter + private String type; + + UpsertUserCommand( + final PubNub pubNub, + final TelemetryManager telemetryManager, + final RetrofitManager retrofitManager, + final TokenManager tokenManager, + final CompositeParameterEnricher compositeParameterEnricher) { + super(pubNub, telemetryManager, retrofitManager, compositeParameterEnricher, tokenManager); + } + + @Override + protected Call> executeCommand(Map effectiveParams) throws PubNubException { + final HashMap customHashMap = new HashMap<>(); + if (custom != null) { + customHashMap.putAll(custom); + } + + final UpsertUserPayload upsertUserPayload = new UpsertUserPayload(name, email, externalId, profileUrl, customHashMap, status, type); + + String subscribeKey = getPubnub().getConfiguration().getSubscribeKey(); + return getRetrofit().getUserService().upsertUser(subscribeKey, effectiveUserId().getValue(), upsertUserPayload, effectiveParams); + } + + @Override + protected User createResponse(Response> input) throws PubNubException { + if (input.body() != null) { + return input.body().getData(); + } else { + throw PubNubException.builder().pubnubError(PubNubErrorBuilder.PNERROBJ_INTERNAL_ERROR).build(); + } + } + + @Override + protected PNOperationType getOperationType() { + return PNOperationType.PNUpsertUserOperation; + } + + @Override + public CompositeParameterEnricher getCompositeParameterEnricher() { + return super.getCompositeParameterEnricher(); + } + + private UserId effectiveUserId() { + try { + return (userId != null) ? userId : getPubnub().getConfiguration().getUserId(); + } catch (PubNubException e) { + throw new RuntimeException(e); + } + } +} diff --git a/src/main/java/com/pubnub/api/enums/PNOperationType.java b/src/main/java/com/pubnub/api/enums/PNOperationType.java index 11ed56e76..961a06ef7 100644 --- a/src/main/java/com/pubnub/api/enums/PNOperationType.java +++ b/src/main/java/com/pubnub/api/enums/PNOperationType.java @@ -42,6 +42,20 @@ public enum PNOperationType { PNGetAllUuidMetadataOperation, PNRemoveUuidMetadataOperation, + // User - VSP + PNCreateUserOperation, + PNFetchUserOperation, + PNRemoveUserOperation, + PNUpdateUserOperation, + PNUpsertUserOperation, + + // Space - VSP + PNCreateSpaceOperation, + PNFetchSpaceOperation, + PNRemoveSpaceOperation, + PNUpdateSpaceOperation, + PNUpsertSpaceOperation, + // Channel Metadata PNSetChannelMetadataOperation, PNGetChannelMetadataOperation, diff --git a/src/main/java/com/pubnub/api/managers/RetrofitManager.java b/src/main/java/com/pubnub/api/managers/RetrofitManager.java index ed9dd1a43..050b639ca 100644 --- a/src/main/java/com/pubnub/api/managers/RetrofitManager.java +++ b/src/main/java/com/pubnub/api/managers/RetrofitManager.java @@ -9,6 +9,8 @@ import com.pubnub.api.interceptors.SignatureInterceptor; import com.pubnub.api.models.consumer.PNStatus; import com.pubnub.api.services.*; +import com.pubnub.api.services.vsp.SpaceService; +import com.pubnub.api.services.vsp.UserService; import lombok.Getter; import okhttp3.Dispatcher; import okhttp3.OkHttpClient; @@ -56,6 +58,10 @@ public class RetrofitManager { @Getter private UUIDMetadataService uuidMetadataService; @Getter + private UserService userService; + @Getter + private SpaceService spaceService; + @Getter private ChannelMetadataService channelMetadataService; @Getter private MessageActionService messageActionService; @@ -154,6 +160,8 @@ public void run() { this.s3Service = noSignatureInstance.create(S3Service.class); this.extendedPresenceService = transactionInstance.create(ExtendedPresenceService.class); + this.userService = transactionInstance.create(UserService.class); + this.spaceService = transactionInstance.create(SpaceService.class); } private OkHttpClient.Builder prepareOkHttpClient(int requestTimeout, int connectTimeOut) { diff --git a/src/main/java/com/pubnub/api/managers/TelemetryManager.java b/src/main/java/com/pubnub/api/managers/TelemetryManager.java index cfeb50964..6d75a9f85 100644 --- a/src/main/java/com/pubnub/api/managers/TelemetryManager.java +++ b/src/main/java/com/pubnub/api/managers/TelemetryManager.java @@ -181,6 +181,16 @@ private static String endpointNameForOperation(PNOperationType type) { case PNGetChannelMembersOperation: case PNRemoveChannelMembersOperation: case PNManageChannelMembersOperation: + case PNCreateUserOperation: + case PNRemoveUserOperation: + case PNFetchUserOperation: + case PNUpdateUserOperation: + case PNUpsertUserOperation: + case PNCreateSpaceOperation: + case PNRemoveSpaceOperation: + case PNFetchSpaceOperation: + case PNUpdateSpaceOperation: + case PNUpsertSpaceOperation: endpoint = "obj"; break; case PNAccessManagerGrantToken: diff --git a/src/main/java/com/pubnub/api/models/consumer/objects_api/util/CustomPayloadJsonInterceptor.java b/src/main/java/com/pubnub/api/models/consumer/objects_api/util/CustomPayloadJsonInterceptor.java index d6d57593e..2a35db30c 100644 --- a/src/main/java/com/pubnub/api/models/consumer/objects_api/util/CustomPayloadJsonInterceptor.java +++ b/src/main/java/com/pubnub/api/models/consumer/objects_api/util/CustomPayloadJsonInterceptor.java @@ -10,12 +10,14 @@ import com.google.gson.JsonSerializer; import java.lang.reflect.Type; +import java.util.Map; public class CustomPayloadJsonInterceptor implements JsonDeserializer, JsonSerializer { @Override public Object deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException { - return json; + Map map = new Gson().fromJson(json.toString(), Map.class); + return map; } @Override diff --git a/src/main/java/com/pubnub/api/models/consumer/objects_vsp/ObjectVsp.java b/src/main/java/com/pubnub/api/models/consumer/objects_vsp/ObjectVsp.java new file mode 100644 index 000000000..d10df1d06 --- /dev/null +++ b/src/main/java/com/pubnub/api/models/consumer/objects_vsp/ObjectVsp.java @@ -0,0 +1,21 @@ +package com.pubnub.api.models.consumer.objects_vsp; + +import com.google.gson.annotations.JsonAdapter; +import com.pubnub.api.models.consumer.objects_api.util.CustomPayloadJsonInterceptor; +import lombok.Data; +import lombok.Setter; +import lombok.experimental.Accessors; + +import java.util.Map; + +@Data +@Accessors(chain = true) +public class ObjectVsp { + + @JsonAdapter(CustomPayloadJsonInterceptor.class) + @Setter + protected Map custom; + + protected String updated; + protected String eTag; +} diff --git a/src/main/java/com/pubnub/api/models/consumer/objects_vsp/space/RemoveSpaceResult.java b/src/main/java/com/pubnub/api/models/consumer/objects_vsp/space/RemoveSpaceResult.java new file mode 100644 index 000000000..9cf7b2347 --- /dev/null +++ b/src/main/java/com/pubnub/api/models/consumer/objects_vsp/space/RemoveSpaceResult.java @@ -0,0 +1,8 @@ +package com.pubnub.api.models.consumer.objects_vsp.space; + +import lombok.Data; + +@Data +public class RemoveSpaceResult { + private final int status; +} diff --git a/src/main/java/com/pubnub/api/models/consumer/objects_vsp/space/Space.java b/src/main/java/com/pubnub/api/models/consumer/objects_vsp/space/Space.java new file mode 100644 index 000000000..1f4fe5651 --- /dev/null +++ b/src/main/java/com/pubnub/api/models/consumer/objects_vsp/space/Space.java @@ -0,0 +1,31 @@ +package com.pubnub.api.models.consumer.objects_vsp.space; + +import com.google.gson.annotations.JsonAdapter; +import com.pubnub.api.SpaceId; +import com.pubnub.api.models.consumer.objects_vsp.ObjectVsp; +import com.pubnub.api.models.consumer.objects_vsp.util.SpaceIdDeserializer; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.Setter; + +import java.util.Map; + +@EqualsAndHashCode(onlyExplicitlyIncluded = true, callSuper = true) +@Data +public class Space extends ObjectVsp { + + @EqualsAndHashCode.Include + @JsonAdapter(SpaceIdDeserializer.class) + @Setter + private SpaceId id; + private String name; + private String description; + private String status; + private String type; + + @Override + public Space setCustom(Map custom) { + super.setCustom(custom); + return this; + } +} diff --git a/src/main/java/com/pubnub/api/models/consumer/objects_vsp/user/RemoveUserResult.java b/src/main/java/com/pubnub/api/models/consumer/objects_vsp/user/RemoveUserResult.java new file mode 100644 index 000000000..2f40ab2c3 --- /dev/null +++ b/src/main/java/com/pubnub/api/models/consumer/objects_vsp/user/RemoveUserResult.java @@ -0,0 +1,19 @@ +package com.pubnub.api.models.consumer.objects_vsp.user; + +import com.google.gson.JsonElement; +import com.pubnub.api.models.server.objects_api.EntityEnvelope; +import lombok.AccessLevel; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; +import lombok.ToString; + +@Getter +@Setter(AccessLevel.PACKAGE) +@ToString(callSuper = true) +@NoArgsConstructor +public class RemoveUserResult extends EntityEnvelope { + public RemoveUserResult(final EntityEnvelope envelope) { + this.status = envelope.getStatus(); + } +} diff --git a/src/main/java/com/pubnub/api/models/consumer/objects_vsp/user/User.java b/src/main/java/com/pubnub/api/models/consumer/objects_vsp/user/User.java new file mode 100644 index 000000000..0955c785f --- /dev/null +++ b/src/main/java/com/pubnub/api/models/consumer/objects_vsp/user/User.java @@ -0,0 +1,32 @@ +package com.pubnub.api.models.consumer.objects_vsp.user; + +import com.google.gson.annotations.JsonAdapter; +import com.pubnub.api.UserId; +import com.pubnub.api.models.consumer.objects_vsp.ObjectVsp; +import com.pubnub.api.models.consumer.objects_vsp.util.UserIdDeserializer; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.Setter; + +import java.util.Map; + +@EqualsAndHashCode(onlyExplicitlyIncluded = true, callSuper = true) +@Data +public class User extends ObjectVsp { + @EqualsAndHashCode.Include + @JsonAdapter(UserIdDeserializer.class) + @Setter + private UserId id; + private String name; + private String email; + private String externalId; + private String profileUrl; + private String status; + private String type; + + @Override + public User setCustom(Map custom) { + super.setCustom(custom); + return this; + } +} diff --git a/src/main/java/com/pubnub/api/models/consumer/objects_vsp/util/SpaceIdDeserializer.java b/src/main/java/com/pubnub/api/models/consumer/objects_vsp/util/SpaceIdDeserializer.java new file mode 100644 index 000000000..ab024e2e5 --- /dev/null +++ b/src/main/java/com/pubnub/api/models/consumer/objects_vsp/util/SpaceIdDeserializer.java @@ -0,0 +1,19 @@ +package com.pubnub.api.models.consumer.objects_vsp.util; + +import com.google.gson.JsonDeserializationContext; +import com.google.gson.JsonDeserializer; +import com.google.gson.JsonElement; +import com.google.gson.JsonParseException; +import com.pubnub.api.SpaceId; +import lombok.SneakyThrows; + +import java.lang.reflect.Type; + +public class SpaceIdDeserializer implements JsonDeserializer { + @SneakyThrows + @Override + public SpaceId deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException { + String spaceIdValue = json.getAsString(); + return new SpaceId(spaceIdValue); + } +} diff --git a/src/main/java/com/pubnub/api/models/consumer/objects_vsp/util/UserIdDeserializer.java b/src/main/java/com/pubnub/api/models/consumer/objects_vsp/util/UserIdDeserializer.java new file mode 100644 index 000000000..cc20d809b --- /dev/null +++ b/src/main/java/com/pubnub/api/models/consumer/objects_vsp/util/UserIdDeserializer.java @@ -0,0 +1,19 @@ +package com.pubnub.api.models.consumer.objects_vsp.util; + +import com.google.gson.JsonDeserializationContext; +import com.google.gson.JsonDeserializer; +import com.google.gson.JsonElement; +import com.google.gson.JsonParseException; +import com.pubnub.api.UserId; +import lombok.SneakyThrows; + +import java.lang.reflect.Type; + +public class UserIdDeserializer implements JsonDeserializer { + @SneakyThrows + @Override + public UserId deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException { + String userIdValue = json.getAsString(); + return new UserId(userIdValue); + } +} diff --git a/src/main/java/com/pubnub/api/models/server/objects_vsp/space/CreateSpacePayload.java b/src/main/java/com/pubnub/api/models/server/objects_vsp/space/CreateSpacePayload.java new file mode 100644 index 000000000..2dcab2b39 --- /dev/null +++ b/src/main/java/com/pubnub/api/models/server/objects_vsp/space/CreateSpacePayload.java @@ -0,0 +1,7 @@ +package com.pubnub.api.models.server.objects_vsp.space; + +public class CreateSpacePayload extends SpacePayload { + public CreateSpacePayload(String name, String description, Object custom, String status, String type) { + super(name, description, custom, status, type); + } +} diff --git a/src/main/java/com/pubnub/api/models/server/objects_vsp/space/SpacePayload.java b/src/main/java/com/pubnub/api/models/server/objects_vsp/space/SpacePayload.java new file mode 100644 index 000000000..a87de9d89 --- /dev/null +++ b/src/main/java/com/pubnub/api/models/server/objects_vsp/space/SpacePayload.java @@ -0,0 +1,12 @@ +package com.pubnub.api.models.server.objects_vsp.space; + +import lombok.Data; + +@Data +public abstract class SpacePayload { + private final String name; + private final String description; + private final Object custom; + private final String status; + private final String type; +} diff --git a/src/main/java/com/pubnub/api/models/server/objects_vsp/space/UpdateSpacePayload.java b/src/main/java/com/pubnub/api/models/server/objects_vsp/space/UpdateSpacePayload.java new file mode 100644 index 000000000..21d1c946f --- /dev/null +++ b/src/main/java/com/pubnub/api/models/server/objects_vsp/space/UpdateSpacePayload.java @@ -0,0 +1,7 @@ +package com.pubnub.api.models.server.objects_vsp.space; + +public class UpdateSpacePayload extends SpacePayload { + public UpdateSpacePayload(String name, String description, Object custom, String status, String type) { + super(name, description, custom, status, type); + } +} diff --git a/src/main/java/com/pubnub/api/models/server/objects_vsp/space/UpsertSpacePayload.java b/src/main/java/com/pubnub/api/models/server/objects_vsp/space/UpsertSpacePayload.java new file mode 100644 index 000000000..0180af5fc --- /dev/null +++ b/src/main/java/com/pubnub/api/models/server/objects_vsp/space/UpsertSpacePayload.java @@ -0,0 +1,7 @@ +package com.pubnub.api.models.server.objects_vsp.space; + +public class UpsertSpacePayload extends SpacePayload { + public UpsertSpacePayload(String name, String description, Object custom, String status, String type) { + super(name, description, custom, status, type); + } +} diff --git a/src/main/java/com/pubnub/api/models/server/objects_vsp/user/CreateUserPayload.java b/src/main/java/com/pubnub/api/models/server/objects_vsp/user/CreateUserPayload.java new file mode 100644 index 000000000..2a8c20950 --- /dev/null +++ b/src/main/java/com/pubnub/api/models/server/objects_vsp/user/CreateUserPayload.java @@ -0,0 +1,7 @@ +package com.pubnub.api.models.server.objects_vsp.user; + +public class CreateUserPayload extends UserPayload { + public CreateUserPayload(String name, String email, String externalId, String profileUrl, Object custom, String status, String type) { + super(name, email, externalId, profileUrl, custom, status, type); + } +} diff --git a/src/main/java/com/pubnub/api/models/server/objects_vsp/user/UpdateUserPayload.java b/src/main/java/com/pubnub/api/models/server/objects_vsp/user/UpdateUserPayload.java new file mode 100644 index 000000000..d28a96ddb --- /dev/null +++ b/src/main/java/com/pubnub/api/models/server/objects_vsp/user/UpdateUserPayload.java @@ -0,0 +1,7 @@ +package com.pubnub.api.models.server.objects_vsp.user; + +public class UpdateUserPayload extends UserPayload { + public UpdateUserPayload(String name, String email, String externalId, String profileUrl, Object custom, String status, String type) { + super(name, email, externalId, profileUrl, custom, status, type); + } +} diff --git a/src/main/java/com/pubnub/api/models/server/objects_vsp/user/UpsertUserPayload.java b/src/main/java/com/pubnub/api/models/server/objects_vsp/user/UpsertUserPayload.java new file mode 100644 index 000000000..a0131d04e --- /dev/null +++ b/src/main/java/com/pubnub/api/models/server/objects_vsp/user/UpsertUserPayload.java @@ -0,0 +1,7 @@ +package com.pubnub.api.models.server.objects_vsp.user; + +public class UpsertUserPayload extends UserPayload { + public UpsertUserPayload(String name, String email, String externalId, String profileUrl, Object custom, String status, String type) { + super(name, email, externalId, profileUrl, custom, status, type); + } +} diff --git a/src/main/java/com/pubnub/api/models/server/objects_vsp/user/UserPayload.java b/src/main/java/com/pubnub/api/models/server/objects_vsp/user/UserPayload.java new file mode 100644 index 000000000..e1330b4d9 --- /dev/null +++ b/src/main/java/com/pubnub/api/models/server/objects_vsp/user/UserPayload.java @@ -0,0 +1,14 @@ +package com.pubnub.api.models.server.objects_vsp.user; + +import lombok.Data; + +@Data +public abstract class UserPayload { + private final String name; + private final String email; + private final String externalId; + private final String profileUrl; + private final Object custom; + private final String status; + private final String type; +} diff --git a/src/main/java/com/pubnub/api/services/ChannelMetadataService.java b/src/main/java/com/pubnub/api/services/ChannelMetadataService.java index 84d6e092e..54ac1377f 100644 --- a/src/main/java/com/pubnub/api/services/ChannelMetadataService.java +++ b/src/main/java/com/pubnub/api/services/ChannelMetadataService.java @@ -22,7 +22,6 @@ public interface ChannelMetadataService { Call> getChannelMetadata(@Path("subKey") String subKey, @Path("channel") String channel, @QueryMap(encoded = true) Map options); @PATCH("/v2/objects/{subKey}/channels/{channel}") - @Headers("Content-Type: application/json; charset=UTF-8") Call> setChannelsMetadata(@Path("subKey") String subKey, @Path("channel") String channel, @Body SetChannelMetadataPayload setChannelMetadataPayload, @QueryMap(encoded = true) Map options); @DELETE("/v2/objects/{subKey}/channels/{channel}") diff --git a/src/main/java/com/pubnub/api/services/UUIDMetadataService.java b/src/main/java/com/pubnub/api/services/UUIDMetadataService.java index 927707fd7..6f18de53f 100644 --- a/src/main/java/com/pubnub/api/services/UUIDMetadataService.java +++ b/src/main/java/com/pubnub/api/services/UUIDMetadataService.java @@ -23,7 +23,6 @@ public interface UUIDMetadataService { Call> getUUIDMetadata(@Path("subKey") String subKey, @Path("uuid") String uuid, @QueryMap(encoded = true) Map options); @PATCH("/v2/objects/{subKey}/uuids/{uuid}") - @Headers("Content-Type: application/json; charset=UTF-8") Call> setUUIDsMetadata(@Path("subKey") String subKey, @Path("uuid") String uuid, @Body SetUUIDMetadataPayload setUUIDMetadataPayload, @QueryMap(encoded = true) Map options); @DELETE("/v2/objects/{subKey}/uuids/{uuid}") diff --git a/src/main/java/com/pubnub/api/services/vsp/SpaceService.java b/src/main/java/com/pubnub/api/services/vsp/SpaceService.java new file mode 100644 index 000000000..4224054fe --- /dev/null +++ b/src/main/java/com/pubnub/api/services/vsp/SpaceService.java @@ -0,0 +1,37 @@ +package com.pubnub.api.services.vsp; + +import com.google.gson.JsonElement; +import com.pubnub.api.models.consumer.objects_vsp.space.Space; +import com.pubnub.api.models.server.objects_api.EntityEnvelope; +import com.pubnub.api.models.server.objects_vsp.space.CreateSpacePayload; +import com.pubnub.api.models.server.objects_vsp.space.UpdateSpacePayload; +import com.pubnub.api.models.server.objects_vsp.space.UpsertSpacePayload; +import retrofit2.Call; +import retrofit2.http.Body; +import retrofit2.http.DELETE; +import retrofit2.http.GET; +import retrofit2.http.PATCH; +import retrofit2.http.POST; +import retrofit2.http.PUT; +import retrofit2.http.Path; +import retrofit2.http.QueryMap; + +import java.util.Map; + +public interface SpaceService { + + @POST("/v3/objects/{subKey}/spaces/{spaceId}") + Call> createSpace(@Path("subKey") String subKey, @Path("spaceId") String spaceId, @Body CreateSpacePayload createSpacePayload, @QueryMap(encoded = true) Map options); + + @GET("/v3/objects/{subKey}/spaces/{spaceId}") + Call> fetchSpace(@Path("subKey") String subKey, @Path("spaceId") String userId, @QueryMap(encoded = true) Map options); + + @DELETE("/v3/objects/{subKey}/spaces/{spaceId}") + Call> removeSpace(@Path("subKey") String subKey, @Path("spaceId") String spaceId, @QueryMap(encoded = true) Map options); + + @PATCH("/v3/objects/{subKey}/spaces/{spaceId}") + Call> updateSpace(@Path("subKey") String subKey, @Path("spaceId") String spaceId, @Body UpdateSpacePayload updateSpacePayload, @QueryMap(encoded = true) Map options); + + @PUT("/v3/objects/{subKey}/spaces/{spaceId}") + Call> upsertSpace(@Path("subKey") String subKey, @Path("spaceId") String spaceId, @Body UpsertSpacePayload upsertSpacePayload, @QueryMap(encoded = true) Map options); +} diff --git a/src/main/java/com/pubnub/api/services/vsp/UserService.java b/src/main/java/com/pubnub/api/services/vsp/UserService.java new file mode 100644 index 000000000..17bf25e9e --- /dev/null +++ b/src/main/java/com/pubnub/api/services/vsp/UserService.java @@ -0,0 +1,30 @@ +package com.pubnub.api.services.vsp; + +import com.google.gson.JsonElement; +import com.pubnub.api.models.consumer.objects_vsp.user.User; +import com.pubnub.api.models.server.objects_api.EntityEnvelope; +import com.pubnub.api.models.server.objects_vsp.user.CreateUserPayload; +import com.pubnub.api.models.server.objects_vsp.user.UpdateUserPayload; +import com.pubnub.api.models.server.objects_vsp.user.UpsertUserPayload; +import retrofit2.Call; +import retrofit2.http.*; + +import java.util.Map; + +public interface UserService { + + @POST("/v3/objects/{subKey}/users/{userId}") + Call> createUser(@Path("subKey") String subKey, @Path("userId") String userId, @Body CreateUserPayload createUserPayload, @QueryMap(encoded = true) Map options); + + @GET("/v3/objects/{subKey}/users/{userId}") + Call> fetchUser(@Path("subKey") String subKey, @Path("userId") String userId, @QueryMap(encoded = true) Map options); + + @DELETE("/v3/objects/{subKey}/users/{userId}") + Call> removeUser(@Path("subKey") String subKey, @Path("userId") String userId, @QueryMap(encoded = true) Map options); + + @PATCH("/v3/objects/{subKey}/users/{userId}") + Call> updateUser(@Path("subKey") String subKey, @Path("userId") String userId, @Body UpdateUserPayload updateUserPayload, @QueryMap(encoded = true) Map options); + + @PUT("/v3/objects/{subKey}/users/{userId}") + Call> upsertUser(@Path("subKey") String subKey, @Path("userId") String userId, @Body UpsertUserPayload upsertUserPayload, @QueryMap(encoded = true) Map options); +} diff --git a/src/test/java/com/pubnub/api/endpoints/objects_api/BaseObjectApiTest.java b/src/test/java/com/pubnub/api/endpoints/objects_api/BaseObjectApiTest.java index 480554cac..01de5b242 100644 --- a/src/test/java/com/pubnub/api/endpoints/objects_api/BaseObjectApiTest.java +++ b/src/test/java/com/pubnub/api/endpoints/objects_api/BaseObjectApiTest.java @@ -2,8 +2,11 @@ import com.pubnub.api.PNConfiguration; import com.pubnub.api.PubNub; +import com.pubnub.api.PubNubException; +import com.pubnub.api.UserId; import com.pubnub.api.managers.RetrofitManager; import com.pubnub.api.managers.TelemetryManager; +import org.apache.commons.lang3.RandomStringUtils; import org.jetbrains.annotations.NotNull; import org.junit.Before; import org.junit.runner.RunWith; @@ -18,12 +21,15 @@ import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; +import static org.mockito.Mockito.lenient; @RunWith(MockitoJUnitRunner.class) public abstract class BaseObjectApiTest { private static final String TEST_PUBNUB_VERSION = "123"; protected final String testSubscriptionKey = UUID.randomUUID().toString(); protected final String testUUID = UUID.randomUUID().toString(); + protected final String testUserIdValue = RandomStringUtils.randomAlphabetic(20); + protected final String testSpaceIdValue = RandomStringUtils.randomAlphabetic(20); @Mock private PNConfiguration configurationMock; @@ -41,9 +47,10 @@ protected static Answer> mockRetrofitSuccessfulCall(final Supplier> call; + + @Before + public void setUp() throws Exception { + objectUnderTest = CreateSpace.create(new SpaceId(testSpaceIdValue), pubNubMock, telemetryManagerMock, retrofitManagerMock, new TokenManager()); + + when(retrofitManagerMock.getSpaceService()).thenReturn(spaceServiceMock); + when(spaceServiceMock.createSpace(eq(testSubscriptionKey), eq(testSpaceIdValue), any(), any())).thenReturn(call); + when(call.execute()).thenReturn(Response.success(new EntityEnvelope<>())); + } + + @Test + public void can_createSpace() throws PubNubException { + //given + final String spaceName = RandomStringUtils.randomAlphabetic(20); + final String spaceDescription = "Space description" + RandomStringUtils.randomAlphabetic(5); + final Map testCustom = new HashMap<>(); + testCustom.put("key1", RandomStringUtils.random(10)); + testCustom.put("key2", RandomStringUtils.random(10)); + final String testStatus = "active_" + RandomStringUtils.randomAlphabetic(5); + final String testType = "type" + RandomStringUtils.randomAlphabetic(5); + + + //when + objectUnderTest + .name(spaceName) + .description(spaceDescription) + .custom(testCustom) + .status(testStatus) + .type(testType) + .sync(); + + //then + ArgumentCaptor createSpacePayloadCaptor = ArgumentCaptor.forClass(CreateSpacePayload.class); + verify(spaceServiceMock).createSpace(eq(testSubscriptionKey), eq(testSpaceIdValue), createSpacePayloadCaptor.capture(), any()); + + CreateSpacePayload captorValue = createSpacePayloadCaptor.getValue(); + assertEquals(spaceName, captorValue.getName()); + assertEquals(spaceDescription, captorValue.getDescription()); + assertEquals(testCustom, captorValue.getCustom()); + assertEquals(testStatus, captorValue.getStatus()); + assertEquals(testType, captorValue.getType()); + } +} diff --git a/src/test/java/com/pubnub/api/endpoints/objects_vsp/space/FetchSpaceTest.java b/src/test/java/com/pubnub/api/endpoints/objects_vsp/space/FetchSpaceTest.java new file mode 100644 index 000000000..71bb774ab --- /dev/null +++ b/src/test/java/com/pubnub/api/endpoints/objects_vsp/space/FetchSpaceTest.java @@ -0,0 +1,49 @@ +package com.pubnub.api.endpoints.objects_vsp.space; + +import com.pubnub.api.PubNubException; +import com.pubnub.api.SpaceId; +import com.pubnub.api.endpoints.objects_api.BaseObjectApiTest; +import com.pubnub.api.managers.token_manager.TokenManager; +import com.pubnub.api.models.consumer.objects_vsp.space.Space; +import com.pubnub.api.models.server.objects_api.EntityEnvelope; +import com.pubnub.api.services.vsp.SpaceService; +import org.junit.Before; +import org.junit.Test; +import org.mockito.Mock; +import retrofit2.Call; +import retrofit2.Response; + +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +public class FetchSpaceTest extends BaseObjectApiTest { + private FetchSpace objectUnderTest; + + @Mock + private SpaceService spaceServiceMock; + + @Mock + private Call> call; + + @Before + public void setUp() throws Exception { + objectUnderTest = FetchSpace.create(new SpaceId(testSpaceIdValue), pubNubMock, telemetryManagerMock, retrofitManagerMock, new TokenManager()); + when(retrofitManagerMock.getSpaceService()).thenReturn(spaceServiceMock); + when(spaceServiceMock.fetchSpace(eq(testSubscriptionKey), eq(testSpaceIdValue), any())).thenReturn(call); + when(call.execute()).thenReturn(Response.success(new EntityEnvelope<>())); + } + + @Test + public void can_fetch_space() throws PubNubException { + //given + + //when + objectUnderTest.sync(); + + //then + verify(spaceServiceMock, times(1)).fetchSpace(eq(testSubscriptionKey), eq(testSpaceIdValue), any()); + } +} \ No newline at end of file diff --git a/src/test/java/com/pubnub/api/endpoints/objects_vsp/space/RemoveSpaceTest.java b/src/test/java/com/pubnub/api/endpoints/objects_vsp/space/RemoveSpaceTest.java new file mode 100644 index 000000000..946a64c55 --- /dev/null +++ b/src/test/java/com/pubnub/api/endpoints/objects_vsp/space/RemoveSpaceTest.java @@ -0,0 +1,52 @@ +package com.pubnub.api.endpoints.objects_vsp.space; + +import com.google.gson.JsonElement; +import com.pubnub.api.PubNubException; +import com.pubnub.api.SpaceId; +import com.pubnub.api.endpoints.objects_api.BaseObjectApiTest; +import com.pubnub.api.managers.token_manager.TokenManager; +import com.pubnub.api.models.consumer.objects_vsp.space.RemoveSpaceResult; +import com.pubnub.api.models.server.objects_api.EntityEnvelope; +import com.pubnub.api.services.vsp.SpaceService; +import org.apache.commons.lang3.RandomStringUtils; +import org.junit.Before; +import org.junit.Test; +import org.mockito.Mock; +import retrofit2.Call; +import retrofit2.Response; + +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +public class RemoveSpaceTest extends BaseObjectApiTest { + private RemoveSpace objectUnderTest; + + protected final String testSpaceIdValue = RandomStringUtils.randomAlphabetic(20); + + @Mock + private SpaceService spaceServiceMock; + + @Mock + private Call> call; + + @Before + public void setUp() throws Exception { + objectUnderTest = new RemoveSpace(new SpaceId(testSpaceIdValue), pubNubMock, telemetryManagerMock, retrofitManagerMock, new TokenManager()); + when(retrofitManagerMock.getSpaceService()).thenReturn(spaceServiceMock); + when(spaceServiceMock.removeSpace(eq(testSubscriptionKey), eq(testSpaceIdValue), any())).thenReturn(call); + when(call.execute()).thenReturn(Response.success(new EntityEnvelope<>())); + } + + @Test + public void can_remove_space() throws PubNubException { + //given + + //when + objectUnderTest.sync(); + + //then + verify(spaceServiceMock).removeSpace(eq(testSubscriptionKey), eq(testSpaceIdValue), any()); + } +} \ No newline at end of file diff --git a/src/test/java/com/pubnub/api/endpoints/objects_vsp/space/UpdateSpaceTest.java b/src/test/java/com/pubnub/api/endpoints/objects_vsp/space/UpdateSpaceTest.java new file mode 100644 index 000000000..6db665b1d --- /dev/null +++ b/src/test/java/com/pubnub/api/endpoints/objects_vsp/space/UpdateSpaceTest.java @@ -0,0 +1,79 @@ +package com.pubnub.api.endpoints.objects_vsp.space; + +import com.pubnub.api.PubNubException; +import com.pubnub.api.SpaceId; +import com.pubnub.api.endpoints.objects_api.BaseObjectApiTest; +import com.pubnub.api.managers.token_manager.TokenManager; +import com.pubnub.api.models.consumer.objects_vsp.space.Space; +import com.pubnub.api.models.server.objects_api.EntityEnvelope; +import com.pubnub.api.models.server.objects_vsp.space.UpdateSpacePayload; +import com.pubnub.api.services.vsp.SpaceService; +import org.junit.Before; +import org.junit.Test; +import org.mockito.ArgumentCaptor; +import org.mockito.Mock; +import retrofit2.Call; +import retrofit2.Response; + +import java.util.HashMap; +import java.util.Map; + +import static org.junit.Assert.assertEquals; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +public class UpdateSpaceTest extends BaseObjectApiTest { + private UpdateSpace objectUnderTest; + + @Mock + private SpaceService spaceServiceMock; + + @Mock + private Call> call; + + @Before + public void setUp() throws Exception { + objectUnderTest = UpdateSpace.create(new SpaceId(testSpaceIdValue), pubNubMock, telemetryManagerMock, retrofitManagerMock, new TokenManager()); + + + when(retrofitManagerMock.getSpaceService()).thenReturn(spaceServiceMock); + when(spaceServiceMock.updateSpace(eq(testSubscriptionKey), eq(testSpaceIdValue), any(), any())).thenReturn(call); + when(call.execute()).thenReturn(Response.success(new EntityEnvelope<>())); + } + + @Test + public void can_updateSpace() throws PubNubException { + //given + String updatedName = "updatedName"; + String updatedDescription = "updatedDescription"; + Map updatedCustom = new HashMap<>(); + updatedCustom.putIfAbsent("user_param1", "val1"); + updatedCustom.putIfAbsent("user_param2", "val2"); + String updatedStatus = "updatedStatus"; + String updatedType = "updatedType"; + + //when + objectUnderTest + .name(updatedName) + .description(updatedDescription) + .custom(updatedCustom) + .status(updatedStatus) + .type(updatedType) + .sync(); + + //then + ArgumentCaptor updateSpacePayloadCaptor = ArgumentCaptor.forClass(UpdateSpacePayload.class); + verify(spaceServiceMock, times(1)).updateSpace(eq(testSubscriptionKey), eq(testSpaceIdValue), updateSpacePayloadCaptor.capture(), any()); + + UpdateSpacePayload captorValue = updateSpacePayloadCaptor.getValue(); + assertEquals(updatedName, captorValue.getName()); + assertEquals(updatedDescription, captorValue.getDescription()); + assertEquals(updatedCustom, captorValue.getCustom()); + assertEquals(updatedStatus, captorValue.getStatus()); + assertEquals(updatedType, captorValue.getType()); + + } +} diff --git a/src/test/java/com/pubnub/api/endpoints/objects_vsp/space/UpsertSpaceTest.java b/src/test/java/com/pubnub/api/endpoints/objects_vsp/space/UpsertSpaceTest.java new file mode 100644 index 000000000..afb70239d --- /dev/null +++ b/src/test/java/com/pubnub/api/endpoints/objects_vsp/space/UpsertSpaceTest.java @@ -0,0 +1,77 @@ +package com.pubnub.api.endpoints.objects_vsp.space; + +import com.pubnub.api.PubNubException; +import com.pubnub.api.SpaceId; +import com.pubnub.api.endpoints.objects_api.BaseObjectApiTest; +import com.pubnub.api.managers.token_manager.TokenManager; +import com.pubnub.api.models.consumer.objects_vsp.space.Space; +import com.pubnub.api.models.server.objects_api.EntityEnvelope; +import com.pubnub.api.models.server.objects_vsp.space.UpsertSpacePayload; +import com.pubnub.api.services.vsp.SpaceService; +import org.junit.Before; +import org.junit.Test; +import org.mockito.ArgumentCaptor; +import org.mockito.Mock; +import retrofit2.Call; +import retrofit2.Response; + +import java.util.HashMap; +import java.util.Map; + +import static org.junit.Assert.assertEquals; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +public class UpsertSpaceTest extends BaseObjectApiTest { + private UpsertSpace objectUnderTest; + + @Mock + private SpaceService spaceServiceMock; + + @Mock + private Call> call; + + @Before + public void setUp() throws Exception { + objectUnderTest = UpsertSpace.create(new SpaceId(testSpaceIdValue), pubNubMock, telemetryManagerMock, retrofitManagerMock, new TokenManager()); + + when(retrofitManagerMock.getSpaceService()).thenReturn(spaceServiceMock); + when(spaceServiceMock.upsertSpace(eq(testSubscriptionKey), eq(testSpaceIdValue), any(), any())).thenReturn(call); + when(call.execute()).thenReturn(Response.success(new EntityEnvelope<>())); + } + + @Test + public void can_upsertSpace() throws PubNubException { + //given + String updatedName = "updatedName"; + String updatedDescription = "updatedDescription"; + Map updatedCustom = new HashMap<>(); + updatedCustom.putIfAbsent("user_param1", "val1"); + updatedCustom.putIfAbsent("user_param2", "val2"); + String updatedStatus = "updatedStatus"; + String updatedType = "updatedType"; + + //when + objectUnderTest + .name(updatedName) + .description(updatedDescription) + .custom(updatedCustom) + .status(updatedStatus) + .type(updatedType) + .sync(); + + //then + ArgumentCaptor upsertSpacePayloadCaptor = ArgumentCaptor.forClass(UpsertSpacePayload.class); + verify(spaceServiceMock, times(1)).upsertSpace(eq(testSubscriptionKey), eq(testSpaceIdValue), upsertSpacePayloadCaptor.capture(), any()); + + UpsertSpacePayload captorValue = upsertSpacePayloadCaptor.getValue(); + assertEquals(updatedName, captorValue.getName()); + assertEquals(updatedDescription, captorValue.getDescription()); + assertEquals(updatedCustom, captorValue.getCustom()); + assertEquals(updatedStatus, captorValue.getStatus()); + assertEquals(updatedType, captorValue.getType()); + } +} \ No newline at end of file diff --git a/src/test/java/com/pubnub/api/endpoints/objects_vsp/user/CreateUserTest.java b/src/test/java/com/pubnub/api/endpoints/objects_vsp/user/CreateUserTest.java new file mode 100644 index 000000000..b6ec60b80 --- /dev/null +++ b/src/test/java/com/pubnub/api/endpoints/objects_vsp/user/CreateUserTest.java @@ -0,0 +1,167 @@ +package com.pubnub.api.endpoints.objects_vsp.user; + +import com.pubnub.api.PubNubException; +import com.pubnub.api.UserId; +import com.pubnub.api.endpoints.objects_api.BaseObjectApiTest; +import com.pubnub.api.managers.token_manager.TokenManager; +import com.pubnub.api.models.consumer.objects_vsp.user.User; +import com.pubnub.api.models.server.objects_api.EntityEnvelope; +import com.pubnub.api.models.server.objects_vsp.user.CreateUserPayload; +import com.pubnub.api.services.vsp.UserService; +import org.apache.commons.lang3.RandomStringUtils; +import org.junit.Before; +import org.junit.Test; +import org.mockito.ArgumentCaptor; +import org.mockito.Mock; +import retrofit2.Call; +import retrofit2.Response; + +import java.io.IOException; +import java.util.HashMap; +import java.util.Map; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.mockito.Mockito.*; + +public class CreateUserTest extends BaseObjectApiTest { + private CreateUser objectUnderTest; + @Mock + private UserService userServiceMock; + @Mock + private Call> call; + + + @Before + public void setUp() throws IOException, PubNubException { + objectUnderTest = CreateUser.create(pubNubMock, telemetryManagerMock, retrofitManagerMock, new TokenManager()); + + when(retrofitManagerMock.getUserService()).thenReturn(userServiceMock); + when(userServiceMock.createUser(eq(testSubscriptionKey), eq(testUserIdValue), any(), any())).thenReturn(call); + when(call.execute()).thenReturn(Response.success(new EntityEnvelope<>())); + } + + @Test + public void can_createUser_with_userId() throws PubNubException { + //given + + //when + objectUnderTest.userId(new UserId(testUserIdValue)).sync(); + + //then + verify(userServiceMock, times(1)).createUser(eq(testSubscriptionKey), eq(testUserIdValue), any(), any()); + } + + @Test + public void can_createUser_with_name() throws PubNubException { + //given + final String userName = RandomStringUtils.randomAlphabetic(20); + + //when + objectUnderTest.name(userName).sync(); + + //then + ArgumentCaptor createUserPayloadCaptor = ArgumentCaptor.forClass(CreateUserPayload.class); + verify(userServiceMock).createUser(eq(testSubscriptionKey), eq(testUserIdValue), createUserPayloadCaptor.capture(), any()); + + final CreateUserPayload capturedCreateUserPayload = createUserPayloadCaptor.getValue(); + assertEquals(userName, capturedCreateUserPayload.getName()); + } + + @Test + public void can_createUser_with_email() throws PubNubException { + //given + final String testEmail = RandomStringUtils.randomAlphabetic(10) + "@example.com"; + + //when + objectUnderTest.email(testEmail).sync(); + + //then + ArgumentCaptor createUserPayloadArgumentCaptor = ArgumentCaptor.forClass(CreateUserPayload.class); + verify(userServiceMock, times(1)).createUser(eq(testSubscriptionKey), eq(testUserIdValue), createUserPayloadArgumentCaptor.capture(), any()); + + final CreateUserPayload capturedCreateUserPayload = createUserPayloadArgumentCaptor.getValue(); + assertEquals(testEmail, capturedCreateUserPayload.getEmail()); + } + + @Test + public void can_createUser_with_externalId() throws PubNubException { + //given + String testExternalId = RandomStringUtils.randomAlphabetic(20); + + //when + objectUnderTest.externalId(testExternalId).sync(); + + //then + ArgumentCaptor createUserPayloadArgumentCaptor = ArgumentCaptor.forClass(CreateUserPayload.class); + verify(userServiceMock, times(1)).createUser(eq(testSubscriptionKey), eq(testUserIdValue), createUserPayloadArgumentCaptor.capture(), any()); + + final CreateUserPayload capturedCreateUserPayload = createUserPayloadArgumentCaptor.getValue(); + assertEquals(testExternalId, capturedCreateUserPayload.getExternalId()); + } + + @Test + public void can_createUser_with_profileUrl() throws PubNubException { + //given + final String profileUrl = "http://" + RandomStringUtils.randomAlphabetic(5) + ".example.com"; + + //when + objectUnderTest.profileUrl(profileUrl).sync(); + + //then + ArgumentCaptor createUserPayloadArgumentCaptor = ArgumentCaptor.forClass(CreateUserPayload.class); + verify(userServiceMock, times(1)).createUser(eq(testSubscriptionKey), eq(testUserIdValue), createUserPayloadArgumentCaptor.capture(), any()); + + final CreateUserPayload capturedCreateUserPayload = createUserPayloadArgumentCaptor.getValue(); + assertEquals(profileUrl, capturedCreateUserPayload.getProfileUrl()); + } + + @Test + public void can_createUser_with_custom() throws PubNubException { + //given + final Map testCustom = new HashMap<>(); + testCustom.put("key1", RandomStringUtils.random(10)); + testCustom.put("key2", RandomStringUtils.random(10)); + + //when + objectUnderTest.custom(testCustom).sync(); + + //then + ArgumentCaptor createUserPayloadArgumentCaptor = ArgumentCaptor.forClass(CreateUserPayload.class); + verify(userServiceMock, times(1)).createUser(eq(testSubscriptionKey), eq(testUserIdValue), createUserPayloadArgumentCaptor.capture(), any()); + + final CreateUserPayload capturedCreateUserPayload = createUserPayloadArgumentCaptor.getValue(); + assertEquals(testCustom, capturedCreateUserPayload.getCustom()); + } + + @Test + public void can_createUser_with_status() throws PubNubException { + //given + final String testStatus = "active_" + RandomStringUtils.randomAlphabetic(5); + + //when + objectUnderTest.status(testStatus).sync(); + + //then + ArgumentCaptor createUserPayloadArgumentCaptor = ArgumentCaptor.forClass(CreateUserPayload.class); + verify(userServiceMock, times(1)).createUser(eq(testSubscriptionKey), eq(testUserIdValue), createUserPayloadArgumentCaptor.capture(), any()); + + final CreateUserPayload capturedCreateUserPayload = createUserPayloadArgumentCaptor.getValue(); + assertEquals(testStatus, capturedCreateUserPayload.getStatus()); + } + + @Test + public void can_createUser_with_type() throws PubNubException { + //given + final String testType = "type" + RandomStringUtils.randomAlphabetic(5); + + //when + objectUnderTest.type(testType).sync(); + + //then + ArgumentCaptor createUserPayloadArgumentCaptor = ArgumentCaptor.forClass(CreateUserPayload.class); + verify(userServiceMock, times(1)).createUser(eq(testSubscriptionKey), eq(testUserIdValue), createUserPayloadArgumentCaptor.capture(), any()); + + final CreateUserPayload capturedCreateUserPayload = createUserPayloadArgumentCaptor.getValue(); + assertEquals(testType, capturedCreateUserPayload.getType()); + } +} diff --git a/src/test/java/com/pubnub/api/endpoints/objects_vsp/user/FetchUserTest.java b/src/test/java/com/pubnub/api/endpoints/objects_vsp/user/FetchUserTest.java new file mode 100644 index 000000000..8a30a09d3 --- /dev/null +++ b/src/test/java/com/pubnub/api/endpoints/objects_vsp/user/FetchUserTest.java @@ -0,0 +1,47 @@ +package com.pubnub.api.endpoints.objects_vsp.user; + +import com.pubnub.api.PubNubException; +import com.pubnub.api.UserId; +import com.pubnub.api.endpoints.objects_api.BaseObjectApiTest; +import com.pubnub.api.managers.token_manager.TokenManager; +import com.pubnub.api.models.consumer.objects_vsp.user.User; +import com.pubnub.api.models.server.objects_api.EntityEnvelope; +import com.pubnub.api.services.vsp.UserService; +import org.junit.Before; +import org.junit.Test; +import org.mockito.Mock; +import retrofit2.Call; +import retrofit2.Response; + +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.*; + +public class FetchUserTest extends BaseObjectApiTest { + private FetchUser objectUnderTest; + + @Mock + private UserService userServiceMock; + + @Mock + private Call> call; + + @Before + public void setUp() throws Exception { + objectUnderTest = FetchUser.create(pubNubMock, telemetryManagerMock, retrofitManagerMock, new TokenManager()); + when(retrofitManagerMock.getUserService()).thenReturn(userServiceMock); + when(userServiceMock.fetchUser(eq(testSubscriptionKey), eq(testUserIdValue), any())).thenReturn(call); + when(call.execute()).thenReturn(Response.success(new EntityEnvelope<>())); + } + + @Test + public void can_fetch_user() throws PubNubException { + //given + + //when + objectUnderTest.userId(new UserId(testUserIdValue)).sync(); + + //then + verify(userServiceMock, times(1)).fetchUser(eq(testSubscriptionKey), eq(testUserIdValue), any()); + } +} \ No newline at end of file diff --git a/src/test/java/com/pubnub/api/endpoints/objects_vsp/user/RemoveUserTest.java b/src/test/java/com/pubnub/api/endpoints/objects_vsp/user/RemoveUserTest.java new file mode 100644 index 000000000..4b6f3b20d --- /dev/null +++ b/src/test/java/com/pubnub/api/endpoints/objects_vsp/user/RemoveUserTest.java @@ -0,0 +1,62 @@ +package com.pubnub.api.endpoints.objects_vsp.user; + +import com.google.gson.JsonElement; +import com.pubnub.api.PubNubException; +import com.pubnub.api.UserId; +import com.pubnub.api.endpoints.objects_api.BaseObjectApiTest; +import com.pubnub.api.managers.token_manager.TokenManager; +import com.pubnub.api.models.consumer.objects_vsp.user.RemoveUserResult; +import com.pubnub.api.models.server.objects_api.EntityEnvelope; +import com.pubnub.api.services.vsp.UserService; +import org.junit.Before; +import org.junit.Test; +import org.mockito.Mock; +import retrofit2.Call; +import retrofit2.Response; + +import java.io.IOException; + +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.*; + +public class RemoveUserTest extends BaseObjectApiTest { + private RemoveUser objectUnderTest; + + @Mock + private UserService userServiceMock; + + @Mock + private Call> call; + + + @Before + public void setUp() throws Exception { + objectUnderTest = new RemoveUser(pubNubMock, telemetryManagerMock, retrofitManagerMock, new TokenManager()); + when(retrofitManagerMock.getUserService()).thenReturn(userServiceMock); + when(userServiceMock.removeUser(eq(testSubscriptionKey), eq(testUserIdValue), any())).thenReturn(call); + when(call.execute()).thenReturn(Response.success(new RemoveUserResult())); + } + + @Test + public void can_remove_user() throws PubNubException, IOException { + //given + + //when + objectUnderTest.userId(new UserId(testUserIdValue)).sync(); + + //then + verify(userServiceMock, times(1)).removeUser(eq(testSubscriptionKey), eq(testUserIdValue), any()); + } + + @Test + public void can_remove_user_taking_userId_from_config() throws PubNubException, IOException { + //given + + //when + objectUnderTest.sync(); + + //then + verify(userServiceMock, times(1)).removeUser(eq(testSubscriptionKey), eq(testUserIdValue), any()); + } +} diff --git a/src/test/java/com/pubnub/api/endpoints/objects_vsp/user/UpdateUserTest.java b/src/test/java/com/pubnub/api/endpoints/objects_vsp/user/UpdateUserTest.java new file mode 100644 index 000000000..5cc4bb2eb --- /dev/null +++ b/src/test/java/com/pubnub/api/endpoints/objects_vsp/user/UpdateUserTest.java @@ -0,0 +1,122 @@ +package com.pubnub.api.endpoints.objects_vsp.user; + +import com.pubnub.api.PubNubException; +import com.pubnub.api.UserId; +import com.pubnub.api.endpoints.objects_api.BaseObjectApiTest; +import com.pubnub.api.managers.token_manager.TokenManager; +import com.pubnub.api.models.consumer.objects_vsp.user.User; +import com.pubnub.api.models.server.objects_api.EntityEnvelope; +import com.pubnub.api.models.server.objects_vsp.user.UpdateUserPayload; +import com.pubnub.api.services.vsp.UserService; +import org.junit.Before; +import org.junit.Test; +import org.mockito.ArgumentCaptor; +import org.mockito.Mock; +import retrofit2.Call; +import retrofit2.Response; + +import java.util.HashMap; +import java.util.Map; + +import static org.junit.Assert.assertEquals; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.*; + +public class UpdateUserTest extends BaseObjectApiTest { + private UpdateUser objectUnderTest; + + @Mock + private UserService userServiceMock; + + @Mock + private Call> call; + + @Before + public void setUp() throws Exception { + objectUnderTest = UpdateUser.create(pubNubMock, telemetryManagerMock, retrofitManagerMock, new TokenManager()); + when(retrofitManagerMock.getUserService()).thenReturn(userServiceMock); + when(userServiceMock.updateUser(eq(testSubscriptionKey), eq(testUserIdValue), any(), any())).thenReturn(call); + when(call.execute()).thenReturn(Response.success(new EntityEnvelope<>())); + } + + @Test + public void can_update_user_passing_full_object() throws PubNubException { + //given + String updatedName = "updatedName"; + String updatedEmail = "updatedEmail"; + String updatedProfileUrl = "updatedProfileUrl"; + String updatedExternalId = "updatedExternalId"; + Map updatedCustom = new HashMap<>(); + updatedCustom.putIfAbsent("user_param1", "val1"); + updatedCustom.putIfAbsent("user_param2", "val2"); + String updatedStatus = "updatedStatus"; + String updatedType = "updatedType"; + + + //when + objectUnderTest + .userId(new UserId(testUserIdValue)) + .name(updatedName) + .email(updatedEmail) + .profileUrl(updatedProfileUrl) + .externalId(updatedExternalId) + .custom(updatedCustom) + .includeCustom(false) + .status(updatedStatus) + .type(updatedType) + .sync(); + + //then + ArgumentCaptor updateUserPayloadCaptor = ArgumentCaptor.forClass(UpdateUserPayload.class); + verify(userServiceMock, times(1)).updateUser(eq(testSubscriptionKey), eq(testUserIdValue), updateUserPayloadCaptor.capture(), any()); + + UpdateUserPayload captorValue = updateUserPayloadCaptor.getValue(); + assertEquals(updatedName, captorValue.getName()); + assertEquals(updatedEmail, captorValue.getEmail()); + assertEquals(updatedProfileUrl, captorValue.getProfileUrl()); + assertEquals(updatedExternalId, captorValue.getExternalId()); + assertEquals(updatedCustom, captorValue.getCustom()); + assertEquals(updatedStatus, captorValue.getStatus()); + assertEquals(updatedType, captorValue.getType()); + } + + + @Test + public void can_update_user_with_new_name() throws PubNubException { + //given + String updatedName = "updatedName"; + + //when + objectUnderTest + .userId(new UserId(testUserIdValue)) + .name(updatedName) + .sync(); + + //then + ArgumentCaptor updateUserPayloadCaptor = ArgumentCaptor.forClass(UpdateUserPayload.class); + verify(userServiceMock, times(1)).updateUser(eq(testSubscriptionKey), eq(testUserIdValue), updateUserPayloadCaptor.capture(), any()); + + UpdateUserPayload captorValue = updateUserPayloadCaptor.getValue(); + assertEquals(updatedName, captorValue.getName()); + } + + @Test + public void can_update_user_with_new_email() throws PubNubException { + //given + String updatedEmail = "updatedEmail"; + + //when + objectUnderTest + .userId(new UserId(testUserIdValue)) + .email(updatedEmail) + .sync(); + + //then + ArgumentCaptor updateUserPayloadCaptor = ArgumentCaptor.forClass(UpdateUserPayload.class); + verify(userServiceMock).updateUser(eq(testSubscriptionKey), eq(testUserIdValue), updateUserPayloadCaptor.capture(), any()); + + UpdateUserPayload captorValue = updateUserPayloadCaptor.getValue(); + assertEquals(updatedEmail, captorValue.getEmail()); + } +} \ No newline at end of file diff --git a/src/test/java/com/pubnub/api/endpoints/objects_vsp/user/UpsertUserTest.java b/src/test/java/com/pubnub/api/endpoints/objects_vsp/user/UpsertUserTest.java new file mode 100644 index 000000000..10ed740f2 --- /dev/null +++ b/src/test/java/com/pubnub/api/endpoints/objects_vsp/user/UpsertUserTest.java @@ -0,0 +1,80 @@ +package com.pubnub.api.endpoints.objects_vsp.user; + +import com.pubnub.api.PubNubException; +import com.pubnub.api.UserId; +import com.pubnub.api.endpoints.objects_api.BaseObjectApiTest; +import com.pubnub.api.managers.token_manager.TokenManager; +import com.pubnub.api.models.consumer.objects_vsp.user.User; +import com.pubnub.api.models.server.objects_api.EntityEnvelope; +import com.pubnub.api.models.server.objects_vsp.user.UpsertUserPayload; +import com.pubnub.api.services.vsp.UserService; +import org.junit.Before; +import org.junit.Test; +import org.mockito.ArgumentCaptor; +import org.mockito.Mock; +import retrofit2.Call; +import retrofit2.Response; + +import java.util.HashMap; +import java.util.Map; + +import static org.junit.Assert.assertEquals; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +public class UpsertUserTest extends BaseObjectApiTest { + private UpsertUser objectUnderTest; + + @Mock + private UserService userServiceMock; + @Mock + private Call> call; + + @Before + public void setUp() throws Exception { + objectUnderTest = UpsertUser.create(pubNubMock, telemetryManagerMock, retrofitManagerMock, new TokenManager()); + + when(retrofitManagerMock.getUserService()).thenReturn(userServiceMock); + when(userServiceMock.upsertUser(eq(testSubscriptionKey), eq(testUserIdValue), any(), any())).thenReturn(call); + when(call.execute()).thenReturn(Response.success(new EntityEnvelope<>())); + } + + @Test + public void can_upsertUser() throws PubNubException { + String updatedName = "updatedName"; + String updatedEmail = "updatedEmail"; + String updatedProfileUrl = "updatedProfileUrl"; + String updatedExternalId = "updatedExternalId"; + Map updatedCustom = new HashMap<>(); + updatedCustom.putIfAbsent("user_param1", "val1"); + updatedCustom.putIfAbsent("user_param2", "val2"); + String updatedStatus = "updatedStatus"; + String updatedType = "updatedType"; + + objectUnderTest + .userId(new UserId(testUserIdValue)) + .name(updatedName) + .email(updatedEmail) + .profileUrl(updatedProfileUrl) + .externalId(updatedExternalId) + .custom(updatedCustom) + .includeCustom(false) + .status(updatedStatus) + .type(updatedType) + .sync(); + + ArgumentCaptor upsertUserPayloadCaptor = ArgumentCaptor.forClass(UpsertUserPayload.class); + verify(userServiceMock).upsertUser(eq(testSubscriptionKey), eq(testUserIdValue), upsertUserPayloadCaptor.capture(), any()); + + UpsertUserPayload captorValue = upsertUserPayloadCaptor.getValue(); + assertEquals(updatedName, captorValue.getName()); + assertEquals(updatedEmail, captorValue.getEmail()); + assertEquals(updatedProfileUrl, captorValue.getProfileUrl()); + assertEquals(updatedExternalId, captorValue.getExternalId()); + assertEquals(updatedCustom, captorValue.getCustom()); + assertEquals(updatedStatus, captorValue.getStatus()); + assertEquals(updatedType, captorValue.getType()); + } +} \ No newline at end of file