Add tests for REST backend implementation
This commit is contained in:
@@ -111,6 +111,7 @@ dependencies {
|
|||||||
compile 'org.xerial:sqlite-jdbc:3.20.0'
|
compile 'org.xerial:sqlite-jdbc:3.20.0'
|
||||||
|
|
||||||
testCompile 'junit:junit:4.12'
|
testCompile 'junit:junit:4.12'
|
||||||
|
testCompile 'com.github.tomakehurst:wiremock:2.8.0'
|
||||||
}
|
}
|
||||||
|
|
||||||
springBoot {
|
springBoot {
|
||||||
|
@@ -101,8 +101,8 @@ If a match was found:
|
|||||||
"medium": "email",
|
"medium": "email",
|
||||||
"address": "john.doe@example.org",
|
"address": "john.doe@example.org",
|
||||||
"id": {
|
"id": {
|
||||||
"type": "mxisd",
|
"type": "mxid",
|
||||||
"value": "@jane:example.org"
|
"value": "@john:example.org"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -153,7 +153,7 @@ For all entries where a match was found:
|
|||||||
"medium": "msisdn",
|
"medium": "msisdn",
|
||||||
"address": "123456789",
|
"address": "123456789",
|
||||||
"id": {
|
"id": {
|
||||||
"type": "mxisd",
|
"type": "mxid",
|
||||||
"value": "@jane:example.org"
|
"value": "@jane:example.org"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -33,6 +33,8 @@ import io.kamax.mxisd.lookup.provider.IThreePidProvider;
|
|||||||
import io.kamax.mxisd.util.RestClientUtils;
|
import io.kamax.mxisd.util.RestClientUtils;
|
||||||
import org.apache.http.client.methods.CloseableHttpResponse;
|
import org.apache.http.client.methods.CloseableHttpResponse;
|
||||||
import org.apache.http.client.methods.HttpUriRequest;
|
import org.apache.http.client.methods.HttpUriRequest;
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.stereotype.Component;
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
@@ -45,6 +47,8 @@ import java.util.stream.Collectors;
|
|||||||
@Component
|
@Component
|
||||||
public class RestThreePidProvider extends RestProvider implements IThreePidProvider {
|
public class RestThreePidProvider extends RestProvider implements IThreePidProvider {
|
||||||
|
|
||||||
|
private Logger log = LoggerFactory.getLogger(RestThreePidProvider.class);
|
||||||
|
|
||||||
private MatrixConfig mxCfg; // FIXME should be done in the lookup manager
|
private MatrixConfig mxCfg; // FIXME should be done in the lookup manager
|
||||||
|
|
||||||
@Autowired
|
@Autowired
|
||||||
@@ -56,9 +60,9 @@ public class RestThreePidProvider extends RestProvider implements IThreePidProvi
|
|||||||
// TODO refactor in lookup manager with above FIXME
|
// TODO refactor in lookup manager with above FIXME
|
||||||
private _MatrixID getMxId(UserID id) {
|
private _MatrixID getMxId(UserID id) {
|
||||||
if (UserIdType.Localpart.is(id.getType())) {
|
if (UserIdType.Localpart.is(id.getType())) {
|
||||||
return new MatrixID(id.getValue());
|
|
||||||
} else {
|
|
||||||
return new MatrixID(id.getValue(), mxCfg.getDomain());
|
return new MatrixID(id.getValue(), mxCfg.getDomain());
|
||||||
|
} else {
|
||||||
|
return new MatrixID(id.getValue());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -80,13 +84,14 @@ public class RestThreePidProvider extends RestProvider implements IThreePidProvi
|
|||||||
// TODO refactor common code
|
// TODO refactor common code
|
||||||
@Override
|
@Override
|
||||||
public Optional<SingleLookupReply> find(SingleLookupRequest request) {
|
public Optional<SingleLookupReply> find(SingleLookupRequest request) {
|
||||||
HttpUriRequest req = RestClientUtils.post(
|
String endpoint = cfg.getEndpoints().getIdentity().getSingle();
|
||||||
cfg.getEndpoints().getIdentity().getSingle(), gson, "lookup",
|
HttpUriRequest req = RestClientUtils.post(endpoint, gson, "lookup",
|
||||||
new LookupSingleRequestJson(request.getType(), request.getThreePid()));
|
new LookupSingleRequestJson(request.getType(), request.getThreePid()));
|
||||||
|
|
||||||
try (CloseableHttpResponse res = client.execute(req)) {
|
try (CloseableHttpResponse res = client.execute(req)) {
|
||||||
int status = res.getStatusLine().getStatusCode();
|
int status = res.getStatusLine().getStatusCode();
|
||||||
if (status < 200 || status >= 300) {
|
if (status < 200 || status >= 300) {
|
||||||
|
log.warn("REST endpoint {} answered with status {}, no binding found", endpoint, status);
|
||||||
return Optional.empty();
|
return Optional.empty();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -0,0 +1,147 @@
|
|||||||
|
package io.kamax.mxisd.backend.rest;
|
||||||
|
|
||||||
|
import com.github.tomakehurst.wiremock.junit.WireMockRule;
|
||||||
|
import io.kamax.matrix.ThreePidMedium;
|
||||||
|
import io.kamax.mxisd.config.MatrixConfig;
|
||||||
|
import io.kamax.mxisd.config.rest.RestBackendConfig;
|
||||||
|
import io.kamax.mxisd.lookup.SingleLookupReply;
|
||||||
|
import io.kamax.mxisd.lookup.SingleLookupRequest;
|
||||||
|
import io.kamax.mxisd.lookup.ThreePidMapping;
|
||||||
|
import org.apache.commons.lang.StringUtils;
|
||||||
|
import org.junit.Before;
|
||||||
|
import org.junit.Rule;
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Optional;
|
||||||
|
|
||||||
|
import static com.github.tomakehurst.wiremock.client.WireMock.*;
|
||||||
|
import static org.junit.Assert.assertNotNull;
|
||||||
|
import static org.junit.Assert.assertTrue;
|
||||||
|
|
||||||
|
public class RestThreePidProviderTest {
|
||||||
|
|
||||||
|
@Rule
|
||||||
|
public WireMockRule wireMockRule = new WireMockRule(65000);
|
||||||
|
|
||||||
|
private RestThreePidProvider p;
|
||||||
|
|
||||||
|
private String lookupSinglePath = "/lookup/single";
|
||||||
|
private SingleLookupRequest lookupSingleRequest;
|
||||||
|
private String lookupSingleRequestBody = "{\"lookup\":{\"medium\":\"email\",\"address\":\"john.doe@example.org\"}}";
|
||||||
|
private String lookupSingleFoundBody = "{\"lookup\":{\"medium\":\"email\",\"address\":\"john.doe@example.org\"" +
|
||||||
|
",\"id\":{\"type\":\"mxid\",\"value\":\"@john:example.org\"}}}";
|
||||||
|
private String lookupSingleNotFoundBody = "{}";
|
||||||
|
|
||||||
|
private String lookupBulkPath = "/lookup/bulk";
|
||||||
|
private List<ThreePidMapping> lookupBulkList;
|
||||||
|
private String lookupBulkRequestBody = "{\"lookup\":[{\"medium\":\"email\",\"address\":\"john.doe@example.org\"}," +
|
||||||
|
"{\"medium\":\"msisdn\",\"address\":\"123456789\"}]}";
|
||||||
|
private String lookupBulkFoundBody = "{\"lookup\":[{\"medium\":\"email\",\"address\":\"john.doe@example.org\"," +
|
||||||
|
"\"id\":{\"type\":\"localpart\",\"value\":\"john\"}},{\"medium\":\"msisdn\",\"address\":\"123456789\"," +
|
||||||
|
"\"id\":{\"type\":\"mxid\",\"value\":\"@jane:example.org\"}}]}";
|
||||||
|
private String lookupBulkNotFoundBody = "{\"lookup\":[]}";
|
||||||
|
|
||||||
|
@Before
|
||||||
|
public void before() {
|
||||||
|
MatrixConfig mxCfg = new MatrixConfig();
|
||||||
|
mxCfg.setDomain("example.org");
|
||||||
|
mxCfg.build();
|
||||||
|
|
||||||
|
RestBackendConfig cfg = new RestBackendConfig();
|
||||||
|
cfg.setEnabled(true);
|
||||||
|
cfg.setHost("http://localhost:65000");
|
||||||
|
cfg.getEndpoints().getIdentity().setSingle(lookupSinglePath);
|
||||||
|
cfg.getEndpoints().getIdentity().setBulk("/lookup/bulk");
|
||||||
|
cfg.build();
|
||||||
|
|
||||||
|
p = new RestThreePidProvider(cfg, mxCfg);
|
||||||
|
|
||||||
|
lookupSingleRequest = new SingleLookupRequest();
|
||||||
|
lookupSingleRequest.setType(ThreePidMedium.Email.getId());
|
||||||
|
lookupSingleRequest.setThreePid("john.doe@example.org");
|
||||||
|
|
||||||
|
ThreePidMapping m1 = new ThreePidMapping();
|
||||||
|
m1.setMedium(ThreePidMedium.Email.getId());
|
||||||
|
m1.setValue("john.doe@example.org");
|
||||||
|
|
||||||
|
ThreePidMapping m2 = new ThreePidMapping();
|
||||||
|
m1.setMedium(ThreePidMedium.PhoneNumber.getId());
|
||||||
|
m1.setValue("123456789");
|
||||||
|
lookupBulkList = new ArrayList<>();
|
||||||
|
lookupBulkList.add(m1);
|
||||||
|
lookupBulkList.add(m2);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void lookupSingleFound() {
|
||||||
|
stubFor(post(urlEqualTo(lookupSinglePath))
|
||||||
|
.willReturn(aResponse()
|
||||||
|
.withHeader("Content-Type", "application/json")
|
||||||
|
.withBody(lookupSingleFoundBody)
|
||||||
|
)
|
||||||
|
);
|
||||||
|
|
||||||
|
Optional<SingleLookupReply> rep = p.find(lookupSingleRequest);
|
||||||
|
assertTrue(rep.isPresent());
|
||||||
|
rep.ifPresent(data -> {
|
||||||
|
assertNotNull(data.getMxid());
|
||||||
|
assertTrue(data.getMxid().getId(), StringUtils.equals(data.getMxid().getId(), "@john:example.org"));
|
||||||
|
});
|
||||||
|
|
||||||
|
verify(postRequestedFor(urlMatching("/lookup/single"))
|
||||||
|
.withHeader("Content-Type", containing("application/json"))
|
||||||
|
.withRequestBody(equalTo(lookupSingleRequestBody))
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void lookupSingleNotFound() {
|
||||||
|
stubFor(post(urlEqualTo(lookupSinglePath))
|
||||||
|
.willReturn(aResponse()
|
||||||
|
.withHeader("Content-Type", "application/json")
|
||||||
|
.withBody(lookupSingleNotFoundBody)
|
||||||
|
)
|
||||||
|
);
|
||||||
|
|
||||||
|
Optional<SingleLookupReply> rep = p.find(lookupSingleRequest);
|
||||||
|
assertTrue(!rep.isPresent());
|
||||||
|
|
||||||
|
verify(postRequestedFor(urlMatching("/lookup/single"))
|
||||||
|
.withHeader("Content-Type", containing("application/json"))
|
||||||
|
.withRequestBody(equalTo(lookupSingleRequestBody))
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void lookupBulkFound() {
|
||||||
|
stubFor(post(urlEqualTo(lookupBulkPath))
|
||||||
|
.willReturn(aResponse()
|
||||||
|
.withHeader("Content-Type", "application/json")
|
||||||
|
.withBody(lookupBulkFoundBody)
|
||||||
|
)
|
||||||
|
);
|
||||||
|
|
||||||
|
List<ThreePidMapping> mappings = p.populate(lookupBulkList);
|
||||||
|
assertNotNull(mappings);
|
||||||
|
assertTrue(mappings.size() == 2);
|
||||||
|
assertTrue(StringUtils.equals(mappings.get(0).getMxid(), "@john:example.org"));
|
||||||
|
assertTrue(StringUtils.equals(mappings.get(1).getMxid(), "@jane:example.org"));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void lookupBulkNotFound() {
|
||||||
|
stubFor(post(urlEqualTo(lookupBulkPath))
|
||||||
|
.willReturn(aResponse()
|
||||||
|
.withHeader("Content-Type", "application/json")
|
||||||
|
.withBody(lookupBulkNotFoundBody)
|
||||||
|
)
|
||||||
|
);
|
||||||
|
|
||||||
|
List<ThreePidMapping> mappings = p.populate(lookupBulkList);
|
||||||
|
assertNotNull(mappings);
|
||||||
|
assertTrue(mappings.size() == 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
Reference in New Issue
Block a user