@@ -263,14 +263,130 @@ extension FetchableRecordDecodableTests {
263263
264264extension FetchableRecordDecodableTests {
265265
266+ func testStructWithData( ) throws {
267+ struct StructWithData : FetchableRecord , Decodable {
268+ let data : Data
269+ }
270+
271+ let dbQueue = try makeDatabaseQueue ( )
272+
273+ do {
274+ let data = " foo " . data ( using: . utf8)
275+
276+ do {
277+ let value = try StructWithData ( row: [ " data " : data] )
278+ XCTAssertEqual ( value. data, data)
279+ }
280+
281+ do {
282+ let value = try dbQueue. read {
283+ try StructWithData . fetchOne ( $0, sql: " SELECT ? AS data " , arguments: [ data] ) !
284+ }
285+ XCTAssertEqual ( value. data, data)
286+ }
287+ }
288+ do {
289+ do {
290+ _ = try StructWithData ( row: [ " data " : nil ] )
291+ XCTFail ( " Expected Error " )
292+ } catch let error as RowDecodingError {
293+ switch error {
294+ case . valueMismatch:
295+ XCTAssertEqual ( error. description, """
296+ could not decode Data from database value NULL - \
297+ column: " data " , \
298+ column index: 0, \
299+ row: [data:NULL]
300+ """ )
301+ default :
302+ XCTFail ( " Unexpected Error " )
303+ }
304+ }
305+
306+ do {
307+ try dbQueue. read {
308+ _ = try StructWithData . fetchOne ( $0, sql: " SELECT NULL AS data " )
309+ }
310+ XCTFail ( " Expected Error " )
311+ } catch let error as RowDecodingError {
312+ switch error {
313+ case . valueMismatch:
314+ XCTAssertEqual ( error. description, """
315+ could not decode Data from database value NULL - \
316+ column: " data " , \
317+ column index: 0, \
318+ row: [data:NULL], \
319+ sql: `SELECT NULL AS data`, \
320+ arguments: []
321+ """ )
322+ default :
323+ XCTFail ( " Unexpected Error " )
324+ }
325+ }
326+ }
327+ }
328+
266329 func testStructWithDate( ) throws {
267330 struct StructWithDate : FetchableRecord , Decodable {
268331 let date : Date
269332 }
270333
271- let date = Date ( )
272- let value = try StructWithDate ( row: [ " date " : date] )
273- XCTAssert ( abs ( value. date. timeIntervalSince ( date) ) < 0.001 )
334+ let dbQueue = try makeDatabaseQueue ( )
335+
336+ do {
337+ let date = Date ( )
338+
339+ do {
340+ let value = try StructWithDate ( row: [ " date " : date] )
341+ XCTAssert ( abs ( value. date. timeIntervalSince ( date) ) < 0.001 )
342+ }
343+
344+ do {
345+ let value = try dbQueue. read {
346+ try StructWithDate . fetchOne ( $0, sql: " SELECT ? AS date " , arguments: [ date] ) !
347+ }
348+ XCTAssert ( abs ( value. date. timeIntervalSince ( date) ) < 0.001 )
349+ }
350+ }
351+ do {
352+ do {
353+ _ = try StructWithDate ( row: [ " date " : nil ] )
354+ XCTFail ( " Expected Error " )
355+ } catch let error as RowDecodingError {
356+ switch error {
357+ case . valueMismatch:
358+ XCTAssertEqual ( error. description, """
359+ could not decode Date from database value NULL - \
360+ column: " date " , \
361+ column index: 0, \
362+ row: [date:NULL]
363+ """ )
364+ default :
365+ XCTFail ( " Unexpected Error " )
366+ }
367+ }
368+
369+ do {
370+ try dbQueue. read {
371+ _ = try StructWithDate . fetchOne ( $0, sql: " SELECT NULL AS date " )
372+ }
373+ XCTFail ( " Expected Error " )
374+ } catch let error as RowDecodingError {
375+ switch error {
376+ case . valueMismatch:
377+ XCTAssertEqual ( error. description, """
378+ could not decode Date from database value NULL - \
379+ column: " date " , \
380+ column index: 0, \
381+ row: [date:NULL], \
382+ sql: `SELECT NULL AS date`, \
383+ arguments: []
384+ """ )
385+ default :
386+ XCTFail ( " Unexpected Error " )
387+ }
388+ }
389+ }
274390 }
275391
276392 func testStructWithURL( ) throws {
0 commit comments