Skip to content

Commit bfb23d2

Browse files
committed
test: WebPageImageStoreImpl의 로직 테스트 추가
1 parent eadaffd commit bfb23d2

1 file changed

Lines changed: 79 additions & 0 deletions

File tree

Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
//
2+
// WebPageImageStoreImplTests.swift
3+
// DevLogPersistenceTests
4+
//
5+
// Created by opfic on 6/3/26.
6+
//
7+
8+
import Foundation
9+
import Testing
10+
@testable import DevLogPersistence
11+
12+
@Suite(.serialized)
13+
struct WebPageImageStoreImplTests {
14+
@Test("웹페이지 이미지는 저장되고 삭제된다")
15+
func 웹페이지_이미지는_저장되고_삭제된다() async throws {
16+
let store = WebPageImageStoreImpl()
17+
let fileManager = FileManager.default
18+
try await store.clearDirectory()
19+
let url = try #require(URL(string: "https://example.com/image"))
20+
let data = Data("image-data".utf8)
21+
22+
let fileURL = try await store.saveImage(data, for: url)
23+
24+
let savedData = try #require(fileManager.contents(atPath: fileURL.path))
25+
let directorySize = await store.dirSizeInBytes()
26+
#expect(fileURL.deletingLastPathComponent().lastPathComponent == "webPageImages")
27+
#expect(savedData == data)
28+
#expect(0 < directorySize)
29+
30+
let removed = try await store.removeImage(for: url)
31+
let removedAgain = try await store.removeImage(for: url)
32+
33+
#expect(removed)
34+
#expect(!removedAgain)
35+
#expect(!fileManager.fileExists(atPath: fileURL.path))
36+
37+
try await store.clearDirectory()
38+
}
39+
40+
@Test("웹페이지 이미지 디렉터리 삭제는 저장된 이미지를 모두 제거한다")
41+
func 웹페이지_이미지_디렉터리_삭제는_저장된_이미지를_모두_제거한다() async throws {
42+
let store = WebPageImageStoreImpl()
43+
try await store.clearDirectory()
44+
let firstURL = try #require(URL(string: "https://example.com/first"))
45+
let secondURL = try #require(URL(string: "https://example.com/second"))
46+
47+
_ = try await store.saveImage(Data("first".utf8), for: firstURL)
48+
_ = try await store.saveImage(Data("second".utf8), for: secondURL)
49+
try await store.clearDirectory()
50+
51+
let directorySize = await store.dirSizeInBytes()
52+
#expect(directorySize == 0)
53+
}
54+
55+
@Test("동시 저장 요청은 요청 순서대로 같은 파일을 갱신한다")
56+
func 동시_저장_요청은_요청_순서대로_같은_파일을_갱신한다() async throws {
57+
let store = WebPageImageStoreImpl()
58+
try await store.clearDirectory()
59+
let url = try #require(URL(string: "https://example.com/\(UUID().uuidString)"))
60+
let firstData = Data(repeating: 1, count: 64 * 1024 * 1024)
61+
let secondData = Data("latest".utf8)
62+
63+
let firstSaveTask = Task {
64+
try await store.saveImage(firstData, for: url)
65+
}
66+
try await Task.sleep(nanoseconds: 10_000_000)
67+
let secondSaveTask = Task {
68+
try await store.saveImage(secondData, for: url)
69+
}
70+
71+
_ = try await firstSaveTask.value
72+
let fileURL = try await secondSaveTask.value
73+
let savedData = try Data(contentsOf: fileURL)
74+
75+
#expect(savedData == secondData)
76+
77+
try await store.clearDirectory()
78+
}
79+
}

0 commit comments

Comments
 (0)