/*
* Copyright 2013-2014 Urs Wolfer
*
* 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.urswolfer.gerrit.client.rest.http.changes;
import com.google.common.base.Function;
import com.google.common.collect.Iterables;
import com.google.common.collect.Lists;
import com.google.common.truth.Truth;
import com.google.gerrit.extensions.api.changes.ChangeApi;
import com.google.gerrit.extensions.api.changes.Changes;
import com.google.gerrit.extensions.client.ListChangesOption;
import com.google.gerrit.extensions.common.ChangeInfo;
import com.google.gerrit.extensions.common.ChangeInput;
import com.google.gson.JsonElement;
import com.urswolfer.gerrit.client.rest.http.GerritRestClient;
import com.urswolfer.gerrit.client.rest.http.common.GerritRestClientBuilder;
import org.easymock.EasyMock;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;
import java.util.Arrays;
import java.util.EnumSet;
import java.util.Iterator;
/**
* @author Thomas Forrer
*/
public class ChangesRestClientTest {
private static final JsonElement MOCK_JSON_ELEMENT = EasyMock.createMock(JsonElement.class);
private static final Function<ChangesQueryTestCase, ChangesQueryTestCase[]> WRAP_IN_ARRAY_FUNCTION =
new Function<ChangesQueryTestCase, ChangesQueryTestCase[]>() {
@Override
public ChangesQueryTestCase[] apply(ChangesQueryTestCase testCase) {
return new ChangesQueryTestCase[]{testCase};
}
};
@DataProvider(name = "ChangesQueryTestCases")
public Iterator<ChangesQueryTestCase[]> getChangesQueryTestCases() {
return Iterables.transform(Arrays.asList(
queryParameter(
new TestQueryRequest().withQuery("is:open")
).expectUrl("/changes/?q=is:open"),
queryParameter(
new TestQueryRequest().withQuery("is:open+is:watched")
).expectUrl("/changes/?q=is:open+is:watched"),
queryParameter(
new TestQueryRequest().withLimit(10)
).expectUrl("/changes/?n=10"),
queryParameter(
new TestQueryRequest().withQuery("is:open").withLimit(10)
).expectUrl("/changes/?q=is:open&n=10"),
queryParameter(
new TestQueryRequest().withOption(ListChangesOption.LABELS)
).expectUrl("/changes/?o=LABELS"),
queryParameter(
new TestQueryRequest().withStart(50)
).expectUrl("/changes/?S=50"),
queryParameter(
new TestQueryRequest().withSortkey("003460ab0001ae15")
).expectUrl("/changes/?N=003460ab0001ae15"),
queryParameter(
new TestQueryRequest().withQuery("is:open")
.withLimit(10)
.withOption(ListChangesOption.CURRENT_FILES)
.withStart(30)
).expectUrl("/changes/?q=is:open&n=10&S=30&o=CURRENT_FILES"),
queryParameter(
new TestQueryRequest().withQuery("is:merged is:watched").encode()
).expectUrl("/changes/?q=is%3Amerged+is%3Awatched")
), WRAP_IN_ARRAY_FUNCTION).iterator();
}
@Test(dataProvider = "ChangesQueryTestCases")
public void testQueryWithParameter(ChangesQueryTestCase testCase) throws Exception {
GerritRestClient gerritRestClient = setupGerritRestClient(testCase);
ChangesParser changesParser = setupChangesParser();
ChangesRestClient changes = new ChangesRestClient(gerritRestClient, changesParser, null, null, null, null, null, null);
Changes.QueryRequest queryRequest = changes.query();
testCase.queryParameter.apply(queryRequest).get();
EasyMock.verify(gerritRestClient, changesParser);
}
@Test
public void testQueryWithString() throws Exception {
GerritRestClient gerritRestClient = new GerritRestClientBuilder()
.expectGet("/changes/?q=is:open", MOCK_JSON_ELEMENT)
.get();
ChangesParser changesParser = setupChangesParser();
CommentsParser commentsParser = EasyMock.createMock(CommentsParser.class);
ChangesRestClient changesRestClient = new ChangesRestClient(gerritRestClient, changesParser, commentsParser, null, null, null, null, null);
changesRestClient.query("is:open").get();
EasyMock.verify(gerritRestClient);
}
@Test
public void testIdAsInt() throws Exception {
GerritRestClient gerritRestClient = new GerritRestClientBuilder().get();
ChangesParser changesParser = EasyMock.createMock(ChangesParser.class);
CommentsParser commentsParser = EasyMock.createMock(CommentsParser.class);
ChangesRestClient changesRestClient = new ChangesRestClient(gerritRestClient, changesParser, commentsParser, null, null, null, null, null);
ChangeApi changeApi = changesRestClient.id(123);
Truth.assertThat(changeApi.id()).isEqualTo("123");
}
@Test
public void testIdAsTriplet() throws Exception {
GerritRestClient gerritRestClient = new GerritRestClientBuilder().get();
ChangesParser changesParser = EasyMock.createMock(ChangesParser.class);
CommentsParser commentsParser = EasyMock.createMock(CommentsParser.class);
ChangesRestClient changesRestClient = new ChangesRestClient(gerritRestClient, changesParser, commentsParser, null, null, null, null, null);
ChangeApi changeApi = changesRestClient.id("packages%2Ftest", "master", "Ieabd72e73f3da0df90fd6e8cba8f6c5dd7d120df");
Truth.assertThat(changeApi.id()).isEqualTo("packages%2Ftest~master~Ieabd72e73f3da0df90fd6e8cba8f6c5dd7d120df");
}
@Test
public void testQuery() throws Exception {
ChangesQueryTestCase testCase = new ChangesQueryTestCase().expectUrl("/changes/");
GerritRestClient gerritRestClient = setupGerritRestClient(testCase);
ChangesParser changesParser = setupChangesParser();
ChangesRestClient changes = new ChangesRestClient(gerritRestClient, changesParser, null, null, null, null, null, null);
changes.query().get();
EasyMock.verify(gerritRestClient, changesParser);
}
@Test
public void testCreate() throws Exception {
ChangesCreateTestCase testCase = new ChangesCreateTestCase().expectUrl("/changes/");
ChangeInput changeInput = new ChangeInput();
changeInput.branch = "master";
String changeInputJsonString = "{}";
GerritRestClient gerritRestClient = setupGerritRestClient(testCase, changeInputJsonString);
ChangeInfo changeInfo = new ChangeInfo();
changeInfo.id = "id";
ChangesParser changesParser = setupChangesParserForCreate(changeInput,
changeInputJsonString, changeInfo);
ChangesRestClient changes = new ChangesRestClient(gerritRestClient, changesParser, null, null, null, null, null, null);
ChangeApi changeApi = changes.create(changeInput);
Truth.assertThat(changeApi.id()).isEqualTo(changeInfo.id);
EasyMock.verify(gerritRestClient, changesParser);
}
private GerritRestClient setupGerritRestClient(ChangesQueryTestCase testCase) throws Exception {
GerritRestClient gerritRestClient = EasyMock.createMock(GerritRestClient.class);
// this test does not care about json parsing, just return a mocked json element...
EasyMock.expect(gerritRestClient.getRequest(testCase.expectedUrl))
.andReturn(MOCK_JSON_ELEMENT)
.once();
EasyMock.replay(gerritRestClient);
return gerritRestClient;
}
private GerritRestClient setupGerritRestClient(ChangesCreateTestCase testCase, String body) throws Exception {
GerritRestClient gerritRestClient = EasyMock.createMock(GerritRestClient.class);
EasyMock.expect(gerritRestClient.postRequest(testCase.expectedUrl, body))
.andReturn(MOCK_JSON_ELEMENT)
.once();
EasyMock.replay(gerritRestClient);
return gerritRestClient;
}
private ChangesParser setupChangesParser() throws Exception {
ChangesParser changesParser = EasyMock.createMock(ChangesParser.class);
EasyMock.expect(changesParser.parseChangeInfos(MOCK_JSON_ELEMENT))
.andReturn(Lists.<ChangeInfo>newArrayList())
.once();
EasyMock.replay(changesParser);
return changesParser;
}
private ChangesParser setupChangesParserForCreate(ChangeInput changeInput,
String changeInputJsonString, ChangeInfo changeInfo) throws Exception {
ChangesParser changesParser = EasyMock.createMock(ChangesParser.class);
EasyMock.expect(changesParser.generateChangeInput(changeInput))
.andReturn(changeInputJsonString)
.once();
EasyMock.expect(changesParser.parseSingleChangeInfo(MOCK_JSON_ELEMENT))
.andReturn(changeInfo)
.once();
EasyMock.replay(changesParser);
return changesParser;
}
private static ChangesQueryTestCase queryParameter(TestQueryRequest parameter) {
return new ChangesQueryTestCase().withQueryParameter(parameter);
}
private static final class ChangesQueryTestCase {
private TestQueryRequest queryParameter;
private String expectedUrl;
private ChangesQueryTestCase withQueryParameter(TestQueryRequest queryParameter) {
this.queryParameter = queryParameter;
return this;
}
private ChangesQueryTestCase expectUrl(String expectedUrl) {
this.expectedUrl = expectedUrl;
return this;
}
@Override
public String toString() {
return expectedUrl;
}
}
private static final class TestQueryRequest {
private String query = null;
private boolean encode = false;
private Integer limit = null;
private Integer start = null;
private String sortkey = null;
private EnumSet<ListChangesOption> options = EnumSet.noneOf(ListChangesOption.class);
public TestQueryRequest withQuery(String query) {
this.query = query;
return this;
}
public TestQueryRequest encode() {
encode = true;
return this;
}
public TestQueryRequest withLimit(int limit) {
this.limit = limit;
return this;
}
public TestQueryRequest withStart(int start) {
this.start = start;
return this;
}
public TestQueryRequest withSortkey(String sortkey) {
this.sortkey = sortkey;
return this;
}
public TestQueryRequest withOption(ListChangesOption options) {
this.options.add(options);
return this;
}
public Changes.QueryRequest apply(Changes.QueryRequest queryRequest) {
if (query != null) {
queryRequest.withQuery(query);
}
if (encode) {
queryRequest.encode();
}
if (limit != null) {
queryRequest.withLimit(limit);
}
if (start != null) {
queryRequest.withStart(start);
}
if (sortkey != null) {
queryRequest.withSortkey(sortkey);
}
if (!options.isEmpty()) {
queryRequest.withOptions(options);
}
return queryRequest;
}
}
private static final class ChangesCreateTestCase {
private String expectedUrl;
private ChangesCreateTestCase expectUrl(String expectedUrl) {
this.expectedUrl = expectedUrl;
return this;
}
@Override
public String toString() {
return expectedUrl;
}
}
}