// Path: src/main/java/com/monkeyk/sos/domain/user/User.java
// public class User extends AbstractDomain {
// 
// 
//     private static final long serialVersionUID = -2921689304753120556L;
// 
// 
//     private String username;
//     private String password;
// 
//     private String phone;
//     private String email;
//     //Default user is initial when create database, do not delete
//     private boolean defaultUser = false;
// 
//     private Date lastLoginTime;
// 
//     private List<Privilege> privileges = new ArrayList<>();
// 
//     public User() {
//     }
// 
//     public User(String username, String password, String phone, String email) {
//         this.username = username;
//         this.password = password;
//         this.phone = phone;
//         this.email = email;
//     }
// 
//     public boolean defaultUser() {
//         return defaultUser;
//     }
// 
//     public String username() {
//         return username;
//     }
// 
//     public String password() {
//         return password;
//     }
// 
//     public String phone() {
//         return phone;
//     }
// 
//     public String email() {
//         return email;
//     }
// 
//     public List<Privilege> privileges() {
//         return privileges;
//     }
// 
//     @Override
//     public String toString() {
//         final StringBuilder sb = new StringBuilder();
//         sb.append("{username='").append(username).append('\'');
//         sb.append(", phone='").append(phone).append('\'');
//         sb.append(", id='").append(id).append('\'');
//         sb.append(", guid='").append(guid).append('\'');
//         sb.append(", defaultUser='").append(defaultUser).append('\'');
//         sb.append(", email='").append(email).append('\'');
//         sb.append('}');
//         return sb.toString();
//     }
// 
//     public User email(String email) {
//         this.email = email;
//         return this;
//     }
// 
//     public User phone(String phone) {
//         this.phone = phone;
//         return this;
//     }
// 
// 
//     public User username(String username) {
//         this.username = username;
//         return this;
//     }
// 
// 
//     public Date lastLoginTime() {
//         return lastLoginTime;
//     }
// 
//     public User lastLoginTime(Date lastLoginTime) {
//         this.lastLoginTime = lastLoginTime;
//         return this;
//     }
// 
//     public User createTime(LocalDateTime createTime) {
//         this.createTime = createTime;
//         return this;
//     }
// 
//     public User password(String password) {
//         this.password = password;
//         return this;
//     }
// }
// 
// Path: src/main/java/com/monkeyk/sos/domain/user/UserRepository.java
// public interface UserRepository extends Repository {
// 
//     User findByGuid(String guid);
// 
//     void saveUser(User user);
// 
//     void updateUser(User user);
// 
//     User findByUsername(String username);
// 
//     List<User> findUsersByUsername(String username);
// }
// 
// Path: src/test/java/com/monkeyk/sos/infrastructure/AbstractRepositoryTest.java
// public abstract class AbstractRepositoryTest extends ContextTest {
// 
// 
//     @Autowired
//     private JdbcTemplate jdbcTemplate;
// 
// 
//     public JdbcTemplate jdbcTemplate() {
//         return jdbcTemplate;
//     }
// 
// 
// }


import com.monkeyk.sos.domain.user.User;
import com.monkeyk.sos.domain.user.UserRepository;
import com.monkeyk.sos.infrastructure.AbstractRepositoryTest;
import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;
import java.util.List;
import static org.junit.Assert.*;
    @Test
    public void findUsersByUsername() {
        User user = userRepository.findByGuid("oood");
        assertNull(user);

        user = new User("user", "123", "123", "ewo@honyee.cc");
        userRepository.saveUser(user);

        final List<User> list = userRepository.findUsersByUsername(user.username());
        assertNotNull(list);

        assertEquals(list.size(), 1);

    }


    @Test
    public void updateUser() {
        User user = new User("user", "123", "123", "ewo@honyee.cc");
        userRepository.saveUser(user);

        user = userRepository.findByGuid(user.guid());
        assertNotNull(user);
        assertNotNull(user.email());

        String newEmail = "test@honyee.cc";
        user.email(newEmail).phone("12344444");
        userRepository.updateUser(user);

        user = userRepository.findByGuid(user.guid());
// Path: src/main/java/com/monkeyk/sos/domain/user/User.java
// public class User extends AbstractDomain {
// 
// 
//     private static final long serialVersionUID = -2921689304753120556L;
// 
// 
//     private String username;
//     private String password;
// 
//     private String phone;
//     private String email;
//     //Default user is initial when create database, do not delete
//     private boolean defaultUser = false;
// 
//     private Date lastLoginTime;
// 
//     private List<Privilege> privileges = new ArrayList<>();
// 
//     public User() {
//     }
// 
//     public User(String username, String password, String phone, String email) {
//         this.username = username;
//         this.password = password;
//         this.phone = phone;
//         this.email = email;
//     }
// 
//     public boolean defaultUser() {
//         return defaultUser;
//     }
// 
//     public String username() {
//         return username;
//     }
// 
//     public String password() {
//         return password;
//     }
// 
//     public String phone() {
//         return phone;
//     }
// 
//     public String email() {
//         return email;
//     }
// 
//     public List<Privilege> privileges() {
//         return privileges;
//     }
// 
//     @Override
//     public String toString() {
//         final StringBuilder sb = new StringBuilder();
//         sb.append("{username='").append(username).append('\'');
//         sb.append(", phone='").append(phone).append('\'');
//         sb.append(", id='").append(id).append('\'');
//         sb.append(", guid='").append(guid).append('\'');
//         sb.append(", defaultUser='").append(defaultUser).append('\'');
//         sb.append(", email='").append(email).append('\'');
//         sb.append('}');
//         return sb.toString();
//     }
// 
//     public User email(String email) {
//         this.email = email;
//         return this;
//     }
// 
//     public User phone(String phone) {
//         this.phone = phone;
//         return this;
//     }
// 
// 
//     public User username(String username) {
//         this.username = username;
//         return this;
//     }
// 
// 
//     public Date lastLoginTime() {
//         return lastLoginTime;
//     }
// 
//     public User lastLoginTime(Date lastLoginTime) {
//         this.lastLoginTime = lastLoginTime;
//         return this;
//     }
// 
//     public User createTime(LocalDateTime createTime) {
//         this.createTime = createTime;
//         return this;
//     }
// 
//     public User password(String password) {
//         this.password = password;
//         return this;
//     }
// }
// 
// Path: src/main/java/com/monkeyk/sos/domain/user/UserRepository.java
// public interface UserRepository extends Repository {
// 
//     User findByGuid(String guid);
// 
//     void saveUser(User user);
// 
//     void updateUser(User user);
// 
//     User findByUsername(String username);
// 
//     List<User> findUsersByUsername(String username);
// }
// 
// Path: src/test/java/com/monkeyk/sos/infrastructure/AbstractRepositoryTest.java
// public abstract class AbstractRepositoryTest extends ContextTest {
// 
// 
//     @Autowired
//     private JdbcTemplate jdbcTemplate;
// 
// 
//     public JdbcTemplate jdbcTemplate() {
//         return jdbcTemplate;
//     }
// 
// 
// }


// Path: src/test/java/com/monkeyk/sos/infrastructure/jdbc/UserRepositoryJdbcTest.java
import com.monkeyk.sos.domain.user.User;
import com.monkeyk.sos.domain.user.UserRepository;
import com.monkeyk.sos.infrastructure.AbstractRepositoryTest;
import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;
import java.util.List;
import static org.junit.Assert.*;

    @Test
    public void findUsersByUsername() {
        User user = userRepository.findByGuid("oood");
        assertNull(user);

        user = new User("user", "123", "123", "ewo@honyee.cc");
        userRepository.saveUser(user);

        final List<User> list = userRepository.findUsersByUsername(user.username());
        assertNotNull(list);

        assertEquals(list.size(), 1);

    }


    @Test
    public void updateUser() {
        User user = new User("user", "123", "123", "ewo@honyee.cc");
        userRepository.saveUser(user);

        user = userRepository.findByGuid(user.guid());
        assertNotNull(user);
        assertNotNull(user.email());

        String newEmail = "test@honyee.cc";
        user.email(newEmail).phone("12344444");
        userRepository.updateUser(user);

        user = userRepository.findByGuid(user.guid());
        assertNotNull(user);