Skip to content

Commit

Permalink
[#54] test: FollowableDto 정적 팩토리 메서드 fromUserAndFollowable() 테스트 작성
Browse files Browse the repository at this point in the history
  • Loading branch information
kwj1270 committed Oct 11, 2021
1 parent 18cf842 commit 27af8e6
Showing 55 changed files with 400 additions and 200 deletions.
22 changes: 21 additions & 1 deletion build.gradle
Original file line number Diff line number Diff line change
@@ -2,6 +2,7 @@ plugins {
id 'org.springframework.boot' version '2.5.3'
id 'io.spring.dependency-management' version '1.0.11.RELEASE'
id "org.asciidoctor.convert" version "1.5.9.2"
id "com.ewerk.gradle.plugins.querydsl" version "1.0.10"
id 'java'
id 'jacoco'
}
@@ -19,6 +20,9 @@ dependencies {
implementation 'org.springframework.boot:spring-boot-starter-security'
implementation 'org.springframework.boot:spring-boot-starter-validation'
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
implementation 'com.querydsl:querydsl-jpa'
implementation 'com.github.gavlyukovskiy:p6spy-spring-boot-starter:1.5.8'

runtimeOnly 'com.h2database:h2'
testImplementation 'org.springframework.boot:spring-boot-starter-test'

@@ -32,6 +36,21 @@ dependencies {

apply from: 'test.gradle'

def querydslDir = "$buildDir/generated/querydsl"
querydsl {
jpa = true
querydslSourcesDir = querydslDir
}
sourceSets {
main.java.srcDir querydslDir
}
configurations {
querydsl.extendsFrom compileClasspath
}
compileQuerydsl {
options.annotationProcessorPath = configurations.querydsl
}

ext {
set('snippetsDir', file("build/generated-snippets")) // 문서 저장위치
}
@@ -63,4 +82,5 @@ task copyDocument(type: Copy) { // 생성된 docs 파일을 build시 static 아

build {
dependsOn copyDocument // build시 copy 실행
}
}

Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
package com.study.realworld.domain.auth.application;

import com.study.realworld.domain.user.domain.Email;
import com.study.realworld.domain.user.domain.Password;
import com.study.realworld.domain.user.domain.User;
import com.study.realworld.domain.user.domain.UserRepository;
import com.study.realworld.domain.user.domain.vo.Email;
import com.study.realworld.domain.user.domain.vo.Password;
import com.study.realworld.domain.user.domain.persist.User;
import com.study.realworld.domain.user.domain.persist.UserRepository;
import com.study.realworld.domain.user.error.exception.EmailNotFoundException;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.stereotype.Service;
Original file line number Diff line number Diff line change
@@ -3,8 +3,8 @@
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.annotation.JsonTypeInfo;
import com.fasterxml.jackson.annotation.JsonTypeName;
import com.study.realworld.domain.user.domain.Email;
import com.study.realworld.domain.user.domain.Password;
import com.study.realworld.domain.user.domain.vo.Email;
import com.study.realworld.domain.user.domain.vo.Password;

@JsonTypeName("user")
@JsonTypeInfo(include = JsonTypeInfo.As.WRAPPER_OBJECT, use = JsonTypeInfo.Id.NAME)
Original file line number Diff line number Diff line change
@@ -3,8 +3,8 @@
import com.study.realworld.domain.auth.dto.ResponseToken;
import com.study.realworld.domain.auth.dto.token.AccessToken;
import com.study.realworld.domain.auth.dto.token.RefreshToken;
import com.study.realworld.domain.user.domain.Email;
import com.study.realworld.domain.user.domain.User;
import com.study.realworld.domain.user.domain.vo.Email;
import com.study.realworld.domain.user.domain.persist.User;
import com.study.realworld.global.jwt.error.exception.JwtParseException;
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.JwtParser;
Original file line number Diff line number Diff line change
@@ -4,7 +4,7 @@
import com.study.realworld.domain.auth.dto.LoginRequest;
import com.study.realworld.domain.auth.dto.ResponseToken;
import com.study.realworld.domain.auth.infrastructure.TokenProvider;
import com.study.realworld.domain.user.domain.User;
import com.study.realworld.domain.user.domain.persist.User;
import com.study.realworld.domain.user.dto.UserResponse;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.PostMapping;
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package com.study.realworld.domain.follow.domain;

import com.study.realworld.domain.user.domain.User;
import com.study.realworld.domain.user.domain.persist.User;

import javax.persistence.*;

Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
package com.study.realworld.domain.follow.domain;

import com.querydsl.jpa.impl.JPAQueryFactory;
import com.study.realworld.domain.follow.dto.FollowableDto;
import com.study.realworld.domain.user.domain.persist.User;
import org.springframework.stereotype.Repository;

import java.util.Objects;

import static com.study.realworld.domain.follow.domain.QFollow.follow;

@Repository
public class FollowQueryDslRepository {
private final JPAQueryFactory query;

public FollowQueryDslRepository(final JPAQueryFactory jpaQueryFactory) {
this.query = jpaQueryFactory;
}

public FollowableDto existMeAndFollowing(final User me, final User following) {
final Integer count = query.selectOne()
.from(follow)
.where(follow.following.eq(following), follow.follower.eq(me))
.fetchFirst();
boolean followable = !Objects.isNull(count);
return FollowableDto.fromUserAndFollowable(me, followable);
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
package com.study.realworld.domain.follow.dto;

import com.fasterxml.jackson.annotation.JsonProperty;
import com.study.realworld.domain.user.domain.persist.User;
import com.study.realworld.domain.user.domain.vo.Bio;
import com.study.realworld.domain.user.domain.vo.Image;
import com.study.realworld.domain.user.domain.vo.Name;

public class FollowableDto {

@JsonProperty("username")
private Name username;

@JsonProperty("bio")
private Bio bio;

@JsonProperty("image")
private Image image;

@JsonProperty("following")
private Boolean followable;

public static FollowableDto fromUserAndFollowable(final User me, final boolean followable) {
return new FollowableDto(me.username(), me.bio(), me.image(), followable);
}

FollowableDto() {
}

private FollowableDto(final Name username, final Bio bio, final Image image, final Boolean followable) {
this.username = username;
this.bio = bio;
this.image = image;
this.followable = followable;
}

}
Original file line number Diff line number Diff line change
@@ -1,8 +1,9 @@
package com.study.realworld.domain.user.application;

import com.study.realworld.domain.user.domain.Email;
import com.study.realworld.domain.user.domain.User;
import com.study.realworld.domain.user.domain.UserRepository;
import com.study.realworld.domain.follow.domain.FollowRepository;
import com.study.realworld.domain.user.domain.vo.Email;
import com.study.realworld.domain.user.domain.persist.User;
import com.study.realworld.domain.user.domain.persist.UserRepository;
import com.study.realworld.domain.user.error.exception.EmailNotFoundException;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@@ -12,15 +13,22 @@
public class UserFindService {

private final UserRepository userRepository;
private final FollowRepository followRepository;

public UserFindService(final UserRepository userRepository) {
public UserFindService(final UserRepository userRepository, final FollowRepository followRepository) {
this.userRepository = userRepository;
this.followRepository = followRepository;
}

public User findUserByEmail(final String email) {
return findByEmail(email);
}

// public User findProfileByName(final Long id, final Name username) {
// final User user = userRepository.findById(id).orElseThrow(IllegalArgumentException::new);
// return findByEmail();
// }

private User findByEmail(final String email) {
return userRepository.findByEmail(new Email(email))
.orElseThrow(() -> new EmailNotFoundException(email));
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
package com.study.realworld.domain.user.application;

import com.study.realworld.domain.user.domain.Email;
import com.study.realworld.domain.user.domain.User;
import com.study.realworld.domain.user.domain.UserRepository;
import com.study.realworld.domain.user.domain.vo.Email;
import com.study.realworld.domain.user.domain.persist.User;
import com.study.realworld.domain.user.domain.persist.UserRepository;
import com.study.realworld.domain.user.error.exception.DuplicatedEmailException;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.stereotype.Service;
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
package com.study.realworld.domain.user.application;

import com.study.realworld.domain.user.domain.Email;
import com.study.realworld.domain.user.domain.User;
import com.study.realworld.domain.user.domain.UserRepository;
import com.study.realworld.domain.user.domain.vo.Email;
import com.study.realworld.domain.user.domain.persist.User;
import com.study.realworld.domain.user.domain.persist.UserRepository;
import com.study.realworld.domain.user.error.exception.DuplicatedEmailException;
import com.study.realworld.domain.user.error.exception.IdentityNotFoundException;
import org.springframework.stereotype.Service;
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
package com.study.realworld.domain.user.domain;
package com.study.realworld.domain.user.domain.persist;

import com.study.realworld.domain.BaseTimeEntity;
import com.study.realworld.domain.follow.domain.Follow;
import com.study.realworld.domain.user.domain.vo.*;
import com.study.realworld.domain.user.error.exception.PasswordMissMatchException;
import org.springframework.security.crypto.password.PasswordEncoder;

Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package com.study.realworld.domain.user.domain;
package com.study.realworld.domain.user.domain.persist;

import org.springframework.data.jpa.repository.JpaRepository;
import com.study.realworld.domain.user.domain.vo.Email;
import com.study.realworld.domain.user.domain.vo.Name;
import org.springframework.data.repository.CrudRepository;
import org.springframework.stereotype.Repository;

@@ -10,4 +11,8 @@
public interface UserRepository extends CrudRepository<User, Long> {
Optional<User> findByEmail(final Email email);
boolean existsByEmail(final Email email);

Optional<User> findByUsername(final Name followingName, final Name followerName);

}

Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.study.realworld.domain.user.domain;
package com.study.realworld.domain.user.domain.vo;

import com.fasterxml.jackson.annotation.JsonValue;

Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.study.realworld.domain.user.domain;
package com.study.realworld.domain.user.domain.vo;

import com.fasterxml.jackson.annotation.JsonValue;

Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.study.realworld.domain.user.domain;
package com.study.realworld.domain.user.domain.vo;

import com.fasterxml.jackson.annotation.JsonValue;

Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.study.realworld.domain.user.domain;
package com.study.realworld.domain.user.domain.vo;

import com.fasterxml.jackson.annotation.JsonValue;

Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.study.realworld.domain.user.domain;
package com.study.realworld.domain.user.domain.vo;

import com.fasterxml.jackson.annotation.JsonValue;
import org.springframework.security.crypto.password.PasswordEncoder;
Original file line number Diff line number Diff line change
@@ -3,10 +3,10 @@
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.annotation.JsonTypeInfo;
import com.fasterxml.jackson.annotation.JsonTypeName;
import com.study.realworld.domain.user.domain.Email;
import com.study.realworld.domain.user.domain.Name;
import com.study.realworld.domain.user.domain.Password;
import com.study.realworld.domain.user.domain.User;
import com.study.realworld.domain.user.domain.vo.Email;
import com.study.realworld.domain.user.domain.vo.Name;
import com.study.realworld.domain.user.domain.vo.Password;
import com.study.realworld.domain.user.domain.persist.User;

@JsonTypeName("user")
@JsonTypeInfo(include = JsonTypeInfo.As.WRAPPER_OBJECT, use = JsonTypeInfo.Id.NAME)
Original file line number Diff line number Diff line change
@@ -3,7 +3,11 @@
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.annotation.JsonTypeInfo;
import com.fasterxml.jackson.annotation.JsonTypeName;
import com.study.realworld.domain.user.domain.*;
import com.study.realworld.domain.user.domain.persist.User;
import com.study.realworld.domain.user.domain.vo.Bio;
import com.study.realworld.domain.user.domain.vo.Email;
import com.study.realworld.domain.user.domain.vo.Image;
import com.study.realworld.domain.user.domain.vo.Name;

@JsonTypeName("user")
@JsonTypeInfo(include = JsonTypeInfo.As.WRAPPER_OBJECT, use = JsonTypeInfo.Id.NAME)
Original file line number Diff line number Diff line change
@@ -4,7 +4,11 @@
import com.fasterxml.jackson.annotation.JsonTypeInfo;
import com.fasterxml.jackson.annotation.JsonTypeName;
import com.study.realworld.domain.auth.dto.ResponseToken;
import com.study.realworld.domain.user.domain.*;
import com.study.realworld.domain.user.domain.persist.User;
import com.study.realworld.domain.user.domain.vo.Bio;
import com.study.realworld.domain.user.domain.vo.Email;
import com.study.realworld.domain.user.domain.vo.Image;
import com.study.realworld.domain.user.domain.vo.Name;

@JsonTypeName("user")
@JsonTypeInfo(include = JsonTypeInfo.As.WRAPPER_OBJECT, use = JsonTypeInfo.Id.NAME)
Original file line number Diff line number Diff line change
@@ -3,10 +3,10 @@
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.annotation.JsonTypeInfo;
import com.fasterxml.jackson.annotation.JsonTypeName;
import com.study.realworld.domain.user.domain.Bio;
import com.study.realworld.domain.user.domain.Email;
import com.study.realworld.domain.user.domain.Image;
import com.study.realworld.domain.user.domain.User;
import com.study.realworld.domain.user.domain.vo.Bio;
import com.study.realworld.domain.user.domain.vo.Email;
import com.study.realworld.domain.user.domain.vo.Image;
import com.study.realworld.domain.user.domain.persist.User;

@JsonTypeName("user")
@JsonTypeInfo(include = JsonTypeInfo.As.WRAPPER_OBJECT, use = JsonTypeInfo.Id.NAME)
Original file line number Diff line number Diff line change
@@ -4,7 +4,7 @@
import com.study.realworld.domain.auth.infrastructure.TokenProvider;
import com.study.realworld.domain.user.application.UserJoinService;
import com.study.realworld.domain.user.application.UserUpdateService;
import com.study.realworld.domain.user.domain.User;
import com.study.realworld.domain.user.domain.persist.User;
import com.study.realworld.domain.user.dto.UserJoinRequest;
import com.study.realworld.domain.user.dto.UserResponse;
import com.study.realworld.domain.user.dto.UserUpdateRequest;
Original file line number Diff line number Diff line change
@@ -1,9 +1,25 @@
package com.study.realworld.global.jpa.config;

import com.querydsl.jpa.impl.JPAQueryFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.jpa.repository.config.EnableJpaAuditing;

import javax.persistence.EntityManager;

@EnableJpaAuditing
@Configuration
public class JpaConfiguration {

private final EntityManager entityManager;

public JpaConfiguration(final EntityManager entityManager) {
this.entityManager = entityManager;
}

@Bean
public JPAQueryFactory jpaQueryFactory() {
return new JPAQueryFactory(entityManager);
}

}
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package com.study.realworld.global.jwt.authentication;

import com.study.realworld.domain.user.domain.Password;
import com.study.realworld.domain.user.domain.User;
import com.study.realworld.domain.user.domain.vo.Password;
import com.study.realworld.domain.user.domain.persist.User;
import org.springframework.security.authentication.AbstractAuthenticationToken;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.SpringSecurityCoreVersion;
@@ -10,7 +10,7 @@
import java.util.Collection;
import java.util.Collections;

import static com.study.realworld.domain.user.domain.User.DEFAULT_AUTHORITY;
import static com.study.realworld.domain.user.domain.persist.User.DEFAULT_AUTHORITY;

public class JwtAuthentication extends AbstractAuthenticationToken {

Loading

0 comments on commit 27af8e6

Please sign in to comment.