mirror of
https://github.com/element-hq/element-x-ios.git
synced 2025-03-11 13:59:13 +00:00

* Setup simple share extension * Switch the app url scheme to be the full bundle identifier * Setup a share extension that show a SwiftUI view, uses rust tracing and redirects to the hosting aplication * Move media as json through the custom scheme into the main app and deep link into the media upload preview screen * Fix message forwarding and global search screen room summary provider filtering. * Tweak the message forwarding and global search screen designs. * Add a room selection screen to use after receiving a share request from the share extension * Fix share extension entitlements * Share the temporary directory between the main app and the extensions; rename the caches one. * Remove the no longer needed notification avatar flipping fix. * Extract the placeholder avatar image generator from the NSE * Nest `AvatarSize` within the new `Avatars` enum * Donate an `INSendMessageIntent` to the system every time we send a message so they appear as share suggestions * Support suggestions in the share extension itself * Improve sharing animations and fix presentation when room already on the stack * Clear all routes when sharing without a preselected room. * Fix broken unit tests * Various initial tweaks following code review. * Correctly clean up and dismiss the share extension for all paths. * Move the share extension path to a constants enum * Rename UserSessionFlowCoordinator specific share extension states and events * Add UserSession and Room flow coordinator share route tests * Tweak the share extension logic.
137 lines
8.6 KiB
Swift
137 lines
8.6 KiB
Swift
//
|
|
// Copyright 2024 New Vector Ltd.
|
|
//
|
|
// SPDX-License-Identifier: AGPL-3.0-only
|
|
// Please see LICENSE in the repository root for full details.
|
|
//
|
|
|
|
import XCTest
|
|
|
|
@testable import ElementX
|
|
import MatrixRustSDK
|
|
|
|
class RestorationTokenTests: XCTestCase {
|
|
func testDecodeFromTokenV1() throws {
|
|
// Given an encoded restoration token in the original format that only contains a Session from the SDK.
|
|
let originalToken = RestorationTokenV1(session: Session(accessToken: "1234",
|
|
refreshToken: nil,
|
|
userId: "@user:example.com",
|
|
deviceId: "D3V1C3",
|
|
homeserverUrl: "https://matrix.example.com",
|
|
oidcData: nil,
|
|
slidingSyncVersion: .proxy(url: "https://sync.example.com")))
|
|
let data = try JSONEncoder().encode(originalToken)
|
|
|
|
// When decoding the data to the current restoration token format.
|
|
let decodedToken = try JSONDecoder().decode(RestorationToken.self, from: data)
|
|
|
|
// Then the output should be a valid token with the expected store directories.
|
|
XCTAssertEqual(decodedToken.session, originalToken.session, "The session should not be changed.")
|
|
XCTAssertNil(decodedToken.passphrase, "There should not be a passphrase.")
|
|
XCTAssertNil(decodedToken.pusherNotificationClientIdentifier, "There should not be a push notification client ID.")
|
|
XCTAssertEqual(decodedToken.sessionDirectories.dataDirectory, .sessionsBaseDirectory.appending(component: "@user_example.com"),
|
|
"The session directory should match the original location set by the Rust SDK from our base directory.")
|
|
XCTAssertEqual(decodedToken.sessionDirectories.cacheDirectory, .sessionCachesBaseDirectory.appending(component: "@user_example.com"),
|
|
"The cache directory should be derived from the session directory but in the caches directory.")
|
|
}
|
|
|
|
func testDecodeFromTokenV4() throws {
|
|
// Given an encoded restoration token in the 4th format that contains a stored session directory.
|
|
let sessionDirectoryName = UUID().uuidString
|
|
let originalToken = RestorationTokenV4(session: Session(accessToken: "1234",
|
|
refreshToken: "5678",
|
|
userId: "@user:example.com",
|
|
deviceId: "D3V1C3",
|
|
homeserverUrl: "https://matrix.example.com",
|
|
oidcData: "data-from-mas",
|
|
slidingSyncVersion: .proxy(url: "https://sync.example.com")),
|
|
sessionDirectory: .sessionsBaseDirectory.appending(component: sessionDirectoryName),
|
|
passphrase: "passphrase",
|
|
pusherNotificationClientIdentifier: "pusher-identifier")
|
|
let data = try JSONEncoder().encode(originalToken)
|
|
|
|
// When decoding the data to the current restoration token format.
|
|
let decodedToken = try JSONDecoder().decode(RestorationToken.self, from: data)
|
|
|
|
// Then the output should be a valid token with the expected store directories.
|
|
XCTAssertEqual(decodedToken.session, originalToken.session, "The session should not be changed.")
|
|
XCTAssertEqual(decodedToken.passphrase, originalToken.passphrase, "The passphrase should not be changed.")
|
|
XCTAssertEqual(decodedToken.pusherNotificationClientIdentifier, originalToken.pusherNotificationClientIdentifier,
|
|
"The push notification client identifier should not be changed.")
|
|
XCTAssertEqual(decodedToken.sessionDirectories.dataDirectory, originalToken.sessionDirectory,
|
|
"The session directory should not be changed.")
|
|
XCTAssertEqual(decodedToken.sessionDirectories.cacheDirectory, .sessionCachesBaseDirectory.appending(component: sessionDirectoryName),
|
|
"The cache directory should be derived from the session directory but in the caches directory.")
|
|
}
|
|
|
|
func testDecodeFromTokenV5() throws {
|
|
// Given an encoded restoration token in the 5th format that contains separate directories for session data and caches.
|
|
let sessionDirectoryName = UUID().uuidString
|
|
let originalToken = RestorationTokenV5(session: Session(accessToken: "1234",
|
|
refreshToken: "5678",
|
|
userId: "@user:example.com",
|
|
deviceId: "D3V1C3",
|
|
homeserverUrl: "https://matrix.example.com",
|
|
oidcData: "data-from-mas",
|
|
slidingSyncVersion: .native),
|
|
sessionDirectory: .sessionsBaseDirectory.appending(component: sessionDirectoryName),
|
|
cacheDirectory: .sessionCachesBaseDirectory.appending(component: sessionDirectoryName),
|
|
passphrase: "passphrase",
|
|
pusherNotificationClientIdentifier: "pusher-identifier")
|
|
let data = try JSONEncoder().encode(originalToken)
|
|
|
|
// When decoding the data.
|
|
let decodedToken = try JSONDecoder().decode(RestorationToken.self, from: data)
|
|
|
|
// Then the output should be a valid token.
|
|
XCTAssertEqual(decodedToken.session, originalToken.session, "The session should not be changed.")
|
|
XCTAssertEqual(decodedToken.passphrase, originalToken.passphrase, "The passphrase should not be changed.")
|
|
XCTAssertEqual(decodedToken.pusherNotificationClientIdentifier, originalToken.pusherNotificationClientIdentifier,
|
|
"The push notification client identifier should not be changed.")
|
|
XCTAssertEqual(decodedToken.sessionDirectories.dataDirectory, originalToken.sessionDirectory,
|
|
"The session directory should not be changed.")
|
|
XCTAssertEqual(decodedToken.sessionDirectories.cacheDirectory, originalToken.cacheDirectory,
|
|
"The cache directory should not be changed.")
|
|
}
|
|
|
|
func testDecodeFromCurrentToken() throws {
|
|
// Given an encoded restoration token in the current format.
|
|
let originalToken = RestorationToken(session: Session(accessToken: "1234",
|
|
refreshToken: "5678",
|
|
userId: "@user:example.com",
|
|
deviceId: "D3V1C3",
|
|
homeserverUrl: "https://matrix.example.com",
|
|
oidcData: "data-from-mas",
|
|
slidingSyncVersion: .native),
|
|
sessionDirectories: .init(),
|
|
passphrase: "passphrase",
|
|
pusherNotificationClientIdentifier: "pusher-identifier")
|
|
let data = try JSONEncoder().encode(originalToken)
|
|
|
|
// When decoding the data.
|
|
let decodedToken = try JSONDecoder().decode(RestorationToken.self, from: data)
|
|
|
|
// Then the output should be a valid token.
|
|
XCTAssertEqual(decodedToken, originalToken, "The token should remain identical.")
|
|
}
|
|
}
|
|
|
|
struct RestorationTokenV1: Equatable, Codable {
|
|
let session: MatrixRustSDK.Session
|
|
}
|
|
|
|
struct RestorationTokenV4: Equatable, Codable {
|
|
let session: MatrixRustSDK.Session
|
|
let sessionDirectory: URL
|
|
let passphrase: String?
|
|
let pusherNotificationClientIdentifier: String?
|
|
}
|
|
|
|
struct RestorationTokenV5: Equatable, Codable {
|
|
let session: MatrixRustSDK.Session
|
|
let sessionDirectory: URL
|
|
let cacheDirectory: URL
|
|
let passphrase: String?
|
|
let pusherNotificationClientIdentifier: String?
|
|
}
|