/*
* Copyright 2015-2016 OpenCB
*
* 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 org.opencb.opencga.catalog.db.mongodb;
import org.junit.Test;
import org.opencb.commons.datastore.core.ObjectMap;
import org.opencb.commons.datastore.core.Query;
import org.opencb.commons.datastore.core.QueryOptions;
import org.opencb.commons.datastore.core.QueryResult;
import org.opencb.opencga.catalog.auth.authentication.CatalogAuthenticationManager;
import org.opencb.opencga.catalog.auth.authorization.CatalogAuthorizationManager;
import org.opencb.opencga.catalog.db.api.UserDBAdaptor;
import org.opencb.opencga.catalog.exceptions.CatalogDBException;
import org.opencb.opencga.catalog.exceptions.CatalogException;
import org.opencb.opencga.catalog.models.*;
import java.io.IOException;
import java.util.*;
import static org.junit.Assert.*;
/**
* Created by pfurio on 19/01/16.
*/
public class UserMongoDBAdaptorTest extends MongoDBAdaptorTest {
@Test
public void nativeGet() throws Exception {
Query query = new Query("id", "imedina");
QueryResult queryResult = catalogUserDBAdaptor.nativeGet(query, null);
}
@Test
public void createUserTest() throws CatalogException {
User user = new User("NewUser", "", "", "", "", User.UserStatus.READY);
QueryResult createUser = catalogUserDBAdaptor.insert(user, null);
assertNotSame(0, createUser.getResult().size());
thrown.expect(CatalogDBException.class);
catalogUserDBAdaptor.insert(user, null);
}
@Test
public void deleteUserTest() throws CatalogException {
User deletable1 = new User("deletable1", "deletable 1", "d1@ebi", "1234", "", User.UserStatus.READY);
QueryResult<User> createUser = catalogUserDBAdaptor.insert(deletable1, null);
assertFalse(createUser.getResult().isEmpty());
assertNotNull(createUser.first());
assertEquals(Status.READY, createUser.first().getStatus().getName());
QueryResult<User> deleteUser = catalogUserDBAdaptor.delete(deletable1.getId(), new QueryOptions());
assertFalse(deleteUser.getResult().isEmpty());
assertNotNull(deleteUser.first());
assertEquals(Status.TRASHED, deleteUser.first().getStatus().getName());
/*
thrown.expect(CatalogDBException.class);
catalogUserDBAdaptor.delete(deletable1.getId());
*/
}
@Test
public void getUserTest() throws CatalogDBException {
QueryResult<User> user = catalogUserDBAdaptor.get(user1.getId(), null, null);
assertNotSame(0, user.getResult().size());
user = catalogUserDBAdaptor.get(user3.getId(), null, null);
assertFalse(user.getResult().isEmpty());
assertFalse(user.first().getProjects().isEmpty());
user = catalogUserDBAdaptor.get(user3.getId(), new QueryOptions("exclude", Arrays.asList("projects")), null);
assertEquals(0, user.first().getProjects().size());
user = catalogUserDBAdaptor.get(user3.getId(), null, user.first().getLastModified());
assertTrue(user.getResult().isEmpty());
thrown.expect(CatalogDBException.class);
catalogUserDBAdaptor.get("NonExistingUser", null, null);
}
@Test
public void loginTest() throws CatalogException, IOException {
String userId = user1.getId();
Session sessionJCOLL = new Session("127.0.0.1", 20);
catalogUserDBAdaptor.addSession(userId, sessionJCOLL);
// Check password is correct in the database
String storedPassword = catalogUserDBAdaptor.get(userId, new QueryOptions(QueryOptions.INCLUDE, "password"), null).first()
.getPassword();
assertEquals("1234", storedPassword);
}
@Test
public void logoutTest() throws CatalogDBException, IOException {
String userId = user1.getId();
Session sessionJCOLL = new Session("127.0.0.1", 20);
catalogUserDBAdaptor.addSession(userId, sessionJCOLL);
QueryResult<Session> logout = catalogUserDBAdaptor.logout(userId, sessionJCOLL.getId());
assertEquals(1, logout.getResult().size());
//thrown.expect(CatalogDBException.class);
QueryResult<Session> falseSession = catalogUserDBAdaptor.logout(userId, "FalseSession");
assertTrue(falseSession.getWarningMsg() != null && !falseSession.getWarningMsg().isEmpty());
assertEquals("Session not found", falseSession.getWarningMsg());
}
@Test
public void getUserIdBySessionId() throws CatalogDBException {
String userId = user1.getId();
catalogUserDBAdaptor.addSession(userId, new Session("127.0.0.1", 20)); //Having multiple conections
catalogUserDBAdaptor.addSession(userId, new Session("127.0.0.1", 20));
catalogUserDBAdaptor.addSession(userId, new Session("127.0.0.1", 20));
Session sessionJCOLL = new Session("127.0.0.1", 20);
catalogUserDBAdaptor.addSession(userId, sessionJCOLL);
assertEquals(user1.getId(), catalogUserDBAdaptor.getUserIdBySessionId(sessionJCOLL.getId()));
QueryResult logout = catalogUserDBAdaptor.logout(userId, sessionJCOLL.getId());
assertEquals(1, logout.getResult().size());
assertEquals("", catalogUserDBAdaptor.getUserIdBySessionId(sessionJCOLL.getId()));
}
@Test
public void changePasswordTest() throws CatalogDBException {
// System.out.println(catalogUserDBAdaptor.changePassword("jmmut", "1111", "1234"));
// System.out.println(catalogUserDBAdaptor.changePassword("jmmut", "1234", "1111"));
// try {
// System.out.println(catalogUserDBAdaptor.changePassword("jmmut", "BAD_PASSWORD", "asdf"));
// fail("Expected \"bad password\" exception");
// } catch (CatalogDBException e) {
// System.out.println(e);
// }
QueryResult queryResult = catalogUserDBAdaptor.changePassword(user2.getId(), user2.getPassword(), "1234");
assertNotSame(0, queryResult.getResult().size());
thrown.expect(CatalogDBException.class);
catalogUserDBAdaptor.changePassword(user2.getId(), "BAD_PASSWORD", "asdf");
}
@Test
public void modifyUserTest() throws CatalogDBException {
ObjectMap genomeMapsConfig = new ObjectMap("lastPosition", "4:1222222:1333333");
genomeMapsConfig.put("otherConf", Arrays.asList(1, 2, 3, 4, 5));
catalogUserDBAdaptor.setConfig(user1.getId(), "genomemaps", genomeMapsConfig);
User user = catalogUserDBAdaptor.get(user1.getId(), null, null).first();
assertNotNull(user.getConfigs().get("genomemaps"));
Map<String, Object> genomemaps = (Map<String, Object>) user.getConfigs().get("genomemaps");
assertNotNull(genomemaps.get("otherConf"));
assertNotNull(genomemaps.get("lastPosition"));
}
@Test
public void addFilterTest() throws CatalogDBException, IOException {
Query query = new Query("key1", "value1").append("key2", "value2");
QueryOptions options = new QueryOptions(QueryOptions.INCLUDE, Arrays.asList("key1", "key2"));
User.Filter filter = new User.Filter("filter1", "Description of filter 1", File.Bioformat.ALIGNMENT, query, options);
catalogUserDBAdaptor.addFilter(user4.getId(), filter);
QueryResult<User> userQueryResult = catalogUserDBAdaptor.get(user4.getId(), new QueryOptions(), null);
User.Filter filterResult = userQueryResult.first().getConfigs().getFilters().get(0);
assertEquals(filter.getName(), filterResult.getName());
assertEquals(filter.getDescription(), filterResult.getDescription());
assertEquals(filter.getBioformat(), filterResult.getBioformat());
assertEquals(filter.getQuery().safeToString(), filterResult.getQuery().safeToString());
assertEquals(filter.getOptions().safeToString(), filterResult.getOptions().safeToString());
}
@Test
public void updateFilterTest() throws CatalogDBException, IOException {
Query query = new Query("key1", "value1").append("key2", "value2");
QueryOptions options = new QueryOptions(QueryOptions.INCLUDE, Arrays.asList("key1", "key2"));
User.Filter filter = new User.Filter("filter1", "Description of filter 1", File.Bioformat.ALIGNMENT, query, options);
catalogUserDBAdaptor.addFilter(user4.getId(), filter);
ObjectMap params = new ObjectMap()
.append(UserDBAdaptor.FilterParams.DESCRIPTION.key(), "The description has changed")
.append(UserDBAdaptor.FilterParams.BIOFORMAT.key(), File.Bioformat.VARIANT)
.append(UserDBAdaptor.FilterParams.QUERY.key(), new Query("key3", "whatever"))
.append(UserDBAdaptor.FilterParams.OPTIONS.key(), new QueryOptions("options", "optionsValue"));
catalogUserDBAdaptor.updateFilter(user4.getId(), filter.getName(), params);
QueryResult<User> userQueryResult = catalogUserDBAdaptor.get(user4.getId(), new QueryOptions(), null);
User.Filter filterResult = userQueryResult.first().getConfigs().getFilters().get(0);
assertEquals(filter.getName(), filterResult.getName());
assertEquals(params.get(UserDBAdaptor.FilterParams.DESCRIPTION.key()), filterResult.getDescription());
assertEquals(params.get(UserDBAdaptor.FilterParams.BIOFORMAT.key()), filterResult.getBioformat());
assertEquals(((Query) params.get(UserDBAdaptor.FilterParams.QUERY.key())).safeToString(), filterResult.getQuery().safeToString());
assertEquals(((QueryOptions) params.get(UserDBAdaptor.FilterParams.OPTIONS.key())).safeToString(),
filterResult.getOptions().safeToString());
}
@Test
public void deleteFilterTest() throws CatalogDBException, IOException {
Query query = new Query("key1", "value1").append("key2", "value2");
QueryOptions options = new QueryOptions(QueryOptions.INCLUDE, Arrays.asList("key1", "key2"));
User.Filter filter = new User.Filter("filter1", "Description of filter 1", File.Bioformat.ALIGNMENT, query, options);
catalogUserDBAdaptor.addFilter(user4.getId(), filter);
catalogUserDBAdaptor.deleteFilter(user4.getId(), filter.getName());
QueryResult<User> userQueryResult = catalogUserDBAdaptor.get(user4.getId(), new QueryOptions(), null);
User.UserConfiguration configs = userQueryResult.first().getConfigs();
assertTrue(configs.getFilters().size() == 0);
}
@Test
public void setConfigTest() throws CatalogDBException, IOException {
ObjectMap objectMap = new ObjectMap()
.append("key1", Arrays.asList(1,2,3,4,5))
.append("key2", new ObjectMap("key21", 21).append("key22", 22));
QueryResult queryResult = catalogUserDBAdaptor.setConfig(user4.getId(), "config1", objectMap);
assertEquals(1, queryResult.getNumResults());
LinkedHashMap result = (LinkedHashMap) queryResult.first();
assertTrue(result.get("key1") instanceof List);
assertTrue(result.get("key2") instanceof Map);
// Update the config
objectMap.put("key2", objectMap.get("key1"));
queryResult = catalogUserDBAdaptor.setConfig(user4.getId(), "config1", objectMap);
assertEquals(1, queryResult.getNumResults());
result = (LinkedHashMap) queryResult.first();
assertTrue(result.get("key1") instanceof List);
assertTrue(result.get("key2") instanceof List);
}
@Test
public void deleteConfigTest() throws CatalogDBException, IOException {
ObjectMap objectMap = new ObjectMap()
.append("key1", Arrays.asList(1,2,3,4,5))
.append("key2", new ObjectMap("key21", 21).append("key22", 22));
catalogUserDBAdaptor.setConfig(user4.getId(), "config1", objectMap);
catalogUserDBAdaptor.deleteConfig(user4.getId(), "config1");
thrown.expect(CatalogDBException.class);
thrown.expectMessage("Could not delete config1 configuration");
catalogUserDBAdaptor.deleteConfig(user4.getId(), "config1");
}
}