FileStorageTests.swift 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143
  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(oldRetrieved == nil)
  86. #expect(newRetrieved == dummy)
  87. }
  88. @Test("Can execute transaction") func testTransaction() {
  89. // Given
  90. let dummy = DummyObject(id: "123", value: 78.2)
  91. // When
  92. storage.transaction { storage in
  93. storage.save(dummy, as: "transaction_test")
  94. }
  95. // Then
  96. let retrieved = storage.retrieve("transaction_test", as: DummyObject.self)
  97. #expect(retrieved == dummy)
  98. }
  99. @Test("Can parse mmol/L settings to mg/dL") func testParseSettingsToMgdL() {
  100. // Given
  101. var preferences = Preferences()
  102. preferences.threshold_setting = 5.5 // mmol/L
  103. storage.save(preferences, as: OpenAPS.Settings.preferences)
  104. // When
  105. let wasParsed = storage.parseOnFileSettingsToMgdL()
  106. // Then
  107. #expect(wasParsed == true)
  108. let parsed = storage.retrieve(OpenAPS.Settings.preferences, as: Preferences.self)
  109. #expect(parsed?.threshold_setting == 100) // default mg/dL value
  110. }
  111. }