Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
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
2 changes: 1 addition & 1 deletion Networking/Sources/Networking/Constants.swift
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ enum Constants {

return url
}()

static let firebaseKey: String = {
return "AIzaSyB0UczrurqM1STyI8tvx4QZVTyQVw4UJ7Q"
}()
Expand Down
48 changes: 48 additions & 0 deletions Networking/Sources/Networking/Requests/FirebaseLoginRequest.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
import Foundation

// MARK: - FirebaseLoginResponse
public struct FirebaseLoginResponse: Codable {
let kind, localID, email, displayName: String
let idToken: String
let registered: Bool
let refreshToken, expiresIn: String
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

expiresIn should be converted to Date

}

// MARK: - FirebaseLoginRequest
public struct FirebaseLoginRequest: RequestType {
Comment on lines +4 to +12
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
public struct FirebaseLoginResponse: Codable {
let kind, localID, email, displayName: String
let idToken: String
let registered: Bool
let refreshToken, expiresIn: String
}
// MARK: - FirebaseLoginRequest
public struct FirebaseLoginRequest: RequestType {
public struct LoginResponse: Codable {
let email, displayName: String
let idToken: String
let registered: Bool
let refreshToken, expiresIn: String
}
// MARK: - FirebaseLoginRequest
public struct LoginRequest: RequestType {

public typealias ResponseType = FirebaseLoginResponse

private let email: String
private let password: String

public init(email: String, password: String) {
self.email = email
self.password = password
}

public var baseUrl: URL { Constants.firebaseAuth }
public var path: String { "/v1/accounts:signInWithPassword" }
public var method: String { "POST" }

public var queryParameters: [String: String] {
[
"key": Constants.firebaseKey
]
}

public var headers: [String: String] {
[ "Content-Type": "application/json" ]
}

public var requestBody: [String: Any] {
[
"email": email,
"password": password,
"returnSecureToken": true
]
}

public let responseDecoder: (Data) throws -> FirebaseLoginResponse = { data in
try JSONDecoder().decode(ResponseType.self, from: data)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ public struct Category: Decodable {
let categoryId, categoryTitle: String
let categoryThumb: String
let categoryDescription: String

enum CodingKeys: String, CodingKey {
case categoryId = "idCategory"
case categoryTitle = "strCategory"
Expand All @@ -21,7 +21,7 @@ public struct Category: Decodable {

// MARK: - MealCategoriesRequest
public struct MealCategoriesRequest: RequestType {

public typealias ResponseType = MealCategoriesResponse

public init() {}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ public struct RegisterRequest: RequestType {
private let email: String
private let password: String
private let returnSecureToken: Bool

public init(email: String, password: String, returnSecureToken: Bool = true) {
self.email = email
self.password = password
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
import XCTest
@testable import Networking

final class FirebaseLoginRequestTests: XCTestCase {

func testFirebaseLoginRequestProperties() {
// Given
let email = "[email protected]"
let password = "secretpassword"
let loginRequest = FirebaseLoginRequest(email: email, password: password)

// Then
XCTAssertEqual(loginRequest.baseUrl, Constants.firebaseAuth)
XCTAssertEqual(loginRequest.path, "/v1/accounts:signInWithPassword")
XCTAssertEqual(loginRequest.method, "POST")
XCTAssertEqual(loginRequest.queryParameters, [
"key": Constants.fireBaseAuthKey
])
XCTAssertEqual(loginRequest.headers, [
"Content-Type": "application/json"
])
}

func testFirebaseLoginRequestBody() {
// Given
let email = "[email protected]"
let password = "secretpassword"
let loginRequest = FirebaseLoginRequest(email: email, password: password)

// When
let requestBody = loginRequest.requestBody

// Then
XCTAssertEqual(requestBody["email"] as? String, email)
XCTAssertEqual(requestBody["password"] as? String, password)
XCTAssertEqual(requestBody["returnSecureToken"] as? Bool, true)
}

func testFirebaseLoginRequestResponseDecoder() throws {
// Given
let loginResponseAsString = """
{
"kind": "identitytoolkit#VerifyPasswordResponse",
"localId": "1234567890",
"email": "[email protected]",
"displayName": "John Doe",
"idToken": "abcdefghijk",
"registered": true,
"refreshToken": "qrstuvwxyz",
"expiresIn": "3600"
}
"""
let loginRequest = FirebaseLoginRequest(email: "[email protected]", password: "secretpassword")

// When
let loginResponseData = try XCTUnwrap(loginResponseAsString.data(using: .utf8))
guard let loginResponse = try? loginRequest.responseDecoder(loginResponseData) else { return }
// Then
XCTAssertNotNil(loginResponse)
XCTAssertEqual(loginResponse.kind, "identitytoolkit#VerifyPasswordResponse")
XCTAssertEqual(loginResponse.localID, "1234567890")
XCTAssertEqual(loginResponse.email, "[email protected]")
XCTAssertEqual(loginResponse.displayName, "John Doe")
XCTAssertEqual(loginResponse.idToken, "abcdefghijk")
XCTAssertEqual(loginResponse.registered, true)
XCTAssertEqual(loginResponse.refreshToken, "qrstuvwxyz")
XCTAssertEqual(loginResponse.expiresIn, "3600")
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,24 +4,24 @@ import XCTest
final class MealCategoriesRequestTests: XCTestCase {

// MARK: Properties

private var sut: MealCategoriesRequest!

// MARK: - Lifecycle

override func setUp() {
sut = MealCategoriesRequest()
}

// MARK: - Tests

func testMealCategoriesRequestProperties() {
// Then
XCTAssertEqual(sut.baseUrl, Constants.theMealDB)
XCTAssertEqual(sut.path, "categories.php")
XCTAssertEqual(sut.method, "GET")
}

func testMealCategoriesResponseDecoder() throws {
// Given
let mealCategoriesResponseAsString = """
Expand All @@ -36,11 +36,11 @@ final class MealCategoriesRequestTests: XCTestCase {
]
}
"""

// When
let mealCategoriesResponseData = try XCTUnwrap(mealCategoriesResponseAsString.data(using: .utf8))
let mealCategoriesResponse = try? sut.responseDecoder(mealCategoriesResponseData)

// Then
XCTAssertNotNil(mealCategoriesResponse)
XCTAssertEqual(mealCategoriesResponse?.categories.count, 1)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import XCTest
final class RegisterRequestTests: XCTestCase {

// MARK: - Tests

func testRegisterRequestProperties() {
// Given
let email = "[email protected]"
Expand All @@ -16,7 +16,7 @@ final class RegisterRequestTests: XCTestCase {
XCTAssertEqual(registerRequest.path, "/accounts:signInWithPassword?key=\(Constants.firebaseKey)")
XCTAssertEqual(registerRequest.method, "POST")
}

func testRegisterRequestResponseDecoder() throws {
// Given
let registerResponseAsString = """
Expand Down