package ua.kpi.ecampus.api.service;
import com.squareup.okhttp.HttpUrl;
import com.squareup.okhttp.mockwebserver.Dispatcher;
import com.squareup.okhttp.mockwebserver.MockResponse;
import com.squareup.okhttp.mockwebserver.MockWebServer;
import com.squareup.okhttp.mockwebserver.RecordedRequest;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import java.util.List;
import rx.observers.TestSubscriber;
import ua.kpi.ecampus.model.Recipient;
import ua.kpi.ecampus.model.pojo.Bulletin;
import ua.kpi.ecampus.model.pojo.Item;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
/**
* Created by Administrator on 19.05.2016.
*/
public class BulletinServiceTest extends BaseServiceTest {
private MockWebServer server;
private BulletinService service;
private final String BULLETIN_ID = "1";
private final String SUBDIV_ID = "1000";
private final int LAST_ID = 3;
private final int LIMIT = 10;
@Before
public void setUp() throws Exception {
super.setUp();
server = new MockWebServer();
server.start();
final Dispatcher dispatcher = new Dispatcher() {
@Override
public MockResponse dispatch(RecordedRequest request) throws
InterruptedException {
String p = request.getPath();
MockResponse response = new MockResponse().setResponseCode(200);
if (p.matches("/board/all.*") ||
p.matches("/board/moderator/all.*")) {
return response.setBody(jsonReader.readString
("json/bulletins.json"));
} else if (p.equals("/board") ||
p.equals("/board/" + BULLETIN_ID)) {
return response.setBody(jsonReader.readString
("json/ok.json"));
} else if (p.equals("/board/" + BULLETIN_ID + "/recipient")) {
return response.setBody(jsonReader.readString
("json/bull_recipients.json"));
} else if (p.equals("/subdivision/" + SUBDIV_ID +
"/children")) {
return response.setBody(jsonReader.readString
("json/desc_subdivision.json"));
} else if (p.equals("/roles")) {
return response.setBody(jsonReader.readString("json/roles" +
".json"));
} else if (p.equals("/subdivision/" + SUBDIV_ID + "/group")) {
return response.setBody(jsonReader.readString
("json/groups.json"));
}
return new MockResponse().setResponseCode(404);
}
};
server.setDispatcher(dispatcher);
HttpUrl baseUrl = server.url("/");
service = ServiceCreator.createTestService(baseUrl.toString(),
BulletinService.class);
}
@Test
public void getBulletins() throws Exception {
TestSubscriber<List<Bulletin>> testSubscriber = new TestSubscriber<>();
service.getBulletins(getToken(), LIMIT, LAST_ID).subscribe
(testSubscriber);
// no errors
testSubscriber.assertNoErrors();
testSubscriber.assertValueCount(1);
List<Bulletin> actual = testSubscriber.getOnNextEvents().get(0);
// size does not exceed limit
assertTrue(actual.size() <= LIMIT);
// actual does not contain bulletin with id = lastId
for (Bulletin b : actual)
if (b.getId().equals(String.valueOf(LAST_ID)))
fail("List must not contain element with id=LAST_ID");
// correctness of fields
Bulletin b = testSubscriber.getOnNextEvents().get(0).get(0);
assertEquals("201", b.getId());
assertEquals("Hello", b.getSubject());
assertEquals("Test user", b.getCreatorName());
}
@Test
public void getModeratorBulletins() throws Exception {
TestSubscriber<List<Bulletin>> testSubscriber = new TestSubscriber<>();
service.getModeratorBulletins(getToken(), LIMIT, -1).subscribe
(testSubscriber);
// no errors
testSubscriber.assertNoErrors();
testSubscriber.assertValueCount(1);
List<Bulletin> actual = testSubscriber.getOnNextEvents().get(0);
// size does not exceed limit
assertTrue(actual.size() <= LIMIT);
// correctness of fields
Bulletin b = testSubscriber.getOnNextEvents().get(0).get(1);
assertEquals("202", b.getId());
assertEquals("Attention", b.getSubject());
}
@Test
public void addBulletin() throws Exception {
TestSubscriber<String> testSubscriber = new TestSubscriber<>();
service.createBulletin(getToken(), getBulletin()).subscribe
(testSubscriber);
testSubscriber.assertNoErrors();
testSubscriber.assertValue("OK");
}
@Test
public void updateBulletin() throws Exception {
TestSubscriber<String> testSubscriber = new TestSubscriber<>();
service.updateBulletin(getToken(), BULLETIN_ID, getBulletin()).subscribe
(testSubscriber);
testSubscriber.assertNoErrors();
testSubscriber.assertValue("OK");
}
@Test
public void getRecipients() throws Exception {
TestSubscriber<List<Recipient>> testSubscriber = new TestSubscriber<>();
service.getRecipientsBy(getToken(), BULLETIN_ID).subscribe
(testSubscriber);
// no errors
testSubscriber.assertNoErrors();
testSubscriber.assertValueCount(1);
// correctness of fields
Recipient r = testSubscriber.getOnNextEvents().get(0).get(0);
assertEquals("FIOT", r.getSubdivisionName());
assertEquals("Teacher", r.getProfileName());
}
@Test
public void getDescendantSubdivisions() throws Exception {
TestSubscriber<List<Item>> testSubscriber = new TestSubscriber<>();
service.getDescendantSubdivisions(SUBDIV_ID).subscribe
(testSubscriber);
// no errors
testSubscriber.assertNoErrors();
testSubscriber.assertValueCount(1);
List<Item> actual = testSubscriber.getOnNextEvents().get(0);
assertEquals(5, actual.size());
assertEquals(Integer.valueOf(10102), actual.get(2).getId());
assertEquals("FIOT 3", actual.get(2).getName());
}
@Test
public void getRoles() throws Exception {
TestSubscriber<List<Item>> testSubscriber = new TestSubscriber<>();
service.getRoles().subscribe(testSubscriber);
// no errors
testSubscriber.assertNoErrors();
testSubscriber.assertValueCount(1);
List<Item> actual = testSubscriber.getOnNextEvents().get(0);
assertEquals(3, actual.size());
assertEquals(Integer.valueOf(5), actual.get(1).getId());
assertEquals("Student", actual.get(1).getName());
}
@Test
public void getGroupsInSubdivision() throws Exception {
TestSubscriber<List<Item>> testSubscriber = new TestSubscriber<>();
service.getGroupsIn(SUBDIV_ID).subscribe(testSubscriber);
// no errors
testSubscriber.assertNoErrors();
testSubscriber.assertValueCount(1);
List<Item> actual = testSubscriber.getOnNextEvents().get(0);
assertEquals(1, actual.size());
assertEquals(Integer.valueOf(3), actual.get(0).getId());
assertEquals("AB", actual.get(0).getName());
}
@Test
public void getRecipients_Incorrect() {
try {
service.getRecipientsBy(getToken(),("IncorrectRequest")).subscribe();
fail();
} catch (Exception expected) {
assertEquals("HTTP 404 OK", expected.getMessage());
}
}
@After
public void tearDown() throws Exception {
server.shutdown();
}
private Bulletin getBulletin() {
return new Bulletin("1", "subject", "author", "2016");
}
}