Skip to content

Commit

Permalink
Make Request locale aware
Browse files Browse the repository at this point in the history
  • Loading branch information
sukhrobkhakimov committed Sep 28, 2024
1 parent c1cb84e commit a3aec42
Show file tree
Hide file tree
Showing 2 changed files with 27 additions and 16 deletions.
13 changes: 12 additions & 1 deletion Sources/HTTP/Message/Request/Request.swift
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import AnyCodable
import Foundation
import NIO

public struct Request: Message {
Expand All @@ -15,6 +16,7 @@ public struct Request: Message {
setParametersAndFiles()
}
}
public var locale: Locale
public var attributes: [String: AnyEncodable] { mutableAttributes }
public var cookies: Set<Cookie> { mutableCookies }
public var files: [String: Body.File] { mutableFiles }
Expand All @@ -30,7 +32,8 @@ public struct Request: Message {
uri: URI = .default,
version: Version = .init(),
headers: Headers = .init(),
body: Body = .init()
body: Body = .init(),
locale: Locale? = nil
) {
self.eventLoop = eventLoop
self.method = method
Expand All @@ -39,6 +42,14 @@ public struct Request: Message {
self.headers = headers
self.body = body

if let locale {
self.locale = locale
} else if let identifier = headers.get(.acceptLanguage), !identifier.isEmpty {
self.locale = .init(identifier: identifier)
} else {
self.locale = .current
}

setContentLengthHeader()
setParametersAndFiles()
setCookies()
Expand Down
30 changes: 15 additions & 15 deletions Tests/HTTPTests/Message/RequestTests.swift
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ final class RequestTests: XCTestCase {
XCTAssertTrue(request.files.isEmpty)
XCTAssertTrue(request.parameters.isEmpty)
XCTAssertTrue(request.body.isEmpty)
XCTAssertEqual(request.locale, .current)
}

func testCustomInit() {
Expand All @@ -31,6 +32,7 @@ final class RequestTests: XCTestCase {
(.cookie, "sessionId=efgh; userId=2; username")
)
let body: Body = .init(string: "{\"title\": \"New post\"}")
let locale = Locale(identifier: "uz")

// Act
let request = Request(
Expand All @@ -39,7 +41,8 @@ final class RequestTests: XCTestCase {
uri: uri,
version: version,
headers: headers,
body: body
body: body,
locale: locale
)

// Assert
Expand All @@ -52,6 +55,7 @@ final class RequestTests: XCTestCase {
XCTAssertTrue(request.cookies.contains(where: { $0.name == "sessionId" && $0.value == "efgh" }))
XCTAssertTrue(request.cookies.contains(where: { $0.name == "userId" && $0.value == "2" }))
XCTAssertFalse(request.body.isEmpty)
XCTAssertEqual(request.locale, locale)
}

func testUpdate() {
Expand All @@ -64,6 +68,7 @@ final class RequestTests: XCTestCase {
.cookie: "sessionId=efgh; userId2=2; username2"
])
let body: Body = .init(string: "{\"title\": \"New post\"}")
let locale = Locale(identifier: "uz")
var request = Request(
eventLoop: eventLoop,
headers: .init([.cookie: "sessionId=abcd; userId1=1; username1"])
Expand All @@ -75,6 +80,7 @@ final class RequestTests: XCTestCase {
request.version = version
request.headers = headers
request.body = body
request.locale = locale

// Assert
XCTAssertEqual(request.method, method)
Expand All @@ -86,6 +92,7 @@ final class RequestTests: XCTestCase {
XCTAssertTrue(request.cookies.contains(where: { $0.name == "sessionId" && $0.value == "efgh" }))
XCTAssertTrue(request.cookies.contains(where: { $0.name == "userId2" && $0.value == "2" }))
XCTAssertFalse(request.body.isEmpty)
XCTAssertEqual(request.locale, locale)
}

func testMethods() {
Expand All @@ -94,20 +101,13 @@ final class RequestTests: XCTestCase {
let rawValue = method.rawValue

switch method {
case .DELETE:
XCTAssertEqual(rawValue, "DELETE")
case .GET:
XCTAssertEqual(rawValue, "GET")
case .HEAD:
XCTAssertEqual(rawValue, "HEAD")
case .OPTIONS:
XCTAssertEqual(rawValue, "OPTIONS")
case .PATCH:
XCTAssertEqual(rawValue, "PATCH")
case .POST:
XCTAssertEqual(rawValue, "POST")
case .PUT:
XCTAssertEqual(rawValue, "PUT")
case .DELETE: XCTAssertEqual(rawValue, "DELETE")
case .GET: XCTAssertEqual(rawValue, "GET")
case .HEAD: XCTAssertEqual(rawValue, "HEAD")
case .OPTIONS: XCTAssertEqual(rawValue, "OPTIONS")
case .PATCH: XCTAssertEqual(rawValue, "PATCH")
case .POST: XCTAssertEqual(rawValue, "POST")
case .PUT: XCTAssertEqual(rawValue, "PUT")
}
}
}
Expand Down

0 comments on commit a3aec42

Please sign in to comment.