浏览代码

Fix Decimal encoding in URLEncodedFormEncoder. (#3185)

Jon Shier 5 年之前
父节点
当前提交
75fc9eafde
共有 2 个文件被更改,包括 29 次插入0 次删除
  1. 3 0
      Source/URLEncodedFormEncoder.swift
  2. 26 0
      Tests/ParameterEncoderTests.swift

+ 3 - 0
Source/URLEncodedFormEncoder.swift

@@ -778,6 +778,9 @@ extension _URLEncodedFormEncoder.SingleValueContainer: SingleValueEncodingContai
             }
 
             try encode(value, as: string)
+        case let decimal as Decimal:
+            // Decimal's `Encodable` implementation returns an object, not a single value, so override it.
+            try encode(value, as: String(describing: decimal))
         default:
             try attemptToEncode(value)
         }

+ 26 - 0
Tests/ParameterEncoderTests.swift

@@ -229,6 +229,32 @@ final class URLEncodedFormEncoderTests: BaseTestCase {
         XCTAssertEqual(result.success, "a=a")
     }
 
+    func testEncoderCanEncodeDecimal() {
+        // Given
+        let encoder = URLEncodedFormEncoder()
+        let decimal: Decimal = 1.0
+        let parameters = ["a": decimal]
+
+        // When
+        let result = Result<String, Error> { try encoder.encode(parameters) }
+
+        // Then
+        XCTAssertEqual(result.success, "a=1")
+    }
+
+    func testEncoderCanEncodeDecimalWithHighPrecision() {
+        // Given
+        let encoder = URLEncodedFormEncoder()
+        let decimal: Decimal = 1.123456
+        let parameters = ["a": decimal]
+
+        // When
+        let result = Result<String, Error> { try encoder.encode(parameters) }
+
+        // Then
+        XCTAssertEqual(result.success, "a=1.123456")
+    }
+
     func testEncoderCanEncodeDouble() {
         // Given
         let encoder = URLEncodedFormEncoder()