05296b3166
- FU-C 멀티파트 업로드(DSClient.uploadDocument + LiveDSClient 401 재시도 공유 + 툴바/상태바) - FU-D 네이티브 다운로드(NSSavePanel + URLSession, ?token= 미노출, 임시파일 정리) - 로그아웃(AppModel.logout 세션 전체 초기화 + 계정 메뉴) - 셸 2-column 재구성: 질문/이드 제거, 홈 코크핏 + 문서 3-pane 컬럼 브라우저 (인스펙터 TL;DR/핵심점/심층/불일치) + 도메인 필터 전체 load-all - 적대 리뷰 반영(stale 401 데모션·다운로드 임시파일 정리·메모 저장 saveMemo 경유·도메인 필터 선택 정합) Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
43 lines
2.1 KiB
Swift
43 lines
2.1 KiB
Swift
import XCTest
|
|
@testable import DSKit
|
|
|
|
/// 멀티파트 업로드 — Fixture 에코 + multipart 본문 형태(경계/디스포지션/한글 파일명/필드/파일 데이터).
|
|
final class UploadTests: XCTestCase {
|
|
|
|
func testFixtureUploadReturnsDocument() async throws {
|
|
let doc = try await FixtureDSClient().uploadDocument(
|
|
DocumentUpload(filename: "a.pdf", data: Data("x".utf8), mimeType: "application/pdf"))
|
|
XCTAssertGreaterThan(doc.id, 0)
|
|
}
|
|
|
|
func testMultipartBodyShape() throws {
|
|
let upload = DocumentUpload(
|
|
filename: "보고서.pdf",
|
|
data: Data("PDFDATA".utf8),
|
|
mimeType: "application/pdf",
|
|
docPurpose: "knowledge"
|
|
)
|
|
let boundary = "TESTBOUNDARY"
|
|
let body = LiveDSClient.multipartBody(for: upload, boundary: boundary)
|
|
let s = try XCTUnwrap(String(data: body, encoding: .utf8))
|
|
|
|
XCTAssertTrue(s.contains("--TESTBOUNDARY\r\n"), "경계 마커")
|
|
XCTAssertTrue(s.contains(#"Content-Disposition: form-data; name="file"; filename="보고서.pdf""#),
|
|
"file 파트 + 한글 파일명")
|
|
XCTAssertTrue(s.contains("Content-Type: application/pdf"), "파일 mime")
|
|
XCTAssertTrue(s.contains(#"Content-Disposition: form-data; name="doc_purpose""#), "선택 form 필드")
|
|
XCTAssertTrue(s.contains("knowledge"))
|
|
XCTAssertTrue(s.contains("PDFDATA"), "파일 데이터")
|
|
XCTAssertTrue(s.hasSuffix("--TESTBOUNDARY--\r\n"), "종료 경계")
|
|
}
|
|
|
|
func testMultipartOmitsAbsentOptionalFields() throws {
|
|
let upload = DocumentUpload(filename: "x.txt", data: Data("a".utf8))
|
|
let body = LiveDSClient.multipartBody(for: upload, boundary: "B")
|
|
let s = try XCTUnwrap(String(data: body, encoding: .utf8))
|
|
XCTAssertFalse(s.contains("doc_purpose"), "미지정 doc_purpose 는 본문에 없어야 함")
|
|
XCTAssertFalse(s.contains("library_path"), "미지정 library_path 는 본문에 없어야 함")
|
|
XCTAssertTrue(s.contains("Content-Type: application/octet-stream"), "mime 미지정 = octet-stream 폴백")
|
|
}
|
|
}
|