Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

오픈 마켓 [STEP 1] 아리,제리 #82

Merged
merged 43 commits into from
Jan 7, 2022
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
Show all changes
43 commits
Select commit Hold shift + click to select a range
ca846b3
style: SwfitLint 라이브러리 추가
leeari95 Jan 3, 2022
d04a121
feat: Products 타입 추가 #1
llghdud921 Jan 3, 2022
2b14a79
feat: Product 타입 추가 #1
leeari95 Jan 3, 2022
f57c0e3
chore: products 파일 Assests에 추가
llghdud921 Jan 3, 2022
82fafce
feat: 파싱해주는 타입 Parser을 추가 #1
leeari95 Jan 3, 2022
a8e9388
test: ParsetTest 추가 #2
llghdud921 Jan 3, 2022
59f34d1
test: product를 파싱하는 테스트 추가 #2
leeari95 Jan 4, 2022
c4406dd
feat: network class 타입 및 NetworkError 추가 #3
llghdud921 Jan 4, 2022
4c22c0a
feat: URL과 HTTPMethod를 담고있는 타입 추가 #3
leeari95 Jan 4, 2022
2af414a
feat: NetworkManager 추가 #3
llghdud921 Jan 4, 2022
4446fd0
feat: 상품 리스트 조회시 필요한 request를 반환하는 메소드 추가 #3
leeari95 Jan 4, 2022
826aaf3
feat: 상품 상세 조회를 위한 request메서드 추가 #3
llghdud921 Jan 4, 2022
2679eef
feat: 상품의 Secret을 조회할 때 필요한 Request 반환하는 메소드 추가 #3
leeari95 Jan 4, 2022
c67be7b
feat: 상품 삭제를 위한 request 메소드 추가 #3
llghdud921 Jan 4, 2022
0cefe03
feat: 상품 수정을 위한 request 메소드 추가 #3
leeari95 Jan 4, 2022
b088b10
feat: 상품 등록을 위한 request 추가 #3
llghdud921 Jan 4, 2022
be0cb43
refactor: NetworkManager 내부 리팩토링 #4
leeari95 Jan 4, 2022
27fa33f
refactor: NetworkError 내부 리팩토링 및 ProductSecret 타입명 변경 #4
llghdud921 Jan 4, 2022
e73b5fc
refactor: MultipartForm 프로토콜을 Protocol 그룹으로 이동 #4
leeari95 Jan 4, 2022
a54a4ce
refactor: Products 내 CodingKeys 수정 #4
llghdud921 Jan 4, 2022
3294a3d
test: Network의 excute 메소드를 테스트하는 코드 추가 #5
leeari95 Jan 5, 2022
7872ab5
test: NetworkManager의 fetch를 테스트하는 코드 추가 #5
llghdud921 Jan 5, 2022
cacce89
test: URLProtocol을 재정의하여 테스트 코드를 전반적으로 수정 #5
leeari95 Jan 5, 2022
aa5b4d2
refactor: NetworkManager내 multipart image 경로 수정 #4
llghdud921 Jan 5, 2022
fb39366
test: 상품리스트 조회에 맞는 Request를 반환하는 테스트코드 추가 #5
leeari95 Jan 5, 2022
b0eb1e0
test: 상품 상세 조회를 반환하는 request를 확인하는 테스트코드 추가 #5
llghdud921 Jan 5, 2022
e4cdd8a
test: 상품 삭제 Secret 조회에 맞는 Request를 반환하는 테스트코드 추가 #5
leeari95 Jan 5, 2022
7f373fc
test: 상품 삭제를 반환하는 request를 확인하는 테스트코드 추가 #5
llghdud921 Jan 5, 2022
a245770
test: 상품 수정에 맞는 Request를 반환하는 테스트코드 추가 #5
leeari95 Jan 5, 2022
42a798d
test: 상품 등록을 반환하는 request를 확인하는 테스트코드 추가 #5
llghdud921 Jan 5, 2022
1bde0bd
refactor: multipartFormRequest 메소드 내부에 request의 헤더를 추가하는 부분 수정 #4
leeari95 Jan 6, 2022
cfd7f09
refactor: MockURLProtocol내 주석 제거 #4
llghdud921 Jan 6, 2022
79c207a
refactor: NetworkConstant를 Address와 HTTPMethod로 분리 #4
leeari95 Jan 6, 2022
69352ee
docs: Step1 README 작성
llghdud921 Jan 6, 2022
164da38
docs: README.md 파일 수정
leeari95 Jan 6, 2022
afa5c2a
refactor: 테스트 코드에 중복되는 부분 리팩토링 #6
leeari95 Jan 6, 2022
dd21787
refactor: test code내 주석 및 줄바꿈 수정 #6
llghdud921 Jan 6, 2022
7bd46d8
refactor: Image의 프로퍼티 네이밍을 명확하게 수정 #6
leeari95 Jan 6, 2022
513ae69
refator: Content-type,MultipartForm String값 상수로 정의 #6
llghdud921 Jan 6, 2022
e3b81a7
refactor: 에러의 케이스중 네이밍을 명확하게 개선 #6
leeari95 Jan 6, 2022
05fddcb
refactor: Parser, Parsable에 JSON을 추가한 네이밍으로 개선 #6
llghdud921 Jan 6, 2022
e44134c
refactor: Network 프로퍼티에 접근제어 부여하여 개선 #6
leeari95 Jan 6, 2022
d553f99
refactor: Address를 APIAdress로 네이밍 개선 #6
llghdud921 Jan 6, 2022
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
test: Network의 excute 메소드를 테스트하는 코드 추가 #5
- 의존성 주입을 위해서 Sessionable 프로토콜 추가
- Network의 session 타입을 Sessionable로 변경하고 이니셜라이저 추가
- URLSession 테스트를 위해 Sessionable 프로토콜 채택
- 테스트를 위한 MockSession, MockURLSessionDataTask 타입 추가
- Network의 excute 메소드 성공과 실패 케이스 작성
  • Loading branch information
leeari95 committed Jan 5, 2022
commit 3294a3dbfb2a491678cd6d686a8813dcb98d3643
24 changes: 24 additions & 0 deletions OpenMarket/OpenMarket.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,10 @@
9A1CFDCC27842755003BEC69 /* ProductModification.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9A1CFDCB27842755003BEC69 /* ProductModification.swift */; };
9A1CFDCE27842E2E003BEC69 /* Currency.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9A1CFDCD27842E2E003BEC69 /* Currency.swift */; };
9A1CFDD1278469D5003BEC69 /* MultipartForm.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9A1CFDD0278469D5003BEC69 /* MultipartForm.swift */; };
9A1CFDD3278526B8003BEC69 /* NetworkTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9A1CFDD2278526B8003BEC69 /* NetworkTests.swift */; };
9A1CFDD527852721003BEC69 /* MockSession.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9A1CFDD427852721003BEC69 /* MockSession.swift */; };
9A1CFDD8278527CE003BEC69 /* Sessionable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9A1CFDD7278527CE003BEC69 /* Sessionable.swift */; };
9A1CFDDA27852B2D003BEC69 /* MockURLSessionDataTask.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9A1CFDD927852B2D003BEC69 /* MockURLSessionDataTask.swift */; };
C70FB0FB25BEF61C00C9924E /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = C70FB0FA25BEF61C00C9924E /* AppDelegate.swift */; };
C70FB0FD25BEF61C00C9924E /* SceneDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = C70FB0FC25BEF61C00C9924E /* SceneDelegate.swift */; };
C70FB0FF25BEF61C00C9924E /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = C70FB0FE25BEF61C00C9924E /* ViewController.swift */; };
Expand Down Expand Up @@ -54,6 +58,10 @@
9A1CFDCB27842755003BEC69 /* ProductModification.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProductModification.swift; sourceTree = "<group>"; };
9A1CFDCD27842E2E003BEC69 /* Currency.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Currency.swift; sourceTree = "<group>"; };
9A1CFDD0278469D5003BEC69 /* MultipartForm.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MultipartForm.swift; sourceTree = "<group>"; };
9A1CFDD2278526B8003BEC69 /* NetworkTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NetworkTests.swift; sourceTree = "<group>"; };
9A1CFDD427852721003BEC69 /* MockSession.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MockSession.swift; sourceTree = "<group>"; };
9A1CFDD7278527CE003BEC69 /* Sessionable.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Sessionable.swift; sourceTree = "<group>"; };
9A1CFDD927852B2D003BEC69 /* MockURLSessionDataTask.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MockURLSessionDataTask.swift; sourceTree = "<group>"; };
C70FB0F725BEF61C00C9924E /* OpenMarket.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = OpenMarket.app; sourceTree = BUILT_PRODUCTS_DIR; };
C70FB0FA25BEF61C00C9924E /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = "<group>"; };
C70FB0FC25BEF61C00C9924E /* SceneDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SceneDelegate.swift; sourceTree = "<group>"; };
Expand Down Expand Up @@ -95,10 +103,20 @@
isa = PBXGroup;
children = (
9A1CFDD0278469D5003BEC69 /* MultipartForm.swift */,
9A1CFDD7278527CE003BEC69 /* Sessionable.swift */,
);
path = Protocol;
sourceTree = "<group>";
};
9A1CFDD627852793003BEC69 /* Test Doubles */ = {
isa = PBXGroup;
children = (
9A1CFDD427852721003BEC69 /* MockSession.swift */,
9A1CFDD927852B2D003BEC69 /* MockURLSessionDataTask.swift */,
);
name = "Test Doubles";
sourceTree = "<group>";
};
C70FB0EE25BEF61C00C9924E = {
isa = PBXGroup;
children = (
Expand Down Expand Up @@ -138,7 +156,9 @@
F35B1A372782EC300031A755 /* OpenMarketTests */ = {
isa = PBXGroup;
children = (
9A1CFDD627852793003BEC69 /* Test Doubles */,
F35B1A382782EC300031A755 /* ParserTests.swift */,
9A1CFDD2278526B8003BEC69 /* NetworkTests.swift */,
);
path = OpenMarketTests;
sourceTree = "<group>";
Expand Down Expand Up @@ -355,6 +375,7 @@
F35B1A73278442F40031A755 /* ImageFile.swift in Sources */,
9A1CFDC82783EE09003BEC69 /* NetworkConstant.swift in Sources */,
9A1CFDD1278469D5003BEC69 /* MultipartForm.swift in Sources */,
9A1CFDD8278527CE003BEC69 /* Sessionable.swift in Sources */,
9A1CFD7A2782E683003BEC69 /* Parser.swift in Sources */,
9A1CFDC62783DD63003BEC69 /* Vendors.swift in Sources */,
9A1CFD7C2782EB88003BEC69 /* ParserError.swift in Sources */,
Expand All @@ -369,6 +390,9 @@
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
9A1CFDD527852721003BEC69 /* MockSession.swift in Sources */,
9A1CFDDA27852B2D003BEC69 /* MockURLSessionDataTask.swift in Sources */,
9A1CFDD3278526B8003BEC69 /* NetworkTests.swift in Sources */,
F35B1A392782EC300031A755 /* ParserTests.swift in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
Expand Down
6 changes: 5 additions & 1 deletion OpenMarket/OpenMarket/Model/Network/Network.swift
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,11 @@
import Foundation

final class Network {
let session = URLSession.shared
let session: Sessionable

init(session: Sessionable = URLSession.shared) {
self.session = session
}

func execute(request: URLRequest, completion: @escaping (Result<Data?, Error>) -> Void) {
leeari95 marked this conversation as resolved.
Show resolved Hide resolved
session.dataTask(with: request) { data, response, error in
Expand Down
14 changes: 14 additions & 0 deletions OpenMarket/OpenMarket/Protocol/Sessionable.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
//
// Sessionable.swift
// OpenMarket
//
// Created by Ari on 2022/01/05.
//

import Foundation

protocol Sessionable {
func dataTask(with request: URLRequest, completionHandler: @escaping (Data?, URLResponse?, Error?) -> Void) -> URLSessionDataTask
}

extension URLSession: Sessionable {}
32 changes: 32 additions & 0 deletions OpenMarket/OpenMarketTests/MockSession.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
//
// MockNetwork.swift
// OpenMarketTests
//
// Created by Ari on 2022/01/05.
//

import Foundation
@testable import OpenMarket

struct DummyData {
let data: Data?
let response: URLResponse?
let error: Error?
var completionHandler: ((Data?, URLResponse?, Error?) -> Void?)? = nil

func completion() {
completionHandler?(data, response, error)
}
}

class MockSession: Sessionable {
var dummyData: DummyData?

init(dummyData: DummyData) {
self.dummyData = dummyData
}

func dataTask(with request: URLRequest, completionHandler: @escaping (Data?, URLResponse?, Error?) -> Void) -> URLSessionDataTask {
return MockURLSessionDataTask(dummy: dummyData, completionHandler: completionHandler)
}
}
21 changes: 21 additions & 0 deletions OpenMarket/OpenMarketTests/MockURLSessionDataTask.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
//
// MockURLSessionDataTask.swift
// OpenMarketTests
//
// Created by Ari on 2022/01/05.
//

import Foundation

class MockURLSessionDataTask: URLSessionDataTask {
var dummyData: DummyData?

init(dummy: DummyData?, completionHandler: @escaping (Data?, URLResponse?, Error?) -> Void?) {
self.dummyData = dummy
self.dummyData?.completionHandler = completionHandler
}

override func resume() {
dummyData?.completion()
}
}
68 changes: 68 additions & 0 deletions OpenMarket/OpenMarketTests/NetworkTests.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
//
// NetworkTests.swift
// OpenMarketTests
//
// Created by Ari on 2022/01/05.
//

import XCTest
@testable import OpenMarket

class NetworkTests: XCTestCase {

func test_Success() {
// given
let data = "test".data(using: .utf8)!
let url = URL(string: "testURL")!
let responce = HTTPURLResponse(url: url, statusCode: 200, httpVersion: nil, headerFields: nil)
let dummyData = DummyData(data: data, response: responce, error: nil)
let session = MockSession(dummyData: dummyData)
let network = Network(session: session)
let request = URLRequest(url: url)
let expectation = XCTestExpectation(description: "네트워크 실행")

// when
network.execute(request: request) { result in

// then
switch result {
case .success(let sampleData):
XCTAssertEqual(sampleData, data)
case .failure:
XCTFail()
}

expectation.fulfill()
}

wait(for: [expectation], timeout: 5)
}

func test_Failure() {
// given
let data = "test".data(using: .utf8)!
let url = URL(string: "testURL")!
let responce = HTTPURLResponse(url: url, statusCode: 404, httpVersion: nil, headerFields: nil)
let dummyData = DummyData(data: data, response: responce, error: nil)
let session = MockSession(dummyData: dummyData)
let network = Network(session: session)
let request = URLRequest(url: url)
let expectation = XCTestExpectation(description: "네트워크 실행")

// when
network.execute(request: request) { result in

// then
switch result {
case .success:
XCTFail()
case .failure:
XCTAssert(true)
}

expectation.fulfill()
}

wait(for: [expectation], timeout: 5)
}
}