129 lines
5.0 KiB
Swift
129 lines
5.0 KiB
Swift
//
|
|
// Copyright Amazon.com Inc. or its affiliates.
|
|
// All Rights Reserved.
|
|
//
|
|
// SPDX-License-Identifier: Apache-2.0
|
|
//
|
|
|
|
import XCTest
|
|
import SQLite
|
|
@testable import Amplify
|
|
@testable import AWSPinpointAnalyticsPlugin
|
|
|
|
class SQLiteLocalStorageAdapterTests: XCTestCase {
|
|
private let databaseName = "TestDatabase"
|
|
private var adapter: SQLiteLocalStorageAdapter!
|
|
private var fileManager: MockFileManager!
|
|
|
|
override func setUp() {
|
|
fileManager = MockFileManager(fileName: databaseName)
|
|
do {
|
|
adapter = try SQLiteLocalStorageAdapter(databaseName: databaseName, fileManager: fileManager)
|
|
let analyticsEventStorage = AnalyticsEventSQLStorage(dbAdapter: adapter)
|
|
try analyticsEventStorage.initializeStorage()
|
|
} catch {
|
|
XCTFail("Failed to setup SQLiteLocalStorageAdapterTests")
|
|
}
|
|
}
|
|
|
|
override func tearDown() {
|
|
fileManager = nil
|
|
adapter = nil
|
|
}
|
|
|
|
/// - Given: An adapter to the SQLite local database
|
|
/// - When: An insert statement is executed
|
|
/// - Then: A new Event record is added to the database Event table
|
|
func testLocalStorageInsert() {
|
|
do {
|
|
let countStatement = "SELECT COUNT(*) FROM Event"
|
|
var result = try adapter.executeQuery(countStatement, []).scalar() as! Int64
|
|
XCTAssertEqual(result, 0)
|
|
|
|
let insertStatement = """
|
|
INSERT INTO Event (
|
|
id, attributes, eventType, metrics,
|
|
eventTimestamp, sessionId, sessionStartTime,
|
|
sessionStopTime, timestamp, dirty, retryCount)
|
|
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
"""
|
|
let bindings: [Binding] = [1, "", "", "", 100000, 2, 1000000, 1000000, 100000, 1, 0]
|
|
_ = try adapter.executeQuery(insertStatement, bindings)
|
|
result = try adapter.executeQuery(countStatement, []).scalar() as! Int64
|
|
XCTAssertEqual(result, 1)
|
|
} catch {
|
|
XCTFail("Failed to create SQLiteLocalStorageAdapter: \(error)")
|
|
}
|
|
}
|
|
|
|
/// - Given: An adapter to the SQLite local database with an one Event record in the table
|
|
/// - When: An delete statement is executed
|
|
/// - Then: The Event table is empty with 0 records
|
|
func testLocalStorageDelete() {
|
|
do {
|
|
let insertStatement = """
|
|
INSERT INTO Event (
|
|
id, attributes, eventType, metrics,
|
|
eventTimestamp, sessionId, sessionStartTime,
|
|
sessionStopTime, timestamp, dirty, retryCount)
|
|
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
"""
|
|
let bindings: [Binding] = [1, "", "", "", 100000, 2, 1000000, 1000000, 100000, 1, 0]
|
|
_ = try adapter.executeQuery(insertStatement, bindings)
|
|
|
|
let countStatement = "SELECT COUNT(*) FROM Event"
|
|
var result = try adapter.executeQuery(countStatement, []).scalar() as! Int64
|
|
XCTAssertTrue(result == 1)
|
|
|
|
let deleteStatement = "DELETE FROM Event"
|
|
_ = try adapter.executeQuery(deleteStatement, [])
|
|
result = try adapter.executeQuery(countStatement, []).scalar() as! Int64
|
|
XCTAssertEqual(result, 0)
|
|
|
|
} catch {
|
|
XCTFail("Failed to create SQLiteLocalStorageAdapter: \(error)")
|
|
}
|
|
}
|
|
|
|
/// - Given: An adapter to the SQLite local database with an one Event record that is not dirty
|
|
/// - When: An update statement is executed to update the record as dirty
|
|
/// - Then: The existing event record is updated as dirty
|
|
func testLocalStorageUpdate() {
|
|
do {
|
|
let insertStatement = """
|
|
INSERT INTO Event (
|
|
id, attributes, eventType, metrics,
|
|
eventTimestamp, sessionId, sessionStartTime,
|
|
sessionStopTime, timestamp, dirty, retryCount)
|
|
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
"""
|
|
let bindings: [Binding] = [123, "", "", "", 100000, 2, 1000000, 1000000, 100000, 0, 0]
|
|
_ = try adapter.executeQuery(insertStatement, bindings)
|
|
|
|
let countStatement = "SELECT COUNT(*) FROM Event WHERE dirty = false"
|
|
var result = try adapter.executeQuery(countStatement, []).scalar() as! Int64
|
|
XCTAssertEqual(result, 1)
|
|
|
|
let updateStatement = """
|
|
UPDATE Event
|
|
SET dirty = ?
|
|
WHERE id = ?
|
|
"""
|
|
_ = try adapter.executeQuery(updateStatement, [true, 123])
|
|
result = try adapter.executeQuery(countStatement, []).scalar() as! Int64
|
|
XCTAssertEqual(result, 0)
|
|
|
|
} catch {
|
|
XCTFail("Failed to create SQLiteLocalStorageAdapter: \(error)")
|
|
}
|
|
}
|
|
|
|
/// - Given: An adapter to the SQLite local database with one record
|
|
/// - When: Calling disk file size
|
|
/// - Then: returns the database file size
|
|
func testLocalStorageDiskUsage() {
|
|
XCTAssertEqual(adapter.diskBytesUsed, fileManager.mockedFileSize)
|
|
XCTAssertEqual(fileManager.fileSizeCount, 1)
|
|
}
|
|
}
|