FileStorageTests.swift 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  1. import Foundation
  2. import Testing
  3. @testable import Trio
  4. @Suite("File Storage Tests") struct FileStorageTests {
  5. let storage = BaseFileStorage()
  6. struct DummyObject: JSON, Equatable {
  7. let id: String
  8. let value: Decimal
  9. }
  10. @Test("Can save and retrieve object") func testSaveAndRetrieve() {
  11. // Given
  12. let dummy = DummyObject(id: "123", value: 78.2)
  13. // When
  14. storage.save(dummy, as: "dummy")
  15. let retrieved = storage.retrieve("dummy", as: DummyObject.self)
  16. // Then
  17. #expect(retrieved == dummy)
  18. }
  19. @Test("Can save and retrieve async") func testAsyncSaveAndRetrieve() async {
  20. // Given
  21. let dummy = DummyObject(id: "123", value: 78.2)
  22. // When
  23. await storage.saveAsync(dummy, as: "dummy_async")
  24. let retrieved = await storage.retrieveAsync("dummy_async", as: DummyObject.self)
  25. // Then
  26. #expect(retrieved == dummy)
  27. }
  28. @Test("Can append single value") func testAppendSingleValue() {
  29. // Given
  30. let dummy1 = DummyObject(id: "1", value: 10.0)
  31. let dummy2 = DummyObject(id: "2", value: 20.0)
  32. // When
  33. storage.save([dummy1], as: "dummies")
  34. storage.append(dummy2, to: "dummies")
  35. // Then
  36. let retrieved = storage.retrieve("dummies", as: [DummyObject].self)
  37. #expect(retrieved?.count == 2)
  38. #expect(retrieved?.contains(dummy1) == true)
  39. #expect(retrieved?.contains(dummy2) == true)
  40. }
  41. @Test("Can append multiple values") func testAppendMultipleValues() {
  42. // Given
  43. let dummy1 = DummyObject(id: "1", value: 10.0)
  44. let newDummies = [
  45. DummyObject(id: "2", value: 20.0),
  46. DummyObject(id: "3", value: 30.0)
  47. ]
  48. // When
  49. storage.save([dummy1], as: "dummies_multiple")
  50. storage.append(newDummies, to: "dummies_multiple")
  51. // Then
  52. let retrieved = storage.retrieve("dummies_multiple", as: [DummyObject].self)
  53. #expect(retrieved?.count == 3)
  54. }
  55. @Test("Can append unique values by key path") func testAppendUniqueByKeyPath() {
  56. // Given
  57. let dummy1 = DummyObject(id: "1", value: 10.0)
  58. let dummy2 = DummyObject(id: "1", value: 20.0) // Same id
  59. // When
  60. storage.save([dummy1], as: "unique_dummies")
  61. storage.append(dummy2, to: "unique_dummies", uniqBy: \.id)
  62. // Then
  63. let retrieved = storage.retrieve("unique_dummies", as: [DummyObject].self)
  64. #expect(retrieved?.count == 1, "Should not append duplicate id")
  65. }
  66. @Test("Can remove file") func testRemoveFile() {
  67. // Given
  68. let dummy = DummyObject(id: "123", value: 78.2)
  69. storage.save(dummy, as: "to_delete")
  70. // When
  71. storage.remove("to_delete")
  72. // Then
  73. let retrieved = storage.retrieve("to_delete", as: DummyObject.self)
  74. #expect(retrieved == nil)
  75. }
  76. @Test("Can rename file") func testRenameFile() {
  77. // Given
  78. let dummy = DummyObject(id: "123", value: 78.2)
  79. storage.save(dummy, as: "old_name")
  80. // When
  81. storage.rename("old_name", to: "new_name")
  82. // Then
  83. let oldRetrieved = storage.retrieve("old_name", as: DummyObject.self)
  84. let newRetrieved = storage.retrieve("new_name", as: DummyObject.self)
  85. #expect(newRetrieved == dummy)
  86. }
  87. @Test("Can execute transaction") func testTransaction() {
  88. // Given
  89. let dummy = DummyObject(id: "123", value: 78.2)
  90. // When
  91. storage.transaction { storage in
  92. storage.save(dummy, as: "transaction_test")
  93. }
  94. // Then
  95. let retrieved = storage.retrieve("transaction_test", as: DummyObject.self)
  96. #expect(retrieved == dummy)
  97. }
  98. @Test("Can parse mmol/L settings to mg/dL") func testParseSettingsToMgdL() {
  99. // Given
  100. var preferences = Preferences()
  101. preferences.threshold_setting = 5.5 // mmol/L
  102. storage.save(preferences, as: OpenAPS.Settings.preferences)
  103. // When
  104. let wasParsed = storage.parseOnFileSettingsToMgdL()
  105. // Then
  106. #expect(wasParsed == true)
  107. let parsed = storage.retrieve(OpenAPS.Settings.preferences, as: Preferences.self)
  108. #expect(parsed?.threshold_setting == 100) // default mg/dL value
  109. }
  110. }