This repository has been archived by the owner. It is now read-only.
Permalink
Cannot retrieve contributors at this time
executable file
115 lines (91 sloc)
4.64 KB
| /* This Source Code Form is subject to the terms of the Mozilla Public | |
| * License, v. 2.0. If a copy of the MPL was not distributed with this | |
| * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ | |
| import Foundation | |
| import Shared | |
| @testable import Storage | |
| import Deferred | |
| import XCTest | |
| class TestSQLiteMetadata: XCTestCase { | |
| let files = MockFiles() | |
| var db: BrowserDB! | |
| var metadata: SQLiteMetadata! | |
| override func setUp() { | |
| super.setUp() | |
| self.db = BrowserDB(filename: "foo.db", schema: BrowserSchema(), files: self.files) | |
| self.metadata = SQLiteMetadata(db: db) | |
| } | |
| override func tearDown() { | |
| removeAllMetadata(self.db).succeeded() | |
| super.tearDown() | |
| } | |
| func testInsertMetadata() { | |
| let site = "http://test.com" | |
| let page = PageMetadata(id: nil, siteURL: site, mediaURL: "http://image.com", | |
| title: "Test", description: "Test Description", type: nil, providerName: nil) | |
| self.metadata.storeMetadata(page, forPageURL: site.asURL!, expireAt: Date.now() + 3000).succeeded() | |
| let results = metadataFromDB(self.db).value.successValue! | |
| XCTAssertEqual(results.count, 1) | |
| let metadata = results[0]! | |
| XCTAssertEqual(metadata.siteURL, site) | |
| } | |
| func testDuplicateCacheKeyInsert() { | |
| let siteA = "http://test.com/site/A" | |
| let siteB = "http://test.com/site/B" | |
| let metadataA1 = PageMetadata(id: nil, siteURL: siteA, mediaURL: nil, | |
| title: "First Visit", description: "", type: nil, providerName: nil) | |
| let metadataB = PageMetadata(id: nil, siteURL: siteB, mediaURL: "http://image.com", | |
| title: "Test", description: "Test Description", type: nil, providerName: nil) | |
| let metadataA2 = PageMetadata(id: nil, siteURL: siteA, mediaURL: "http://image.com", | |
| title: "Second Visit", description: "A new description", type: nil, providerName: nil) | |
| self.metadata.storeMetadata(metadataA1, forPageURL: siteA.asURL!, expireAt: Date.now() + 3000).succeeded() | |
| let initialResults = metadataFromDB(self.db).value.successValue! | |
| XCTAssertEqual(initialResults.count, 1) | |
| let initialA = initialResults[0]! | |
| XCTAssertEqual(initialA.siteURL, siteA) | |
| XCTAssertEqual(initialA.title, "First Visit") | |
| XCTAssertEqual(initialA.description, "") | |
| XCTAssertNil(initialA.mediaURL) | |
| self.metadata.storeMetadata(metadataB, forPageURL: siteB.asURL!, expireAt: Date.now() + 3000).succeeded() | |
| self.metadata.storeMetadata(metadataA2, forPageURL: siteA.asURL!, expireAt: Date.now() + 3000).succeeded() | |
| let results = metadataFromDB(self.db).value.successValue! | |
| // Should only have 2 since we upsert | |
| XCTAssertEqual(results.count, 2) | |
| let resultA = results[1]! | |
| let resultB = results[0]! | |
| XCTAssertEqual(resultA.siteURL, siteA) | |
| XCTAssertEqual(resultB.siteURL, siteB) | |
| XCTAssertEqual(resultA.title, "Second Visit") | |
| XCTAssertEqual(resultA.description, "A new description") | |
| XCTAssertEqual(resultA.mediaURL!, "http://image.com") | |
| } | |
| func testExpirationPurging() { | |
| let baseTime = Date.now() | |
| let siteA = "http://test.com/site/A" | |
| let metadataA = PageMetadata(id: nil, siteURL: siteA, mediaURL: nil, | |
| title: "Test", description: "Test Description", type: nil, providerName: nil) | |
| // Set expiration to base | |
| self.metadata.storeMetadata(metadataA, forPageURL: siteA.asURL!, expireAt: baseTime - 1000).succeeded() | |
| self.metadata.deleteExpiredMetadata().succeeded() | |
| let results = metadataFromDB(self.db).value.successValue! | |
| XCTAssertEqual(results.count, 0) | |
| } | |
| } | |
| private func metadataFromDB(_ db: BrowserDB) -> Deferred<Maybe<Cursor<PageMetadata>>> { | |
| let sql = "SELECT * FROM \(TablePageMetadata)" | |
| return db.runQuery(sql, args: nil, factory: pageMetadataFactory) | |
| } | |
| private func removeAllMetadata(_ db: BrowserDB) -> Success { | |
| return db.run("DELETE FROM \(TablePageMetadata)") | |
| } | |
| private func pageMetadataFactory(_ row: SDRow) -> PageMetadata { | |
| let id = row["id"] as! Int | |
| let siteURL = row["site_url"] as! String | |
| let mediaURL = row["media_url"] as? String | |
| let title = row["title"] as? String | |
| let description = row["description"] as? String | |
| let type = row["type"] as? String | |
| let providerName = row["provider_name"] as? String | |
| return PageMetadata(id: id, siteURL: siteURL, mediaURL: mediaURL, title: title, | |
| description: description, type: type, providerName: providerName) | |
| } |