//package de.rwth.idsg.bikeman.web.rest;
//
//import de.rwth.idsg.bikeman.Application;
//import de.rwth.idsg.bikeman.domain.Authority;
//import de.rwth.idsg.bikeman.domain.User;
//import de.rwth.idsg.bikeman.repository.AuthorityRepository;
//import de.rwth.idsg.bikeman.repository.UserRepository;
//import de.rwth.idsg.bikeman.security.AuthoritiesConstants;
//import de.rwth.idsg.bikeman.service.MailService;
//import de.rwth.idsg.bikeman.service.UserService;
//import de.rwth.idsg.bikeman.web.rest.dto.UserDTO;
//import org.junit.Before;
//import org.junit.Test;
//import org.junit.runner.RunWith;
//import org.mockito.Mock;
//import org.mockito.MockitoAnnotations;
//import org.springframework.boot.test.IntegrationTest;
//import org.springframework.boot.test.SpringApplicationConfiguration;
//import org.springframework.http.MediaType;
//import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
//import org.springframework.test.context.web.WebAppConfiguration;
//import org.springframework.test.util.ReflectionTestUtils;
//import org.springframework.test.web.servlet.MockMvc;
//import org.springframework.test.web.servlet.setup.MockMvcBuilders;
//
//import javax.inject.Inject;
//import javax.transaction.Transactional;
//import java.util.Arrays;
//import java.util.HashSet;
//import java.util.Optional;
//import java.util.Set;
//
//import static org.assertj.core.api.Assertions.assertThat;
//import static org.mockito.Matchers.anyObject;
//import static org.mockito.Matchers.anyString;
//import static org.mockito.Mockito.doNothing;
//import static org.mockito.Mockito.when;
//import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
//import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post;
//import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*;
//
///**
// * Test class for the AccountResource REST controller.
// *
// * @see UserService
// */
//@RunWith(SpringJUnit4ClassRunner.class)
//@SpringApplicationConfiguration(classes = Application.class)
//@WebAppConfiguration
//@IntegrationTest
//public class AccountResourceTest {
//
// @Inject
// private UserRepository userRepository;
//
// @Inject
// private AuthorityRepository authorityRepository;
//
// @Inject
// private UserService userService;
//
// @Mock
// private UserService mockUserService;
//
// @Mock
// private MailService mockMailService;
//
// private MockMvc restUserMockMvc;
//
// private MockMvc restMvc;
//
// @Before
// public void setup() {
// MockitoAnnotations.initMocks(this);
// doNothing().when(mockMailService).sendActivationEmail(anyObject(), anyString());
//
// AccountResource accountResource = new AccountResource();
// ReflectionTestUtils.setField(accountResource, "userRepository", userRepository);
// ReflectionTestUtils.setField(accountResource, "userService", userService);
// ReflectionTestUtils.setField(accountResource, "mailService", mockMailService);
//
// AccountResource accountUserMockResource = new AccountResource();
// ReflectionTestUtils.setField(accountUserMockResource, "userRepository", userRepository);
// ReflectionTestUtils.setField(accountUserMockResource, "userService", mockUserService);
// ReflectionTestUtils.setField(accountUserMockResource, "mailService", mockMailService);
//
// this.restMvc = MockMvcBuilders.standaloneSetup(accountResource).build();
// this.restUserMockMvc = MockMvcBuilders.standaloneSetup(accountUserMockResource).build();
// }
//
// @Test
// public void testNonAuthenticatedUser() throws Exception {
// restUserMockMvc.perform(get("/api/authenticate")
// .accept(MediaType.APPLICATION_JSON))
// .andExpect(status().isOk())
// .andExpect(content().string(""));
// }
//
// @Test
// public void testAuthenticatedUser() throws Exception {
// restUserMockMvc.perform(get("/api/authenticate")
// .with(request -> {
// request.setRemoteUser("test");
// return request;
// })
// .accept(MediaType.APPLICATION_JSON))
// .andExpect(status().isOk())
// .andExpect(content().string("test"));
// }
//
// @Test
// public void testGetExistingAccount() throws Exception {
// Set<Authority> authorities = new HashSet<>();
// Authority authority = new Authority();
// authority.setName(AuthoritiesConstants.ADMIN);
// authorities.add(authority);
//
// User user = new User();
// user.setLogin("test");
// user.setFirstName("john");
// user.setLastName("doe");
// user.setEmail("john.doe@jhipter.com");
// user.setAuthorities(authorities);
// when(mockUserService.getUserWithAuthorities()).thenReturn(user);
//
// restUserMockMvc.perform(get("/api/account")
// .accept(MediaType.APPLICATION_JSON))
// .andExpect(status().isOk())
// .andExpect(content().contentType(MediaType.APPLICATION_JSON))
// .andExpect(jsonPath("$.login").value("test"))
// .andExpect(jsonPath("$.firstName").value("john"))
// .andExpect(jsonPath("$.lastName").value("doe"))
// .andExpect(jsonPath("$.email").value("john.doe@jhipter.com"))
// .andExpect(jsonPath("$.roles").value(AuthoritiesConstants.ADMIN));
// }
//
// @Test
// public void testGetUnknownAccount() throws Exception {
// when(mockUserService.getUserWithAuthorities()).thenReturn(null);
//
// restUserMockMvc.perform(get("/api/account")
// .accept(MediaType.APPLICATION_JSON))
// .andExpect(status().isInternalServerError());
// }
//
// @Test
// @Transactional
// public void testRegisterValid() throws Exception {
// UserDTO u = new UserDTO(
// "joe", // login
// "password", // password
// "Joe", // firstName
// "Shmoe", // lastName
// "joe@example.com", // e-mail
// "en", // langKey
// Arrays.asList(AuthoritiesConstants.USER)
// );
//
// restMvc.perform(
// post("/api/register")
// .contentType(TestUtil.APPLICATION_JSON_UTF8)
// .content(TestUtil.convertObjectToJsonBytes(u)))
// .andExpect(status().isCreated());
//
// Optional<User> user = userRepository.findOneByLogin("joe");
// assertThat(user.isPresent()).isTrue();
// }
//
// @Test
// @Transactional
// public void testRegisterInvalidLogin() throws Exception {
// UserDTO u = new UserDTO(
// "funky-log!n", // login <-- invalid
// "password", // password
// "Funky", // firstName
// "One", // lastName
// "funky@example.com", // e-mail
// "en", // langKey
// Arrays.asList(AuthoritiesConstants.USER)
// );
//
// restUserMockMvc.perform(
// post("/api/register")
// .contentType(TestUtil.APPLICATION_JSON_UTF8)
// .content(TestUtil.convertObjectToJsonBytes(u)))
// .andExpect(status().isBadRequest());
//
// Optional<User> user = userRepository.findOneByEmail("funky@example.com");
// assertThat(user.isPresent()).isFalse();
// }
//
// @Test
// @Transactional
// public void testRegisterInvalidEmail() throws Exception {
// UserDTO u = new UserDTO(
// "bob", // login
// "password", // password
// "Bob", // firstName
// "Green", // lastName
// "invalid", // e-mail <-- invalid
// "en", // langKey
// Arrays.asList(AuthoritiesConstants.USER)
// );
//
// restUserMockMvc.perform(
// post("/api/register")
// .contentType(TestUtil.APPLICATION_JSON_UTF8)
// .content(TestUtil.convertObjectToJsonBytes(u)))
// .andExpect(status().isBadRequest());
//
// Optional<User> user = userRepository.findOneByLogin("bob");
// assertThat(user.isPresent()).isFalse();
// }
//
// @Test
// @Transactional
// public void testRegisterDuplicateLogin() throws Exception {
// // Good
// UserDTO u = new UserDTO(
// "alice", // login
// "password", // password
// "Alice", // firstName
// "Something", // lastName
// "alice@example.com", // e-mail
// "en", // langKey
// Arrays.asList(AuthoritiesConstants.USER)
// );
//
// // Duplicate login, different e-mail
// UserDTO dup = new UserDTO(u.getLogin(), u.getPassword(), u.getLogin(), u.getLastName(),
// "alicejr@example.com", u.getLangKey(), u.getRoles());
//
// // Good user
// restMvc.perform(
// post("/api/register")
// .contentType(TestUtil.APPLICATION_JSON_UTF8)
// .content(TestUtil.convertObjectToJsonBytes(u)))
// .andExpect(status().isCreated());
//
// // Duplicate login
// restMvc.perform(
// post("/api/register")
// .contentType(TestUtil.APPLICATION_JSON_UTF8)
// .content(TestUtil.convertObjectToJsonBytes(dup)))
// .andExpect(status().is4xxClientError());
//
// Optional<User> userDup = userRepository.findOneByEmail("alicejr@example.com");
// assertThat(userDup.isPresent()).isFalse();
// }
//
// @Test
// @Transactional
// public void testRegisterDuplicateEmail() throws Exception {
// // Good
// UserDTO u = new UserDTO(
// "john", // login
// "password", // password
// "John", // firstName
// "Doe", // lastName
// "john@example.com", // e-mail
// "en", // langKey
// Arrays.asList(AuthoritiesConstants.USER)
// );
//
// // Duplicate e-mail, different login
// UserDTO dup = new UserDTO("johnjr", u.getPassword(), u.getLogin(), u.getLastName(),
// u.getEmail(), u.getLangKey(), u.getRoles());
//
// // Good user
// restMvc.perform(
// post("/api/register")
// .contentType(TestUtil.APPLICATION_JSON_UTF8)
// .content(TestUtil.convertObjectToJsonBytes(u)))
// .andExpect(status().isCreated());
//
// // Duplicate e-mail
// restMvc.perform(
// post("/api/register")
// .contentType(TestUtil.APPLICATION_JSON_UTF8)
// .content(TestUtil.convertObjectToJsonBytes(dup)))
// .andExpect(status().is4xxClientError());
//
// Optional<User> userDup = userRepository.findOneByLogin("johnjr");
// assertThat(userDup.isPresent()).isFalse();
// }
//
// @Test
// @Transactional
// public void testRegisterAdminIsIgnored() throws Exception {
// UserDTO u = new UserDTO(
// "badguy", // login
// "password", // password
// "Bad", // firstName
// "Guy", // lastName
// "badguy@example.com", // e-mail
// "en", // langKey
// Arrays.asList(AuthoritiesConstants.ADMIN) // <-- only admin should be able to do that
// );
//
// restMvc.perform(
// post("/api/register")
// .contentType(TestUtil.APPLICATION_JSON_UTF8)
// .content(TestUtil.convertObjectToJsonBytes(u)))
// .andExpect(status().isCreated());
//
// Optional<User> userDup = userRepository.findOneByLogin("badguy");
// assertThat(userDup.isPresent()).isTrue();
// assertThat(userDup.get().getAuthorities()).hasSize(1)
// .containsExactly(authorityRepository.findOne(AuthoritiesConstants.USER));
// }
//}