crossmate

A collaborative crossword app for iOS
Log | Files | Refs | LICENSE

ShareLinkRouteTests.swift (2454B)


      1 import Foundation
      2 import Testing
      3 
      4 @testable import Crossmate
      5 
      6 @Suite("Share link route")
      7 struct ShareLinkRouteTests {
      8 
      9     private let token = "0a1BcDeFgHiJkLmNoPqRsTuVw"
     10     private func url(_ path: String) -> URL {
     11         URL(string: "https://crossmate.example.net\(path)")!
     12     }
     13 
     14     @Test("parses token and silhouette from a full link")
     15     func parsesTokenAndShape() {
     16         let route = ShareLinkRoute(shortLink: url("/s/\(token)/1/s3CA"))
     17         #expect(route?.token == token)
     18         #expect(route?.shape?.width == 3)
     19         #expect(route?.shape?.height == 3)
     20         #expect(route?.shape?.blocks[4] == true)
     21     }
     22 
     23     @Test("parses a rectangular silhouette segment")
     24     func parsesRectangularShape() {
     25         let route = ShareLinkRoute(shortLink: url("/s/\(token)/S23AA"))
     26         #expect(route?.token == token)
     27         #expect(route?.shape?.width == 2)
     28         #expect(route?.shape?.height == 3)
     29     }
     30 
     31     @Test("parses a shape-only link (no title segment)")
     32     func parsesShapeOnly() {
     33         let route = ShareLinkRoute(shortLink: url("/s/\(token)/s3CA"))
     34         #expect(route?.token == token)
     35         #expect(route?.shape?.width == 3)
     36     }
     37 
     38     @Test("a title-only link yields no shape")
     39     func titleOnlyHasNoShape() {
     40         let route = ShareLinkRoute(shortLink: url("/s/\(token)/1"))
     41         #expect(route?.token == token)
     42         #expect(route?.shape == nil)
     43     }
     44 
     45     @Test("a bare link yields token and no shape")
     46     func bareLink() {
     47         let route = ShareLinkRoute(shortLink: url("/s/\(token)"))
     48         #expect(route?.token == token)
     49         #expect(route?.shape == nil)
     50     }
     51 
     52     @Test("reconstructs the iCloud share URL")
     53     func reconstructsICloudURL() {
     54         let route = ShareLinkRoute(shortLink: url("/s/\(token)"))
     55         #expect(route?.iCloudShareURL.absoluteString == "https://www.icloud.com/share/\(token)")
     56     }
     57 
     58     @Test("rejects non-share and malformed links")
     59     func rejectsBadLinks() {
     60         #expect(ShareLinkRoute(shortLink: url("/s/short")) == nil)          // token too short
     61         #expect(ShareLinkRoute(shortLink: url("/notshare/\(token)")) == nil) // wrong prefix
     62         #expect(ShareLinkRoute(shortLink: url("/s")) == nil)                 // no token
     63         #expect(ShareLinkRoute(shortLink: url("/s/\(token)/a/b/c")) == nil)  // too many segments
     64         #expect(ShareLinkRoute(shortLink: URL(string: "http://crossmate.example.net/s/\(token)")!) == nil) // not https
     65     }
     66 }