blob: 8082d9694cc85870035c99bd3ddc6a4cfe0f6ee6 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you 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 org.apache.openmeetings.webservice;
import static java.util.UUID.randomUUID;
import static javax.ws.rs.core.MediaType.APPLICATION_FORM_URLENCODED;
import static org.apache.openmeetings.AbstractOmServerTest.createPass;
import static org.apache.openmeetings.AbstractOmServerTest.ensureSchema;
import static org.apache.openmeetings.AbstractOmServerTest.soapUsername;
import static org.apache.openmeetings.AbstractOmServerTest.userpass;
import static org.apache.openmeetings.db.util.ApplicationHelper.ensureApplication;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertNotNull;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
import javax.ws.rs.core.Form;
import javax.ws.rs.core.MediaType;
import org.apache.cxf.jaxrs.client.WebClient;
import org.apache.cxf.jaxrs.ext.multipart.Attachment;
import org.apache.cxf.transports.http.configuration.HTTPClientPolicy;
import org.apache.openmeetings.db.dao.user.UserDao;
import org.apache.openmeetings.db.dto.basic.ServiceResult;
import org.apache.openmeetings.db.dto.basic.ServiceResult.Type;
import org.apache.openmeetings.db.dto.file.FileItemDTO;
import org.apache.openmeetings.db.dto.room.RoomDTO;
import org.apache.openmeetings.db.dto.user.UserDTO;
import org.apache.openmeetings.db.entity.file.BaseFileItem;
import org.apache.openmeetings.db.entity.user.User;
import org.apache.openmeetings.installation.ImportInitvalues;
import org.apache.openmeetings.webservice.util.AppointmentMessageBodyReader;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Tag;
import org.junit.jupiter.api.extension.RegisterExtension;
@Tag("webservice")
public abstract class AbstractWebServiceTest {
private static final String HOST = "localhost";
private static final String CONTEXT = "/openmeetings";
private static int port = 8080;
private static final String USER_SERVICE_MOUNT = "user";
private static final String ROOM_SERVICE_MOUNT = "room";
private static final String FILE_SERVICE_MOUNT = "file";
public static final String UNIT_TEST_EXT_TYPE = "om_unit_tests";
public static final long TIMEOUT = 5 * 60 * 1000;
@RegisterExtension
public static final CreateTomcatExtension tomcatExt = new CreateTomcatExtension(HOST, CONTEXT);
protected static <T> T getBean(Class<T> clazz) {
return ensureApplication().getBean(clazz);
}
public static WebClient getClient(String url) {
WebClient c = WebClient.create(url, List.of(new AppointmentMessageBodyReader()))
.accept("application/json").type("application/json");
HTTPClientPolicy p = WebClient.getConfig(c).getHttpConduit().getClient();
p.setConnectionTimeout(TIMEOUT);
p.setReceiveTimeout(TIMEOUT);
return c;
}
public static ServiceResult login() {
return login(soapUsername, userpass);
}
public static ServiceResult loginNoCheck(String user, String pass) {
return getClient(getUserUrl()).path("/login").query("user", user).query("pass", pass)
.get(ServiceResult.class);
}
public static ServiceResult login(String user, String pass) {
ServiceResult sr = loginNoCheck(user, pass);
assertEquals(Type.SUCCESS.name(), sr.getType(), "Login should be successful");
return sr;
}
@BeforeAll
public static void initialize() throws Exception {
port = tomcatExt.getPort();
}
@BeforeEach
public void setUp() throws Exception {
ensureSchema(getBean(UserDao.class), getBean(ImportInitvalues.class));
}
protected static CallResult<RoomDTO> createAndValidate(RoomDTO r) {
return createAndValidate(null, r);
}
protected static RoomDTO create(String sid, RoomDTO r) {
return getClient(getRoomUrl())
.query("sid", sid)
.type(APPLICATION_FORM_URLENCODED)
.post(new Form().param("room", r.toString()), RoomDTO.class);
}
protected static CallResult<RoomDTO> createAndValidate(String sid, RoomDTO r) {
if (sid == null) {
ServiceResult sr = login();
sid = sr.getMessage();
}
RoomDTO room = create(sid, r);
assertNotNull(room, "Valid room should be returned");
assertNotNull(room.getId(), "Room ID should be not empty");
RoomDTO room1 = getClient(getRoomUrl()).path(String.format("/%s", room.getId()))
.query("sid", sid)
.get(RoomDTO.class);
assertNotNull(room1, "Valid room should be returned");
assertEquals(room.getId(), room1.getId(), "Room with same ID should be returned");
assertEquals(r.getName(), room1.getName(), "Room with same Name should be returned");
assertEquals(r.getExternalType(), room1.getExternalType(), "Room with same ExternalType should be returned");
assertEquals(r.getExternalId(), room1.getExternalId(), "Room with same ExternalId should be returned");
//TODO check other fields
return new CallResult<>(sid, room1);
}
public void webCreateUser(User u) {
ServiceResult r = login();
UserDTO dto = new UserDTO(u);
dto.setPassword(createPass());
UserDTO user = getClient(getUserUrl())
.path("/")
.query("sid", r.getMessage())
.type(APPLICATION_FORM_URLENCODED)
.post(new Form().param("user", dto.toString()).param("confirm", "" + false), UserDTO.class);
assertNotNull(user.getId());
u.setId(user.getId());
}
public CallResult<FileItemDTO> createVerifiedFile(File fsFile, String name, BaseFileItem.Type type) throws IOException {
ServiceResult r = login();
FileItemDTO f1 = null;
try (InputStream is = new FileInputStream(fsFile)) {
FileItemDTO file = new FileItemDTO()
.setName(name)
.setHash(randomUUID().toString())
.setType(type);
List<Attachment> atts = new ArrayList<>();
atts.add(new Attachment("file", MediaType.APPLICATION_JSON, file));
atts.add(new Attachment("stream", MediaType.APPLICATION_OCTET_STREAM, is));
f1 = getClient(getFileUrl())
.path("/")
.query("sid", r.getMessage())
.type(MediaType.MULTIPART_FORM_DATA_TYPE).postCollection(atts, Attachment.class, FileItemDTO.class);
assertNotNull(f1, "Valid FileItem should be returned");
assertNotNull(f1.getId(), "Valid FileItem should be returned");
}
return new CallResult<>(r.getMessage(), f1);
}
protected static String getServiceUrl(String mount) {
return String.format("http://%s:%s%s/services/%s", HOST, port, CONTEXT, mount);
}
protected static String getUserUrl() {
return getServiceUrl(USER_SERVICE_MOUNT);
}
protected static String getRoomUrl() {
return getServiceUrl(ROOM_SERVICE_MOUNT);
}
protected static String getFileUrl() {
return getServiceUrl(FILE_SERVICE_MOUNT);
}
public static class CallResult<T> {
private final String sid;
private final T obj;
public CallResult(String sid, T obj) {
this.sid = sid;
this.obj = obj;
}
public String getSid() {
return sid;
}
public T getObj() {
return obj;
}
}
}