diff --git a/CHANGELOG.md b/CHANGELOG.md index 3c31d97..c60fc56 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,7 +4,13 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/) and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html). ## [3.0.0-RC3-SNAPSHOT] +### Added +- Subusers API + ### Changed +- `pl.smsapi.api.UserFactory.actionAdd` marked as deprecated, use `pl.smsapi.api.action.subusers.SubusersFactory.actionAdd` instead +- `pl.smsapi.api.UserFactory.actionEdit` marked as deprecated, use `pl.smsapi.api.action.subusers.SubusersFactory.actionEdit` instead +- `pl.smsapi.api.UserFactory.actionList` marked as deprecated, use `pl.smsapi.api.action.subusers.SubusersFactory.actionList` instead - `pl.smsapi.BasicAuthClient` marked as deprecated - non-proxy action factories marked as deprecated diff --git a/src/main/java/pl/smsapi/api/UserFactory.java b/src/main/java/pl/smsapi/api/UserFactory.java index dfbe5fe..db5be7c 100644 --- a/src/main/java/pl/smsapi/api/UserFactory.java +++ b/src/main/java/pl/smsapi/api/UserFactory.java @@ -1,6 +1,7 @@ package pl.smsapi.api; import pl.smsapi.Client; +import pl.smsapi.api.action.subusers.SubusersFactory; import pl.smsapi.api.action.user.UserAdd; import pl.smsapi.api.action.user.UserEdit; import pl.smsapi.api.action.user.UserGetPoints; @@ -21,6 +22,10 @@ public UserFactory(Client client, Proxy proxy) { super(client, proxy); } + /** + * @deprecated use {@link SubusersFactory#actionList()} instead + */ + @Deprecated public UserList actionList() { UserList action = new UserList(); action.client(client); @@ -28,6 +33,10 @@ public UserList actionList() { return action; } + /** + * @deprecated use {@link SubusersFactory#actionAdd(String, String)} ()} instead + */ + @Deprecated public UserAdd actionAdd() { UserAdd action = new UserAdd(); action.client(client); @@ -35,6 +44,10 @@ public UserAdd actionAdd() { return action; } + /** + * @deprecated use {@link SubusersFactory#actionEdit(String)} ()} instead + */ + @Deprecated public UserEdit actionEdit(String username) { UserEdit action = new UserEdit(); action.client(client); diff --git a/src/main/java/pl/smsapi/api/action/AbstractAction.java b/src/main/java/pl/smsapi/api/action/AbstractAction.java index 83aec81..5b6f0e2 100644 --- a/src/main/java/pl/smsapi/api/action/AbstractAction.java +++ b/src/main/java/pl/smsapi/api/action/AbstractAction.java @@ -4,6 +4,7 @@ import org.json.JSONObject; import pl.smsapi.Client; import pl.smsapi.api.authenticationStrategy.AuthenticationStrategy; +import pl.smsapi.api.response.Response; import pl.smsapi.exception.*; import pl.smsapi.proxy.Proxy; @@ -14,7 +15,7 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; -public abstract class AbstractAction { +public abstract class AbstractAction { public final static String RESPONSE_PACKAGE_NAME = "pl.smsapi.api.response"; diff --git a/src/main/java/pl/smsapi/api/action/AbstractSendAction.java b/src/main/java/pl/smsapi/api/action/AbstractSendAction.java index 598036c..aae5ab4 100644 --- a/src/main/java/pl/smsapi/api/action/AbstractSendAction.java +++ b/src/main/java/pl/smsapi/api/action/AbstractSendAction.java @@ -1,10 +1,11 @@ package pl.smsapi.api.action; import pl.smsapi.StringUtils; +import pl.smsapi.api.response.Response; import java.util.Calendar; -public abstract class AbstractSendAction extends AbstractAction { +public abstract class AbstractSendAction extends AbstractAction { /** * Set mobile phone number of the recipients. diff --git a/src/main/java/pl/smsapi/api/action/subusers/Subuser.java b/src/main/java/pl/smsapi/api/action/subusers/Subuser.java new file mode 100644 index 0000000..32b567d --- /dev/null +++ b/src/main/java/pl/smsapi/api/action/subusers/Subuser.java @@ -0,0 +1,35 @@ +package pl.smsapi.api.action.subusers; + +import org.json.JSONObject; +import pl.smsapi.api.response.Response; + +public class Subuser implements Response { + public final String id; + public final String username; + public final boolean active; + public final String description; + public final double pointsFromAccount; + public final double pointsPerMonth; + + private Subuser(String id, String username, boolean active, String description, double pointsFromAccount, double pointsPerMonth) { + this.id = id; + this.username = username; + this.active = active; + this.description = description; + this.pointsFromAccount = pointsFromAccount; + this.pointsPerMonth = pointsPerMonth; + } + + static class SubuserFromJsonFactory { + public Subuser createFrom(JSONObject jsonObject) { + return new Subuser( + jsonObject.getString("id"), + jsonObject.getString("username"), + jsonObject.getBoolean("active"), + jsonObject.optString("description"), + jsonObject.getJSONObject("points").getDouble("from_account"), + jsonObject.getJSONObject("points").getDouble("per_month") + ); + } + } +} diff --git a/src/main/java/pl/smsapi/api/action/subusers/SubuserAdd.java b/src/main/java/pl/smsapi/api/action/subusers/SubuserAdd.java new file mode 100644 index 0000000..3e126ce --- /dev/null +++ b/src/main/java/pl/smsapi/api/action/subusers/SubuserAdd.java @@ -0,0 +1,45 @@ +package pl.smsapi.api.action.subusers; + +import org.json.JSONObject; +import pl.smsapi.api.action.AbstractAction; + +public class SubuserAdd extends AbstractAction { + public SubuserAdd(String username, String password) { + params.put("credentials[username]", username); + params.put("credentials[password]", password); + } + + @Override + protected String endPoint() { + return "subusers"; + } + + @Override + protected Subuser createResponse(String data) { + return new Subuser.SubuserFromJsonFactory().createFrom(new JSONObject(data)); + } + + public void withApiPassword(String apiPassword) { + params.put("credentials[api_password]", apiPassword); + } + + public void asActive() { + params.put("active", "1"); + } + + public void asInactive() { + params.put("active", "0"); + } + + public void withDescription(String description) { + params.put("description", description); + } + + public void withPointsFromAccount(double pointsFromAccount) { + params.put("points[from_account]", String.valueOf(pointsFromAccount)); + } + + public void withPointsPerMonth(double pointsPerMonth) { + params.put("points[per_month]", String.valueOf(pointsPerMonth)); + } +} diff --git a/src/main/java/pl/smsapi/api/action/subusers/SubuserDelete.java b/src/main/java/pl/smsapi/api/action/subusers/SubuserDelete.java new file mode 100644 index 0000000..1043fc6 --- /dev/null +++ b/src/main/java/pl/smsapi/api/action/subusers/SubuserDelete.java @@ -0,0 +1,27 @@ +package pl.smsapi.api.action.subusers; + +import pl.smsapi.api.action.AbstractAction; +import pl.smsapi.api.response.Response; + +public class SubuserDelete extends AbstractAction { + private final String id; + + public SubuserDelete(String id) { + this.id = id; + } + + @Override + protected String endPoint() { + return "subusers/" + id; + } + + @Override + protected String httpMethod() { + return "DELETE"; + } + + @Override + protected Response createResponse(String data) { + return null; + } +} diff --git a/src/main/java/pl/smsapi/api/action/subusers/SubuserEdit.java b/src/main/java/pl/smsapi/api/action/subusers/SubuserEdit.java new file mode 100644 index 0000000..c27d49c --- /dev/null +++ b/src/main/java/pl/smsapi/api/action/subusers/SubuserEdit.java @@ -0,0 +1,55 @@ +package pl.smsapi.api.action.subusers; + +import org.json.JSONObject; +import pl.smsapi.api.action.AbstractAction; + +public class SubuserEdit extends AbstractAction { + private final String id; + + public SubuserEdit(String id) { + this.id = id; + } + + @Override + protected String endPoint() { + return "subusers/" + id; + } + + @Override + protected String httpMethod() { + return "PUT"; + } + + @Override + protected Subuser createResponse(String data) { + return new Subuser.SubuserFromJsonFactory().createFrom(new JSONObject(data)); + } + + public void withPassword(String password) { + params.put("credentials[password]", password); + } + + public void withApiPassword(String apiPassword) { + params.put("credentials[api_password]", apiPassword); + } + + public void asActive() { + params.put("active", "1"); + } + + public void asInactive() { + params.put("active", "0"); + } + + public void withDescription(String description) { + params.put("description", description); + } + + public void withPointsFromAccount(double pointsFromAccount) { + params.put("points[from_account]", String.valueOf(pointsFromAccount)); + } + + public void withPointsPerMonth(double pointsPerMonth) { + params.put("points[per_month]", String.valueOf(pointsPerMonth)); + } +} diff --git a/src/main/java/pl/smsapi/api/action/subusers/SubuserGet.java b/src/main/java/pl/smsapi/api/action/subusers/SubuserGet.java new file mode 100644 index 0000000..1a0aa72 --- /dev/null +++ b/src/main/java/pl/smsapi/api/action/subusers/SubuserGet.java @@ -0,0 +1,27 @@ +package pl.smsapi.api.action.subusers; + +import org.json.JSONObject; +import pl.smsapi.api.action.AbstractAction; + +public class SubuserGet extends AbstractAction { + private final String id; + + public SubuserGet(String id) { + this.id = id; + } + + @Override + protected String endPoint() { + return "subusers/" + id; + } + + @Override + protected String httpMethod() { + return "GET"; + } + + @Override + protected Subuser createResponse(String data) { + return new Subuser.SubuserFromJsonFactory().createFrom(new JSONObject(data)); + } +} diff --git a/src/main/java/pl/smsapi/api/action/subusers/Subusers.java b/src/main/java/pl/smsapi/api/action/subusers/Subusers.java new file mode 100644 index 0000000..e9bd217 --- /dev/null +++ b/src/main/java/pl/smsapi/api/action/subusers/Subusers.java @@ -0,0 +1,25 @@ +package pl.smsapi.api.action.subusers; + +import org.json.JSONArray; +import org.json.JSONObject; +import pl.smsapi.api.response.ListResponse; + +public class Subusers extends ListResponse { + private Subusers(int count, JSONArray jsonArray) { + super(count, jsonArray); + } + + @Override + protected Subuser buildItem(JSONObject jsonObject) { + return new Subuser.SubuserFromJsonFactory().createFrom(jsonObject); + } + + static class SubusersFromJsonFactory { + public Subusers createFrom(JSONObject jsonObject) { + return new Subusers( + jsonObject.getInt("size"), + jsonObject.getJSONArray("collection") + ); + } + } +} diff --git a/src/main/java/pl/smsapi/api/action/subusers/SubusersFactory.java b/src/main/java/pl/smsapi/api/action/subusers/SubusersFactory.java new file mode 100644 index 0000000..439a59c --- /dev/null +++ b/src/main/java/pl/smsapi/api/action/subusers/SubusersFactory.java @@ -0,0 +1,47 @@ +package pl.smsapi.api.action.subusers; + +import pl.smsapi.Client; +import pl.smsapi.api.ActionFactory; +import pl.smsapi.proxy.Proxy; + +public class SubusersFactory extends ActionFactory { + + public SubusersFactory(Client client, Proxy proxy) { + super(client, proxy); + } + + public SubuserAdd actionAdd(String username, String password) { + SubuserAdd action = new SubuserAdd(username, password); + action.client(client); + action.proxy(proxy); + return action; + } + + public SubuserGet actionGet(String id) { + SubuserGet action = new SubuserGet(id); + action.client(client); + action.proxy(proxy); + return action; + } + + public SubuserEdit actionEdit(String id) { + SubuserEdit action = new SubuserEdit(id); + action.client(client); + action.proxy(proxy); + return action; + } + + public SubuserDelete actionDelete(String id) { + SubuserDelete action = new SubuserDelete(id); + action.client(client); + action.proxy(proxy); + return action; + } + + public SubusersList actionList() { + SubusersList action = new SubusersList(); + action.client(client); + action.proxy(proxy); + return action; + } +} diff --git a/src/main/java/pl/smsapi/api/action/subusers/SubusersList.java b/src/main/java/pl/smsapi/api/action/subusers/SubusersList.java new file mode 100644 index 0000000..8ce6537 --- /dev/null +++ b/src/main/java/pl/smsapi/api/action/subusers/SubusersList.java @@ -0,0 +1,21 @@ +package pl.smsapi.api.action.subusers; + +import org.json.JSONObject; +import pl.smsapi.api.action.AbstractAction; + +public class SubusersList extends AbstractAction { + @Override + protected String endPoint() { + return "subusers"; + } + + @Override + protected String httpMethod() { + return "GET"; + } + + @Override + protected Subusers createResponse(String data) { + return new Subusers.SubusersFromJsonFactory().createFrom(new JSONObject(data)); + } +} diff --git a/src/main/java/pl/smsapi/api/action/user/UserAdd.java b/src/main/java/pl/smsapi/api/action/user/UserAdd.java index d061822..a8ac0e9 100644 --- a/src/main/java/pl/smsapi/api/action/user/UserAdd.java +++ b/src/main/java/pl/smsapi/api/action/user/UserAdd.java @@ -1,5 +1,9 @@ package pl.smsapi.api.action.user; +/** + * @deprecated use {@link pl.smsapi.api.action.subusers.SubuserAdd()} instead + */ +@Deprecated public class UserAdd extends AbstractUserControl { /** diff --git a/src/main/java/pl/smsapi/api/action/user/UserEdit.java b/src/main/java/pl/smsapi/api/action/user/UserEdit.java index a9cfea6..e9493b6 100644 --- a/src/main/java/pl/smsapi/api/action/user/UserEdit.java +++ b/src/main/java/pl/smsapi/api/action/user/UserEdit.java @@ -1,5 +1,9 @@ package pl.smsapi.api.action.user; +/** + * @deprecated use {@link pl.smsapi.api.action.subusers.SubuserEdit()} instead + */ +@Deprecated public class UserEdit extends AbstractUserControl { /** diff --git a/src/main/java/pl/smsapi/api/action/user/UserGet.java b/src/main/java/pl/smsapi/api/action/user/UserGet.java index 2fe361e..2ab7178 100644 --- a/src/main/java/pl/smsapi/api/action/user/UserGet.java +++ b/src/main/java/pl/smsapi/api/action/user/UserGet.java @@ -4,6 +4,10 @@ import pl.smsapi.api.action.AbstractAction; import pl.smsapi.api.response.UserResponse; +/** + * @deprecated use {@link pl.smsapi.api.action.subusers.SubuserGet()} instead + */ +@Deprecated public class UserGet extends AbstractAction { public UserGet() { diff --git a/src/main/java/pl/smsapi/api/action/user/UserList.java b/src/main/java/pl/smsapi/api/action/user/UserList.java index e668ec5..bcc7c75 100644 --- a/src/main/java/pl/smsapi/api/action/user/UserList.java +++ b/src/main/java/pl/smsapi/api/action/user/UserList.java @@ -4,6 +4,10 @@ import pl.smsapi.api.action.AbstractAction; import pl.smsapi.api.response.UsersResponse; +/** + * @deprecated use {@link pl.smsapi.api.action.subusers.SubusersList()} instead + */ +@Deprecated public class UserList extends AbstractAction { public UserList() { diff --git a/src/main/java/pl/smsapi/api/response/CountableResponse.java b/src/main/java/pl/smsapi/api/response/CountableResponse.java index bef9bc4..ce73816 100644 --- a/src/main/java/pl/smsapi/api/response/CountableResponse.java +++ b/src/main/java/pl/smsapi/api/response/CountableResponse.java @@ -2,12 +2,16 @@ public class CountableResponse implements Response { - protected int count; + public final int count; public CountableResponse(int count) { this.count = count; } + /** + * @deprecated use {@link #count} instead + */ + @Deprecated public int getCount() { return count; } diff --git a/src/main/java/pl/smsapi/api/response/ListResponse.java b/src/main/java/pl/smsapi/api/response/ListResponse.java index 8557ee0..72d376d 100644 --- a/src/main/java/pl/smsapi/api/response/ListResponse.java +++ b/src/main/java/pl/smsapi/api/response/ListResponse.java @@ -7,7 +7,7 @@ abstract public class ListResponse extends CountableResponse { - private final ArrayList list = new ArrayList<>(); + public final ArrayList list = new ArrayList<>(); public ListResponse(int count, JSONArray jsonArray) { super(count); @@ -23,6 +23,10 @@ public ListResponse(int count, JSONArray jsonArray) { abstract protected T buildItem(JSONObject jsonObject); + /** + * @deprecated use {@link #list} instead + */ + @Deprecated public ArrayList getList() { return list; } diff --git a/src/test/java/pl/smsapi/api/action/subusers/SubuserAddTest.java b/src/test/java/pl/smsapi/api/action/subusers/SubuserAddTest.java new file mode 100644 index 0000000..e2228e9 --- /dev/null +++ b/src/test/java/pl/smsapi/api/action/subusers/SubuserAddTest.java @@ -0,0 +1,95 @@ +package pl.smsapi.api.action.subusers; + +import org.junit.Test; +import pl.smsapi.exception.SmsapiException; +import pl.smsapi.test.doubles.ClientStub; +import pl.smsapi.test.doubles.ProxyRequestSpy; + +import java.util.HashMap; + +import static org.junit.Assert.assertEquals; + +public class SubuserAddTest { + + @Test + public void executeAddSubuserRequest() throws SmsapiException { + ProxyRequestSpy requestStub = new ProxyRequestSpy(SubuserJsonMother.create()); + SubuserAdd action = new SubuserAdd("smsapi-java-client", "StrongPassword123!"); + action.client(new ClientStub()); + action.proxy(requestStub); + + action.execute(); + + assertEquals("POST", requestStub.requestMethod); + assertEquals("subusers", requestStub.requestEndpoint); + HashMap expectedRequestPayload = new HashMap<>(); + expectedRequestPayload.put("credentials[username]", "smsapi-java-client"); + expectedRequestPayload.put("credentials[password]", "StrongPassword123!"); + assertEquals(expectedRequestPayload, requestStub.requestPayload); + } + + @Test + public void executeAddSubuserWithOptionalFieldsRequest() throws SmsapiException { + ProxyRequestSpy requestStub = new ProxyRequestSpy(SubuserJsonMother.create()); + SubuserAdd action = new SubuserAdd("smsapi-java-client", "StrongPassword123!"); + action.client(new ClientStub()); + action.proxy(requestStub); + action.withApiPassword("AnotherStrongPassword123!"); + action.asActive(); + action.withDescription("Resource description"); + action.withPointsFromAccount(11.11); + action.withPointsPerMonth(22.22); + + action.execute(); + + assertEquals("POST", requestStub.requestMethod); + assertEquals("subusers", requestStub.requestEndpoint); + HashMap expectedRequestPayload = new HashMap<>(); + expectedRequestPayload.put("credentials[username]", "smsapi-java-client"); + expectedRequestPayload.put("credentials[password]", "StrongPassword123!"); + expectedRequestPayload.put("credentials[api_password]", "AnotherStrongPassword123!"); + expectedRequestPayload.put("active", "1"); + expectedRequestPayload.put("description", "Resource description"); + expectedRequestPayload.put("points[from_account]", "11.11"); + expectedRequestPayload.put("points[per_month]", "22.22"); + assertEquals(expectedRequestPayload, requestStub.requestPayload); + } + + @Test + public void executeAddSubuserAsActiveRequest() throws SmsapiException { + ProxyRequestSpy requestStub = new ProxyRequestSpy(SubuserJsonMother.create()); + SubuserAdd action = new SubuserAdd("smsapi-java-client", "StrongPassword123!"); + action.client(new ClientStub()); + action.proxy(requestStub); + action.asActive(); + + action.execute(); + + assertEquals("POST", requestStub.requestMethod); + assertEquals("subusers", requestStub.requestEndpoint); + HashMap expectedRequestPayload = new HashMap<>(); + expectedRequestPayload.put("credentials[username]", "smsapi-java-client"); + expectedRequestPayload.put("credentials[password]", "StrongPassword123!"); + expectedRequestPayload.put("active", "1"); + assertEquals(expectedRequestPayload, requestStub.requestPayload); + } + + @Test + public void executeAddSubuserAsInactiveRequest() throws SmsapiException { + ProxyRequestSpy requestStub = new ProxyRequestSpy(SubuserJsonMother.create()); + SubuserAdd action = new SubuserAdd("smsapi-java-client", "StrongPassword123!"); + action.client(new ClientStub()); + action.proxy(requestStub); + action.asInactive(); + + action.execute(); + + assertEquals("POST", requestStub.requestMethod); + assertEquals("subusers", requestStub.requestEndpoint); + HashMap expectedRequestPayload = new HashMap<>(); + expectedRequestPayload.put("credentials[username]", "smsapi-java-client"); + expectedRequestPayload.put("credentials[password]", "StrongPassword123!"); + expectedRequestPayload.put("active", "0"); + assertEquals(expectedRequestPayload, requestStub.requestPayload); + } +} diff --git a/src/test/java/pl/smsapi/api/action/subusers/SubuserDeleteTest.java b/src/test/java/pl/smsapi/api/action/subusers/SubuserDeleteTest.java new file mode 100644 index 0000000..2253188 --- /dev/null +++ b/src/test/java/pl/smsapi/api/action/subusers/SubuserDeleteTest.java @@ -0,0 +1,28 @@ +package pl.smsapi.api.action.subusers; + +import org.junit.Test; +import pl.smsapi.exception.SmsapiException; +import pl.smsapi.test.doubles.ClientStub; +import pl.smsapi.test.doubles.ProxyRequestSpy; + +import java.util.HashMap; + +import static org.junit.Assert.assertEquals; + +public class SubuserDeleteTest { + + @Test + public void executeDeleteSubuserRequest() throws SmsapiException { + ProxyRequestSpy requestStub = new ProxyRequestSpy(SubuserJsonMother.create()); + SubuserDelete action = new SubuserDelete("0f0f0f0f0f0f0f0f0f0f0f0f"); + action.client(new ClientStub()); + action.proxy(requestStub); + + action.execute(); + + assertEquals("DELETE", requestStub.requestMethod); + assertEquals("subusers/0f0f0f0f0f0f0f0f0f0f0f0f", requestStub.requestEndpoint); + HashMap expectedRequestPayload = new HashMap<>(); + assertEquals(expectedRequestPayload, requestStub.requestPayload); + } +} diff --git a/src/test/java/pl/smsapi/api/action/subusers/SubuserEditTest.java b/src/test/java/pl/smsapi/api/action/subusers/SubuserEditTest.java new file mode 100644 index 0000000..7549631 --- /dev/null +++ b/src/test/java/pl/smsapi/api/action/subusers/SubuserEditTest.java @@ -0,0 +1,89 @@ +package pl.smsapi.api.action.subusers; + +import org.junit.Test; +import pl.smsapi.exception.SmsapiException; +import pl.smsapi.test.doubles.ClientStub; +import pl.smsapi.test.doubles.ProxyRequestSpy; + +import java.util.HashMap; + +import static org.junit.Assert.assertEquals; + +public class SubuserEditTest { + + @Test + public void executeEditSubuserRequest() throws SmsapiException { + ProxyRequestSpy requestStub = new ProxyRequestSpy(SubuserJsonMother.create()); + SubuserEdit actionEdit = new SubuserEdit("0f0f0f0f0f0f0f0f0f0f0f0f"); + actionEdit.client(new ClientStub()); + actionEdit.proxy(requestStub); + + actionEdit.execute(); + + assertEquals("PUT", requestStub.requestMethod); + assertEquals("subusers/0f0f0f0f0f0f0f0f0f0f0f0f", requestStub.requestEndpoint); + HashMap expectedRequestPayload = new HashMap<>(); + assertEquals(requestStub.requestPayload, expectedRequestPayload); + } + + @Test + public void executeEditSubuserWithOptionalFieldsRequest() throws SmsapiException { + ProxyRequestSpy requestStub = new ProxyRequestSpy(SubuserJsonMother.create()); + SubuserEdit actionEdit = new SubuserEdit("0f0f0f0f0f0f0f0f0f0f0f0f"); + actionEdit.client(new ClientStub()); + actionEdit.proxy(requestStub); + actionEdit.withPassword("NewStrongPassword123!"); + actionEdit.withApiPassword("NewAnotherStrongPassword123!"); + actionEdit.asActive(); + actionEdit.withDescription("New resource description"); + actionEdit.withPointsFromAccount(999.99); + actionEdit.withPointsPerMonth(111.11); + + actionEdit.execute(); + + assertEquals("PUT", requestStub.requestMethod); + assertEquals("subusers/0f0f0f0f0f0f0f0f0f0f0f0f", requestStub.requestEndpoint); + HashMap expectedRequestPayload = new HashMap<>(); + expectedRequestPayload.put("credentials[password]", "NewStrongPassword123!"); + expectedRequestPayload.put("credentials[api_password]", "NewAnotherStrongPassword123!"); + expectedRequestPayload.put("active", "1"); + expectedRequestPayload.put("description", "New resource description"); + expectedRequestPayload.put("points[from_account]", "999.99"); + expectedRequestPayload.put("points[per_month]", "111.11"); + assertEquals(requestStub.requestPayload, expectedRequestPayload); + } + + @Test + public void executeEditSubuserAsActiveRequest() throws SmsapiException { + ProxyRequestSpy requestStub = new ProxyRequestSpy(SubuserJsonMother.create()); + SubuserEdit actionEdit = new SubuserEdit("0f0f0f0f0f0f0f0f0f0f0f0f"); + actionEdit.client(new ClientStub()); + actionEdit.proxy(requestStub); + actionEdit.asActive(); + + actionEdit.execute(); + + assertEquals("PUT", requestStub.requestMethod); + assertEquals("subusers/0f0f0f0f0f0f0f0f0f0f0f0f", requestStub.requestEndpoint); + HashMap expectedRequestPayload = new HashMap<>(); + expectedRequestPayload.put("active", "1"); + assertEquals(requestStub.requestPayload, expectedRequestPayload); + } + + @Test + public void executeEditSubuserAsInactiveRequest() throws SmsapiException { + ProxyRequestSpy requestStub = new ProxyRequestSpy(SubuserJsonMother.create()); + SubuserEdit actionEdit = new SubuserEdit("0f0f0f0f0f0f0f0f0f0f0f0f"); + actionEdit.client(new ClientStub()); + actionEdit.proxy(requestStub); + actionEdit.asInactive(); + + actionEdit.execute(); + + assertEquals("PUT", requestStub.requestMethod); + assertEquals("subusers/0f0f0f0f0f0f0f0f0f0f0f0f", requestStub.requestEndpoint); + HashMap expectedRequestPayload = new HashMap<>(); + expectedRequestPayload.put("active", "0"); + assertEquals(requestStub.requestPayload, expectedRequestPayload); + } +} diff --git a/src/test/java/pl/smsapi/api/action/subusers/SubuserGetTest.java b/src/test/java/pl/smsapi/api/action/subusers/SubuserGetTest.java new file mode 100644 index 0000000..a579a35 --- /dev/null +++ b/src/test/java/pl/smsapi/api/action/subusers/SubuserGetTest.java @@ -0,0 +1,28 @@ +package pl.smsapi.api.action.subusers; + +import org.junit.Test; +import pl.smsapi.exception.SmsapiException; +import pl.smsapi.test.doubles.ClientStub; +import pl.smsapi.test.doubles.ProxyRequestSpy; + +import java.util.HashMap; + +import static org.junit.Assert.assertEquals; + +public class SubuserGetTest { + + @Test + public void executeGetSubuserRequest() throws SmsapiException { + ProxyRequestSpy requestStub = new ProxyRequestSpy(SubuserJsonMother.create()); + SubuserGet action = new SubuserGet("0f0f0f0f0f0f0f0f0f0f0f0f"); + action.client(new ClientStub()); + action.proxy(requestStub); + + action.execute(); + + assertEquals("GET", requestStub.requestMethod); + assertEquals("subusers/0f0f0f0f0f0f0f0f0f0f0f0f", requestStub.requestEndpoint); + HashMap expectedRequestPayload = new HashMap<>(); + assertEquals(expectedRequestPayload, requestStub.requestPayload); + } +} diff --git a/src/test/java/pl/smsapi/api/action/subusers/SubuserJsonMother.java b/src/test/java/pl/smsapi/api/action/subusers/SubuserJsonMother.java new file mode 100644 index 0000000..691a7a0 --- /dev/null +++ b/src/test/java/pl/smsapi/api/action/subusers/SubuserJsonMother.java @@ -0,0 +1,18 @@ +package pl.smsapi.api.action.subusers; + +public class SubuserJsonMother { + + public static String create() { + return + "{" + + " \"id\": \"0f0f0f0f0f0f0f0f0f0f0f0f\"," + + " \"username\": \"example_username\"," + + " \"active\": true," + + " \"description\": \"Resource description\"," + + " \"points\": {" + + " \"from_account\": 123.12," + + " \"per_month\": 321.21" + + " }" + + "}"; + } +} diff --git a/src/test/java/pl/smsapi/api/action/subusers/SubuserTest.java b/src/test/java/pl/smsapi/api/action/subusers/SubuserTest.java new file mode 100644 index 0000000..39099b8 --- /dev/null +++ b/src/test/java/pl/smsapi/api/action/subusers/SubuserTest.java @@ -0,0 +1,39 @@ +package pl.smsapi.api.action.subusers; + +import org.junit.Test; +import pl.smsapi.exception.SmsapiException; +import pl.smsapi.test.doubles.ClientStub; +import pl.smsapi.test.doubles.ProxyResponseStub; + +import static org.junit.Assert.*; + +public class SubuserTest { + + @Test + public void deserialize_response() throws SmsapiException { + SubuserGet action = new SubuserGet("0f0f0f0f0f0f0f0f0f0f0f0f"); + action.client(new ClientStub()); + action.proxy(new ProxyResponseStub( + "{" + + " \"id\": \"0f0f0f0f0f0f0f0f0f0f0f0f\"," + + " \"username\": \"example_username\"," + + " \"active\": true," + + " \"description\": \"Resource description\"," + + " \"points\": {" + + " \"from_account\": 123.12," + + " \"per_month\": 321.21" + + " }" + + "}" + )); + + Subuser response = action.execute(); + + assertNotNull(response); + assertEquals("0f0f0f0f0f0f0f0f0f0f0f0f", response.id); + assertEquals("example_username", response.username); + assertTrue(response.active); + assertEquals("Resource description", response.description); + assertEquals(123.12, response.pointsFromAccount, 0.01); + assertEquals(321.21, response.pointsPerMonth, 0.01); + } +} diff --git a/src/test/java/pl/smsapi/api/action/subusers/SubusersFactoryTest.java b/src/test/java/pl/smsapi/api/action/subusers/SubusersFactoryTest.java new file mode 100644 index 0000000..015b00a --- /dev/null +++ b/src/test/java/pl/smsapi/api/action/subusers/SubusersFactoryTest.java @@ -0,0 +1,131 @@ +package pl.smsapi.api.action.subusers; + +import org.junit.Before; +import org.junit.Test; +import pl.smsapi.api.response.Response; +import pl.smsapi.exception.SmsapiException; +import pl.smsapi.test.TestSmsapi; + +import java.util.Random; + +import static org.junit.Assert.*; + +public class SubusersFactoryTest extends TestSmsapi { + + SubusersFactory apiFactory; + + @Before + public void setUp() { + super.setUp(); + apiFactory = new SubusersFactory(client, proxy); + } + + @Test + public void addSubuser() throws SmsapiException { + String username = "smsapi-java-client-" + new Random().nextLong(); + + SubuserAdd actionAdd = apiFactory.actionAdd(username, "StrongPassword123!"); + actionAdd.withApiPassword("AnotherStrongPassword123!"); + actionAdd.withDescription("Resource description"); + actionAdd.withPointsFromAccount(11.11); + actionAdd.withPointsPerMonth(22.22); + Subuser responseAdd = actionAdd.execute(); + + assertNotNull(responseAdd); + assertEquals(username, responseAdd.username); + assertFalse(responseAdd.active); + assertEquals("Resource description", responseAdd.description); + assertEquals(11.11, responseAdd.pointsFromAccount, 0.01); + assertEquals(22.22, responseAdd.pointsPerMonth, 0.01); + } + + @Test + public void addSubuserAsActive() throws SmsapiException { + String username = "smsapi-java-client-" + new Random().nextLong(); + + SubuserAdd actionAdd = apiFactory.actionAdd(username, "StrongPassword123!"); + actionAdd.withApiPassword("AnotherStrongPassword123!"); + actionAdd.asActive(); + Subuser responseAdd = actionAdd.execute(); + + assertNotNull(responseAdd); + assertTrue(responseAdd.active); + } + + @Test + public void addSubuserAsInactive() throws SmsapiException { + String username = "smsapi-java-client-" + new Random().nextLong(); + + SubuserAdd actionAdd = apiFactory.actionAdd(username, "StrongPassword123!"); + actionAdd.withApiPassword("AnotherStrongPassword123!"); + actionAdd.asInactive(); + Subuser responseAdd = actionAdd.execute(); + + assertNotNull(responseAdd); + assertFalse(responseAdd.active); + } + + @Test + public void getSubuser() throws SmsapiException { + String username = "smsapi-java-client-" + new Random().nextLong(); + SubuserAdd actionAdd = apiFactory.actionAdd(username, "StrongPassword123!"); + Subuser responseAdd = actionAdd.execute(); + + SubuserGet actionGet = apiFactory.actionGet(responseAdd.id); + Subuser responseGet = actionGet.execute(); + + assertNotNull(responseGet); + assertEquals(responseAdd.id, responseGet.id); + assertEquals(username, responseGet.username); + } + + @Test + public void editSubuser() throws SmsapiException { + String username = "smsapi-java-client-" + new Random().nextLong(); + SubuserAdd actionAdd = apiFactory.actionAdd(username, "StrongPassword123!"); + Subuser responseAdd = actionAdd.execute(); + + SubuserEdit actionEdit = apiFactory.actionEdit(responseAdd.id); + actionEdit.withPassword("NewStrongPassword123!"); + actionEdit.withApiPassword("NewAnotherStrongPassword123!!"); + actionEdit.asActive(); + actionEdit.withDescription("New resource description"); + actionEdit.withPointsFromAccount(999.99); + actionEdit.withPointsPerMonth(111.11); + Subuser responseEdit = actionEdit.execute(); + + assertNotNull(responseEdit); + assertEquals(responseAdd.id, responseEdit.id); + assertEquals(username, responseEdit.username); + assertTrue(responseEdit.active); + assertEquals("New resource description", responseEdit.description); + assertEquals(999.99, responseEdit.pointsFromAccount, 0.01); + assertEquals(111.11, responseEdit.pointsPerMonth, 0.01); + } + + @Test + public void deleteSubuser() throws SmsapiException { + String username = "smsapi-java-client-" + new Random().nextLong(); + SubuserAdd actionAdd = apiFactory.actionAdd(username, "StrongPassword123!"); + Subuser responseAdd = actionAdd.execute(); + + SubuserDelete actionDelete = apiFactory.actionDelete(responseAdd.id); + Response responseDelete = actionDelete.execute(); + + assertNull(responseDelete); + } + + @Test + public void listSubusers() throws SmsapiException { + String username = "smsapi-java-client-" + new Random().nextLong(); + SubuserAdd actionAdd = apiFactory.actionAdd(username, "StrongPassword123!"); + actionAdd.execute(); + + SubusersList actionList = apiFactory.actionList(); + Subusers responseList = actionList.execute(); + + assertNotNull(responseList); + assertTrue(responseList.count >= 1); + assertTrue(responseList.list.stream().anyMatch(subuserResponse -> subuserResponse.username.equals(username))); + } +} diff --git a/src/test/java/pl/smsapi/api/action/subusers/SubusersJsonMother.java b/src/test/java/pl/smsapi/api/action/subusers/SubusersJsonMother.java new file mode 100644 index 0000000..d0db63d --- /dev/null +++ b/src/test/java/pl/smsapi/api/action/subusers/SubusersJsonMother.java @@ -0,0 +1,14 @@ +package pl.smsapi.api.action.subusers; + +public class SubusersJsonMother { + + public static String create() { + return + "{" + + " \"size\": 1," + + " \"collection\": [" + + SubuserJsonMother.create() + + " ]" + + "}"; + } +} diff --git a/src/test/java/pl/smsapi/api/action/subusers/SubusersListTest.java b/src/test/java/pl/smsapi/api/action/subusers/SubusersListTest.java new file mode 100644 index 0000000..7fde983 --- /dev/null +++ b/src/test/java/pl/smsapi/api/action/subusers/SubusersListTest.java @@ -0,0 +1,28 @@ +package pl.smsapi.api.action.subusers; + +import org.junit.Test; +import pl.smsapi.exception.SmsapiException; +import pl.smsapi.test.doubles.ClientStub; +import pl.smsapi.test.doubles.ProxyRequestSpy; + +import java.util.HashMap; + +import static org.junit.Assert.assertEquals; + +public class SubusersListTest { + + @Test + public void executeListSubusersRequest() throws SmsapiException { + ProxyRequestSpy requestStub = new ProxyRequestSpy(SubusersJsonMother.create()); + SubusersList action = new SubusersList(); + action.client(new ClientStub()); + action.proxy(requestStub); + + action.execute(); + + assertEquals("GET", requestStub.requestMethod); + assertEquals("subusers", requestStub.requestEndpoint); + HashMap expectedRequestPayload = new HashMap<>(); + assertEquals(expectedRequestPayload, requestStub.requestPayload); + } +} diff --git a/src/test/java/pl/smsapi/api/action/subusers/SubusersTest.java b/src/test/java/pl/smsapi/api/action/subusers/SubusersTest.java new file mode 100644 index 0000000..fcdb136 --- /dev/null +++ b/src/test/java/pl/smsapi/api/action/subusers/SubusersTest.java @@ -0,0 +1,32 @@ +package pl.smsapi.api.action.subusers; + +import org.junit.Test; +import pl.smsapi.exception.SmsapiException; +import pl.smsapi.test.doubles.ClientStub; +import pl.smsapi.test.doubles.ProxyResponseStub; + +import static org.junit.Assert.*; +import static org.junit.Assert.assertEquals; + +public class SubusersTest { + + @Test + public void deserialize_response() throws SmsapiException { + SubusersList action = new SubusersList(); + action.client(new ClientStub()); + action.proxy(new ProxyResponseStub( + "{" + + " \"size\": 1," + + " \"collection\": [" + + SubuserJsonMother.create() + + " ]" + + "}" + )); + + Subusers response = action.execute(); + + assertNotNull(response); + assertEquals(1, response.count); + assertEquals(1, response.list.size()); + } +} diff --git a/src/test/java/pl/smsapi/api/action/user/UserFactoryTest.java b/src/test/java/pl/smsapi/api/action/user/UserFactoryTest.java new file mode 100644 index 0000000..ea281b9 --- /dev/null +++ b/src/test/java/pl/smsapi/api/action/user/UserFactoryTest.java @@ -0,0 +1,34 @@ +package pl.smsapi.api.action.user; + +import org.junit.Before; +import org.junit.Ignore; +import org.junit.Test; +import pl.smsapi.api.UserFactory; +import pl.smsapi.api.response.PointsResponse; +import pl.smsapi.exception.SmsapiException; +import pl.smsapi.test.TestSmsapi; + +@Ignore +public class UserFactoryTest extends TestSmsapi { + + UserFactory apiFactory; + + @Before + public void setUp() { + super.setUp(); + apiFactory = new UserFactory(client, proxy); + } + + @Test + public void userPointsTest() throws SmsapiException { + PointsResponse item = apiFactory.actionGetPoints().execute(); + + System.out.println("GetPoints:"); + + if (item != null) { + System.out.println("Points: " + item.getPoints()); + } else { + System.out.println("Item is null"); + } + } +} diff --git a/src/test/java/pl/smsapi/test/doubles/ActionMock.java b/src/test/java/pl/smsapi/test/doubles/ActionMock.java index b307155..fc650cd 100644 --- a/src/test/java/pl/smsapi/test/doubles/ActionMock.java +++ b/src/test/java/pl/smsapi/test/doubles/ActionMock.java @@ -1,15 +1,16 @@ package pl.smsapi.test.doubles; import pl.smsapi.api.action.AbstractAction; +import pl.smsapi.api.response.Response; -public class ActionMock extends AbstractAction { +public class ActionMock extends AbstractAction { @Override protected String endPoint() { return null; } @Override - protected Object createResponse(String data) { + protected Response createResponse(String data) { return null; } diff --git a/src/test/java/pl/smsapi/test/doubles/ProxyRequestSpy.java b/src/test/java/pl/smsapi/test/doubles/ProxyRequestSpy.java new file mode 100644 index 0000000..c212b36 --- /dev/null +++ b/src/test/java/pl/smsapi/test/doubles/ProxyRequestSpy.java @@ -0,0 +1,27 @@ +package pl.smsapi.test.doubles; + +import pl.smsapi.api.authenticationStrategy.AuthenticationStrategy; +import pl.smsapi.proxy.Proxy; + +import java.io.InputStream; +import java.util.Map; + +public class ProxyRequestSpy implements Proxy { + + private final String responseDummy; + public String requestEndpoint; + public Map requestPayload; + public String requestMethod; + + public ProxyRequestSpy(String responseDummy) { + this.responseDummy = responseDummy; + } + + @Override + public String execute(String endpoint, Map data, Map files, String httpMethod, AuthenticationStrategy authenticationStrategy) throws Exception { + requestMethod = httpMethod; + requestEndpoint = endpoint; + requestPayload = data; + return responseDummy; + } +} diff --git a/src/test/java/pl/smsapi/test/run/UserTest.java b/src/test/java/pl/smsapi/test/run/UserTest.java deleted file mode 100644 index 7f01ede..0000000 --- a/src/test/java/pl/smsapi/test/run/UserTest.java +++ /dev/null @@ -1,83 +0,0 @@ -package pl.smsapi.test.run; - -import org.junit.Before; -import org.junit.Ignore; -import org.junit.Test; -import pl.smsapi.BasicAuthClient; -import pl.smsapi.api.UserFactory; -import pl.smsapi.api.action.user.UserAdd; -import pl.smsapi.api.response.PointsResponse; -import pl.smsapi.api.response.UserResponse; -import pl.smsapi.api.response.UsersResponse; -import pl.smsapi.exception.SmsapiException; -import pl.smsapi.test.TestSmsapi; - -import java.util.Random; - -@Ignore -public class UserTest extends TestSmsapi { - private String userTest = "junit"; - - UserFactory apiFactory; - - @Before - public void setUp() { - super.setUp(); - apiFactory = new UserFactory(client, proxy); - } - - private void renderUserItem(UserResponse item) { - - if (item != null) { - System.out.println("Username: " + item.getUsername() - + " Limit: " + item.getLimit() - + " MouthLimit:" + item.getMonthLimit() - + " Phonebook:" + item.getPhonebook() - + " Senders: " + item.getSenders() - + " Active: " + item.getActive()); - } else { - System.out.println("Item is null"); - } - } - - @Test - public void userAddTest() throws SmsapiException { - UserAdd action = apiFactory.actionAdd() - .setUsername(userTest + new Random().nextLong()) - .setPassword(BasicAuthClient.MD5Digest("100costma100")) - .setPasswordApi(BasicAuthClient.MD5Digest("200costam200")) - .setActive(true) - .setLimit(5.5) - .setFullAccessPhoneBook(true); - - UserResponse item = action.execute(); - - System.out.println("UserAdd:"); - - renderUserItem(item); - } - - @Test - public void userListTest() throws SmsapiException { - UsersResponse result = apiFactory.actionList().execute(); - - System.out.println("UserList:"); - - for (UserResponse item : result.getList()) { - renderUserItem(item); - } - } - - @Test - public void userPointsTest() throws SmsapiException { - PointsResponse item = apiFactory.actionGetPoints().execute(); - - System.out.println("GetPoints:"); - - if (item != null) { - System.out.println("Points: " + item.getPoints()); - } else { - System.out.println("Item is null"); - } - } -} diff --git a/src/test/java/pl/smsapi/test/unit/response/UsersResponseTest.java b/src/test/java/pl/smsapi/test/unit/response/UsersResponseTest.java deleted file mode 100644 index 8a4d6c4..0000000 --- a/src/test/java/pl/smsapi/test/unit/response/UsersResponseTest.java +++ /dev/null @@ -1,85 +0,0 @@ -package pl.smsapi.test.unit.response; - -import org.junit.Test; -import pl.smsapi.api.action.user.UserList; -import pl.smsapi.api.response.UserResponse; -import pl.smsapi.api.response.UsersResponse; -import pl.smsapi.exception.SmsapiException; -import pl.smsapi.test.doubles.ClientStub; -import pl.smsapi.test.doubles.ProxyResponseStub; - -import java.util.ArrayList; -import java.util.Optional; - -import static org.junit.Assert.*; - -public class UsersResponseTest { - - @Test - public void deserialize_empty_response() throws SmsapiException { - UserList action = new UserList(); - action.client(new ClientStub()); - action.proxy(new ProxyResponseStub( - "[]" - )); - - UsersResponse response = action.execute(); - ArrayList list = response.getList(); - - assertTrue(list.isEmpty()); - } - - @Test - public void deserialize_non_empty_response() throws SmsapiException { - UserList action = new UserList(); - action.client(new ClientStub()); - action.proxy(new ProxyResponseStub( - "[" + - "{" + - " \"active\": \"1\"," + - " \"info\": null," + - " \"limit\": \"100.0000\"," + - " \"month_limit\": \"0.0000\"," + - " \"phonebook\": \"0\"," + - " \"senders\": \"0\"," + - " \"username\": \"user1\"" + - "}," + - "{" + - " \"active\": \"0\"," + - " \"info\": \"any\"," + - " \"limit\": \"200.0000\"," + - " \"month_limit\": \"20.0000\"," + - " \"phonebook\": \"1\"," + - " \"senders\": \"1\"," + - " \"username\": \"user2\"" + - "}" + - "]" - )); - - UsersResponse response = action.execute(); - - assertEquals(2, response.getList().size()); - - Optional user1 = response.getList().stream().filter( - userResponse -> userResponse.getUsername().equals("user1") - ).findFirst(); - assertTrue(user1.isPresent()); - assertEquals(100L, user1.get().getLimit(), 0.01); - assertEquals(0L, user1.get().getMonthLimit(), 0.01); - assertEquals(0, user1.get().getSenders()); - assertEquals(0, user1.get().getPhonebook()); - assertEquals(1, user1.get().getActive()); - assertEquals("", user1.get().getInfo()); - - Optional user2 = response.getList().stream().filter( - userResponse -> userResponse.getUsername().equals("user2") - ).findFirst(); - assertTrue(user2.isPresent()); - assertEquals(200L, user2.get().getLimit(), 0.01); - assertEquals(20L, user2.get().getMonthLimit(), 0.01); - assertEquals(1, user2.get().getSenders()); - assertEquals(1, user2.get().getPhonebook()); - assertEquals(0, user2.get().getActive()); - assertEquals("any", user2.get().getInfo()); - } -}