diff --git a/Account/Tests/AccountTests/Feedly/ParsedItemsKeyedByFeedURLTests.swift b/Account/Tests/AccountTests/Feedly/ParsedItemsKeyedByFeedURLTests.swift deleted file mode 100644 index dd0a94378..000000000 --- a/Account/Tests/AccountTests/Feedly/ParsedItemsKeyedByFeedURLTests.swift +++ /dev/null @@ -1,98 +0,0 @@ -// -// ParsedItemsKeyedByFeedURLTests.swift -// AccountTests -// -// Created by Kiel Gillard on 24/10/19. -// Copyright © 2019 Ranchero Software, LLC. All rights reserved. -// - -import XCTest -@testable import Account -import Parser - -final class ParsedItemsKeyedByFeedURLTests: XCTestCase { - - private var account: Account! - private let support = FeedlyTestSupport() - - override func setUp() { - super.setUp() - account = support.makeTestAccount() - } - - override func tearDown() { - if let account = account { - support.destroy(account) - } - super.tearDown() - } - - struct TestParsedItemsProvider: FeedlyParsedItemProviding { - let parsedItemProviderName = "TestParsedItemsProvider" - var resource: FeedlyResourceID - var parsedEntries: Set - } - - func testNoEntries() { - let entries = support.makeParsedItemTestDataFor(numberOfFeeds: 0, numberOfItemsInFeeds: 0) - let resource = FeedlyCategoryResourceID(id: "user/12345/category/6789") - let parsedEntries = Set(entries.values.flatMap { $0 }) - let provider = TestParsedItemsProvider(resource: resource, parsedEntries: parsedEntries) - - let organise = FeedlyOrganiseParsedItemsByFeedOperation(account: account, parsedItemProvider: provider, log: support.log) - - let completionExpectation = expectation(description: "Did Finish") - organise.completionBlock = { _ in - completionExpectation.fulfill() - } - - MainThreadOperationQueue.shared.add(organise) - - waitForExpectations(timeout: 2) - - let itemsAndFeedIDs = organise.parsedItemsKeyedByFeedID - XCTAssertEqual(itemsAndFeedIDs, entries) - } - - func testGroupsOneEntryByFeedId() { - let entries = support.makeParsedItemTestDataFor(numberOfFeeds: 1, numberOfItemsInFeeds: 1) - let resource = FeedlyCategoryResourceID(id: "user/12345/category/6789") - let parsedEntries = Set(entries.values.flatMap { $0 }) - let provider = TestParsedItemsProvider(resource: resource, parsedEntries: parsedEntries) - - let organise = FeedlyOrganiseParsedItemsByFeedOperation(account: account, parsedItemProvider: provider, log: support.log) - - let completionExpectation = expectation(description: "Did Finish") - organise.completionBlock = { _ in - completionExpectation.fulfill() - } - - MainThreadOperationQueue.shared.add(organise) - - waitForExpectations(timeout: 2) - - let itemsAndFeedIDs = organise.parsedItemsKeyedByFeedID - XCTAssertEqual(itemsAndFeedIDs, entries) - } - - func testGroupsManyEntriesByFeedId() { - let entries = support.makeParsedItemTestDataFor(numberOfFeeds: 100, numberOfItemsInFeeds: 100) - let resource = FeedlyCategoryResourceID(id: "user/12345/category/6789") - let parsedEntries = Set(entries.values.flatMap { $0 }) - let provider = TestParsedItemsProvider(resource: resource, parsedEntries: parsedEntries) - - let organise = FeedlyOrganiseParsedItemsByFeedOperation(account: account, parsedItemProvider: provider, log: support.log) - - let completionExpectation = expectation(description: "Did Finish") - organise.completionBlock = { _ in - completionExpectation.fulfill() - } - - MainThreadOperationQueue.shared.add(organise) - - waitForExpectations(timeout: 2) - - let itemsAndFeedIDs = organise.parsedItemsKeyedByFeedID - XCTAssertEqual(itemsAndFeedIDs, entries) - } -} diff --git a/Feedly/Sources/Feedly/FeedlyUtilities.swift b/Feedly/Sources/Feedly/FeedlyUtilities.swift new file mode 100644 index 000000000..b9cd44ae5 --- /dev/null +++ b/Feedly/Sources/Feedly/FeedlyUtilities.swift @@ -0,0 +1,34 @@ +// +// FeedlyUtilities.swift +// +// +// Created by Brent Simmons on 5/17/24. +// + +import Foundation +import Parser + +final class FeedlyUtilities { + + static func parsedItemsKeyedByFeedURL(_ parsedItems: Set) -> [String: Set] { + + var d = [String: Set]() + + for parsedItem in parsedItems { + let key = parsedItem.feedURL + + let value: Set = { + if var items = d[key] { + items.insert(parsedItem) + return items + } else { + return [parsedItem] + } + }() + + d[key] = value + } + + return d + } +} diff --git a/Feedly/Tests/FeedlyTests/FeedlyUtilitiesTests.swift b/Feedly/Tests/FeedlyTests/FeedlyUtilitiesTests.swift new file mode 100644 index 000000000..2ac514617 --- /dev/null +++ b/Feedly/Tests/FeedlyTests/FeedlyUtilitiesTests.swift @@ -0,0 +1,87 @@ +// +// FeedlyUtilitiesTests.swift +// AccountTests +// +// Created by Kiel Gillard on 24/10/19. +// Copyright © 2019 Ranchero Software, LLC. All rights reserved. +// + +import XCTest +import Parser +@testable import Feedly + +final class FeedlyUtilitiesTests: XCTestCase { + + // MARK: - Test parsedItemsKeyedByFeedURL + + func testParsedItemsKeyedByFeedURL_Empty() { + + let testDictionary = makeParsedItemTestDataFor(numberOfFeeds: 0, numberOfItemsInFeeds: 0) + let parsedItems = parsedItemsFromDictionary(testDictionary) + + let resultDictionary = FeedlyUtilities.parsedItemsKeyedByFeedURL(parsedItems) + let expectedDictionary = testDictionary + XCTAssertEqual(resultDictionary, expectedDictionary) + } + + func testParsedItemsKeyedByFeedURL_OneFeedOneItem() { + + let testDictionary = makeParsedItemTestDataFor(numberOfFeeds: 1, numberOfItemsInFeeds: 1) + let parsedItems = parsedItemsFromDictionary(testDictionary) + + let resultDictionary = FeedlyUtilities.parsedItemsKeyedByFeedURL(parsedItems) + let expectedDictionary = testDictionary + XCTAssertEqual(resultDictionary, expectedDictionary) + } + + func testParsedItemsKeyedByFeedURL_ManyFeedsManyItems() { + + let testDictionary = makeParsedItemTestDataFor(numberOfFeeds: 100, numberOfItemsInFeeds: 100) + let parsedItems = parsedItemsFromDictionary(testDictionary) + + let resultDictionary = FeedlyUtilities.parsedItemsKeyedByFeedURL(parsedItems) + let expectedDictionary = testDictionary + XCTAssertEqual(resultDictionary, expectedDictionary) + } +} + +// MARK: - Private + +private extension FeedlyUtilitiesTests { + + func makeParsedItemTestDataFor(numberOfFeeds: Int, numberOfItemsInFeeds: Int) -> [String: Set] { + + var d = [String: Set]() + + for feedIndex in 0..() + + for parsedItemIndex in 0.. ParsedItem { + + ParsedItem(syncServiceID: "\(feedID)/articles/\(index)", uniqueID: UUID().uuidString, feedURL: feedID, url: "http://localhost/", externalURL: "http://localhost/\(feedID)/articles/\(index).html", title: "Title\(index)", language: nil, contentHTML: "Content \(index) HTML.", contentText: "Content \(index) Text", summary: nil, imageURL: nil, bannerImageURL: nil, datePublished: nil, dateModified: nil, authors: nil, tags: nil, attachments: nil) + } + + func parsedItemsFromDictionary(_ d: [String: Set]) -> Set { + + var parsedItems = Set() + + for (key, value) in d { + parsedItems.formUnion(value) + } + + return parsedItems + } +}