/*
* Copyright 2014-2015 Daniel Pedraza-Arcega
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.grayfox.android.client;
import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.spy;
import com.grayfox.android.client.model.Category;
import com.grayfox.android.client.model.UpdateResponse;
import com.grayfox.android.client.model.User;
import com.squareup.okhttp.mockwebserver.MockResponse;
import com.squareup.okhttp.mockwebserver.MockWebServer;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.robolectric.Robolectric;
import org.robolectric.RobolectricTestRunner;
import org.robolectric.annotation.Config;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
@Config(emulateSdk = 18)
@RunWith(RobolectricTestRunner.class)
public class UsersApiTest {
private static MockWebServer mockWebServer;
private UsersApi usersApi;
@BeforeClass
public static void setUpClass() throws Exception {
mockWebServer = new MockWebServer();
mockWebServer.start();
}
@AfterClass
public static void tearDownClass() throws Exception {
mockWebServer.shutdown();
}
@Before
public void setUp() throws Exception {
usersApi = spy(new UsersApi(Robolectric.application));
doReturn(mockWebServer.getUrl("/").toString()).when(usersApi).getString(R.string.gf_api_base_url);
}
@Test
public void testRegister() throws Exception {
mockWebServer.enqueue(new MockResponse()
.setStatus("HTTP/1.1 200 OK")
.setBody(getJsonFrom("responses/access-token.json")));
assertThat(usersApi.awaitAccessToken("fakeCode")).isNotNull().isNotEmpty().isEqualTo("fakeAccessToken");
}
@Test(expected = ApiException.class)
public void testRegisterError() throws Exception {
mockWebServer.enqueue(new MockResponse()
.setStatus("HTTP/1.1 500 Internal Server Error")
.setBody(getJsonFrom("responses/error.json")));
usersApi.awaitAccessToken("fakeCode");
}
@Test
public void testGetSelfUser() throws Exception {
User user = new User();
user.setName("John");
user.setLastName("Doe");
user.setPhotoUrl("https://irs0.4sqi.net/img/user/923847.jpg");
user.setFoursquareId("923847");
mockWebServer.enqueue(new MockResponse()
.setStatus("HTTP/1.1 200 OK")
.setBody(getJsonFrom("responses/user.json")));
assertThat(usersApi.awaitSelfUser("fakeAccessToken")).isNotNull().isEqualTo(user);
}
@Test(expected = ApiException.class)
public void testGetSelfUserError() throws Exception {
mockWebServer.enqueue(new MockResponse()
.setStatus("HTTP/1.1 500 Internal Server Error")
.setBody(getJsonFrom("responses/error.json")));
usersApi.awaitSelfUser("fakeAccessToken");
}
@Test
public void testGetSelfUserFriends() throws Exception {
User friend1 = new User();
friend1.setName("Jane");
friend1.setLastName("Doe");
friend1.setPhotoUrl("https://irs0.4sqi.net/img/user/234237.jpg");
friend1.setFoursquareId("234237");
User friend2 = new User();
friend2.setName("John");
friend2.setLastName("Doe");
friend2.setPhotoUrl("https://irs0.4sqi.net/img/user/543863.jpg");
friend2.setFoursquareId("543863");
User[] friends = {friend1, friend2};
mockWebServer.enqueue(new MockResponse()
.setStatus("HTTP/1.1 200 OK")
.setBody(getJsonFrom("responses/users.json")));
assertThat(usersApi.awaitSelfUserFriends("fakeAccessToken")).isNotNull().isNotEmpty().hasSize(friends.length).isEqualTo(friends);
}
@Test(expected = ApiException.class)
public void testGetSelfUserFriendsError() throws Exception {
mockWebServer.enqueue(new MockResponse()
.setStatus("HTTP/1.1 500 Internal Server Error")
.setBody(getJsonFrom("responses/error.json")));
usersApi.awaitSelfUserFriends("fakeAccessToken");
}
@Test
public void testGetUserLikes() throws Exception {
Category like1 = new Category();
like1.setName("Argentinian Restaurant");
like1.setIconUrl("https://ss3.4sqi.net/img/categories_v2/food/default_88.png");
like1.setFoursquareId("4bf58dd8d48988d107941735");
Category like2 = new Category();
like2.setName("Mexican Restaurant");
like2.setIconUrl("https://ss3.4sqi.net/img/categories_v2/food/default_88.png");
like2.setFoursquareId("4bf58dd8d48988d1c1941735");
Category[] likes = {like1, like2};
mockWebServer.enqueue(new MockResponse()
.setStatus("HTTP/1.1 200 OK")
.setBody(getJsonFrom("responses/categories.json")));
assertThat(usersApi.awaitUserLikes("fakeAccessToken", "fakeFoursquareId")).isNotNull().isNotEmpty().hasSize(likes.length).isEqualTo(likes);
}
@Test(expected = ApiException.class)
public void testGetUserLikesError() throws Exception {
mockWebServer.enqueue(new MockResponse()
.setStatus("HTTP/1.1 500 Internal Server Error")
.setBody(getJsonFrom("responses/error.json")));
usersApi.awaitUserLikes("fakeAccessToken", "fakeFoursquareId");
}
@Test
public void testAddLike() throws Exception {
mockWebServer.enqueue(new MockResponse()
.setStatus("HTTP/1.1 200 OK")
.setBody(getJsonFrom("responses/update_ok.json")));
assertThat(usersApi.awaitAddLike("fakeAccessToken", "fakeFoursquareId")).isNotNull().isEqualTo(updateOk());
}
@Test(expected = ApiException.class)
public void testAddLikeError() throws Exception {
mockWebServer.enqueue(new MockResponse()
.setStatus("HTTP/1.1 500 Internal Server Error")
.setBody(getJsonFrom("responses/error.json")));
usersApi.awaitAddLike("fakeAccessToken", "fakeFoursquareId");
}
@Test
public void testRemoveLike() throws Exception {
mockWebServer.enqueue(new MockResponse()
.setStatus("HTTP/1.1 200 OK")
.setBody(getJsonFrom("responses/update_ok.json")));
assertThat(usersApi.awaitRemoveLike("fakeAccessToken", "fakeFoursquareId")).isNotNull().isEqualTo(updateOk());
}
@Test(expected = ApiException.class)
public void testRemoveLikeError() throws Exception {
mockWebServer.enqueue(new MockResponse()
.setStatus("HTTP/1.1 500 Internal Server Error")
.setBody(getJsonFrom("responses/error.json")));
usersApi.awaitRemoveLike("fakeAccessToken", "fakeFoursquareId");
}
private String getJsonFrom(String file) throws Exception {
InputStream in = getClass().getClassLoader().getResourceAsStream(file);
BufferedReader br = new BufferedReader(new InputStreamReader(in));
StringBuilder sb = new StringBuilder();
String line;
while ((line = br.readLine()) != null) sb.append(line).append('\n');
br.close();
return sb.toString();
}
private UpdateResponse updateOk() {
UpdateResponse updateResponse = new UpdateResponse();
updateResponse.setSuccess(true);
return updateResponse;
}
}