package com.gm.wj.service;

import com.gm.wj.dao.UserDAO;
import com.gm.wj.dto.UserDTO;
import com.gm.wj.entity.AdminRole;
import com.gm.wj.entity.User;
import lombok.extern.log4j.Log4j2;
import org.apache.shiro.crypto.hash.SimpleHash;
import org.junit.After;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import static org.mockito.Mockito.*;

import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.junit.MockitoJUnitRunner;
import org.springframework.boot.test.context.SpringBootTest;

import java.util.ArrayList;
import java.util.List;

import static org.hamcrest.CoreMatchers.is;

@Log4j2
@RunWith(MockitoJUnitRunner.class)
//@RunWith(SpringRunner.class)
@SpringBootTest
public class UserServiceTest {
    @Mock
    private UserDAO userDAO;
    @Mock
    private AdminRoleService adminRoleService;
    @InjectMocks
    private UserService userService;

    List<User> users = new ArrayList<>();
    List<AdminRole> roles = new ArrayList<>();

    @Before
    public void before() {

    }

    @Test
    public void testList() {
        User testUser = User.builder().username("utest").build();
        AdminRole testRole = AdminRole.builder().name("rtest").build();
        users.add(testUser);
        roles.add(testRole);

        when(userDAO.findAll()).thenReturn(users);
        when(adminRoleService.listRolesByUser(testUser.getUsername())).thenReturn(roles);

        List<UserDTO> userDTOS = userService.list();
        Assert.assertThat(userDTOS.get(0).getUsername(), is("utest"));
        Assert.assertThat(userDTOS.get(0).getRoles().get(0).getName(), is("rtest"));
    }

    @Test
    public void testRegister_Normal() {
        User testUser = User.builder()
                .username("utest").password("123").name("测试用户").email("[email protected]").phone("12312312312").build();

        when(userDAO.save(any(User.class))).thenAnswer(i ->  i.getArguments()[0]);

        Assert.assertThat(userService.register(testUser), is(1));
    }

    @Test
    public void testResetPassword_Normal() {
        User testUser = User.builder()
                .username("utest").password("123456").name("测试用户").email("[email protected]").phone("12312312312").build();

        when(userDAO.findByUsername("utest")).thenReturn(testUser);
        when(userDAO.save(any(User.class))).thenAnswer(i ->  i.getArguments()[0]);

        User resetUser = userService.resetPassword(testUser);
        Assert.assertThat(resetUser.getPassword(),is(new SimpleHash("md5", "123", resetUser.getSalt(), 2).toString()));
    }

    @After
    public void after() {

    }
}