Skip to content

Commit

Permalink
test: Presigned Url 생성 테스트 작성 (#209)
Browse files Browse the repository at this point in the history
* [#208] dependency: testcontainer, localstack 의존성 추가

* [#208] test: PresignedUrlService 테스트 작성
  • Loading branch information
shin-mallang authored Jan 10, 2024
1 parent 0e448fb commit c951802
Show file tree
Hide file tree
Showing 3 changed files with 69 additions and 7 deletions.
6 changes: 6 additions & 0 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,12 @@ dependencies {
testImplementation 'io.rest-assured:rest-assured:5.3.0'
testImplementation 'org.springframework.boot:spring-boot-starter-test'

// TestContainer
testImplementation 'org.testcontainers:junit-jupiter'

// LocalStack
testImplementation 'org.testcontainers:localstack'

testCompileOnly 'org.projectlombok:lombok'
testAnnotationProcessor 'org.projectlombok:lombok'
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@
import java.util.UUID;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Component;
import software.amazon.awssdk.services.s3.model.PutObjectRequest;
import software.amazon.awssdk.services.s3.presigner.S3Presigner;
import software.amazon.awssdk.services.s3.presigner.model.PresignedPutObjectRequest;
import software.amazon.awssdk.services.s3.presigner.model.PutObjectPresignRequest;
Expand All @@ -29,14 +28,14 @@ private String createImageName(String imageExtension) {

private String createPresignedUrl(String imageName) {
try (S3Presigner presigner = presignerBuilder.build()) {
PutObjectRequest objectRequest = PutObjectRequest.builder()
.bucket(s3Property.bucket())
.key(s3Property.imagePath() + imageName)
.build();
PutObjectPresignRequest presignRequest = PutObjectPresignRequest.builder()
.signatureDuration(Duration.ofMinutes(s3Property.presignedUrlExpiresMinutes()))
.putObjectRequest(objectRequest)
.build();
.putObjectRequest(builder -> builder
.bucket(s3Property.bucket())
.key(s3Property.imagePath() + imageName)
.build()
).build();

PresignedPutObjectRequest presignedRequest = presigner.presignPutObject(presignRequest);
return presignedRequest.url().toExternalForm();
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
package com.mallang.common.infra.s3;

import static org.assertj.core.api.Assertions.assertThat;

import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.DisplayNameGeneration;
import org.junit.jupiter.api.DisplayNameGenerator.ReplaceUnderscores;
import org.junit.jupiter.api.Test;
import org.testcontainers.containers.localstack.LocalStackContainer;
import org.testcontainers.junit.jupiter.Container;
import org.testcontainers.junit.jupiter.Testcontainers;
import org.testcontainers.utility.DockerImageName;
import software.amazon.awssdk.auth.credentials.AwsBasicCredentials;
import software.amazon.awssdk.auth.credentials.StaticCredentialsProvider;
import software.amazon.awssdk.regions.Region;
import software.amazon.awssdk.services.s3.presigner.S3Presigner;
import software.amazon.awssdk.services.s3.presigner.S3Presigner.Builder;


@Testcontainers
@DisplayName("프리사인즈 URL 서비스 (PresignedUrlService) 은(는)")
@SuppressWarnings("NonAsciiCharacters")
@DisplayNameGeneration(ReplaceUnderscores.class)
class PresignedUrlServiceTest {

@Container
public LocalStackContainer localStackContainer = new LocalStackContainer(
DockerImageName.parse("localstack/localstack"))
.withServices(LocalStackContainer.Service.S3);

@Test
void 이미지_확장자를_받아_이미지_이름을_UUID로_생성_후_프리사인드_URL을_생성하여_반환한다() {
// given
AwsBasicCredentials awsBasicCredentials = AwsBasicCredentials.create(
localStackContainer.getAccessKey(),
localStackContainer.getSecretKey()
);
Builder presignerBuilder = S3Presigner.builder()
.credentialsProvider(StaticCredentialsProvider.create(awsBasicCredentials))
.region(Region.of(localStackContainer.getRegion()));
PresignedUrlService service = new PresignedUrlService(
presignerBuilder,
new AwsS3Property("mallang-bucket", "images/", 10)
);

// when
CreatePresignedUrlResponse response = service.create("img");

// then
assertThat(response.presignedUrl()).contains(
"https://mallang-bucket.s3.amazonaws.com/",
"images/" + response.imageName(),
".img",
"X-Amz-Expires=" + 60 * 10
);
}
}

0 comments on commit c951802

Please sign in to comment.