NotificationSettingsTests.swift 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. //
  2. // NotificationSettingsTests.swift
  3. // LoopKitTests
  4. //
  5. // Created by Darin Krauss on 9/17/20.
  6. // Copyright © 2020 LoopKit Authors. All rights reserved.
  7. //
  8. import XCTest
  9. import Foundation
  10. @testable import LoopKit
  11. class NotificationSettingsCodableTests: XCTestCase {
  12. func testCodable() throws {
  13. try assertNotificationSettingsCodable(NotificationSettings.test, encodesJSON: """
  14. {
  15. "alertSetting" : "disabled",
  16. "alertStyle" : "banner",
  17. "announcementSetting" : "enabled",
  18. "authorizationStatus" : "authorized",
  19. "badgeSetting" : "enabled",
  20. "carPlaySetting" : "notSupported",
  21. "criticalAlertSetting" : "enabled",
  22. "lockScreenSetting" : "disabled",
  23. "notificationCenterSetting" : "notSupported",
  24. "providesAppNotificationSettings" : true,
  25. "scheduledDeliverySetting" : "disabled",
  26. "showPreviewsSetting" : "whenAuthenticated",
  27. "soundSetting" : "enabled",
  28. "temporaryMuteAlertsSetting" : {
  29. "enabled" : {
  30. "_0" : 1800
  31. }
  32. },
  33. "timeSensitiveSetting" : "enabled"
  34. }
  35. """
  36. )
  37. }
  38. func testMigration() throws {
  39. let oldSettingsString = """
  40. {
  41. "alertSetting" : "disabled",
  42. "alertStyle" : "banner",
  43. "announcementSetting" : "enabled",
  44. "authorizationStatus" : "authorized",
  45. "badgeSetting" : "enabled",
  46. "carPlaySetting" : "notSupported",
  47. "criticalAlertSetting" : "enabled",
  48. "lockScreenSetting" : "disabled",
  49. "notificationCenterSetting" : "notSupported",
  50. "providesAppNotificationSettings" : true,
  51. "showPreviewsSetting" : "whenAuthenticated",
  52. "soundSetting" : "enabled"
  53. }
  54. """
  55. let _ = try decoder.decode(NotificationSettings.self, from: oldSettingsString.data(using: .utf8)!)
  56. }
  57. private func assertNotificationSettingsCodable(_ original: NotificationSettings, encodesJSON string: String) throws {
  58. let data = try encoder.encode(original)
  59. XCTAssertEqual(String(data: data, encoding: .utf8), string)
  60. let decoded = try decoder.decode(NotificationSettings.self, from: data)
  61. XCTAssertEqual(decoded, original)
  62. }
  63. private let encoder: JSONEncoder = {
  64. let encoder = JSONEncoder()
  65. encoder.outputFormatting = [.prettyPrinted, .sortedKeys, .withoutEscapingSlashes]
  66. encoder.dateEncodingStrategy = .iso8601
  67. return encoder
  68. }()
  69. private let decoder: JSONDecoder = {
  70. let decoder = JSONDecoder()
  71. decoder.dateDecodingStrategy = .iso8601
  72. return decoder
  73. }()
  74. }
  75. fileprivate extension NotificationSettings {
  76. static var test: NotificationSettings {
  77. return NotificationSettings(authorizationStatus: .authorized,
  78. soundSetting: .enabled,
  79. badgeSetting: .enabled,
  80. alertSetting: .disabled,
  81. notificationCenterSetting: .notSupported,
  82. lockScreenSetting: .disabled,
  83. carPlaySetting: .notSupported,
  84. alertStyle: .banner,
  85. showPreviewsSetting: .whenAuthenticated,
  86. criticalAlertSetting: .enabled,
  87. providesAppNotificationSettings: true,
  88. announcementSetting: .enabled,
  89. timeSensitiveSetting: .enabled,
  90. scheduledDeliverySetting: .disabled,
  91. temporaryMuteAlertsSetting: .enabled(.minutes(30)))
  92. }
  93. }