Index: ios/chrome/browser/ui/history/history_collection_view_controller_unittest.mm |
diff --git a/ios/chrome/browser/ui/history/history_collection_view_controller_unittest.mm b/ios/chrome/browser/ui/history/history_collection_view_controller_unittest.mm |
new file mode 100644 |
index 0000000000000000000000000000000000000000..322b1cc8fb09915ded45859f3c4e0febb01a7f44 |
--- /dev/null |
+++ b/ios/chrome/browser/ui/history/history_collection_view_controller_unittest.mm |
@@ -0,0 +1,191 @@ |
+// Copyright 2016 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#import "ios/chrome/browser/ui/history/history_collection_view_controller.h" |
+ |
+#include <memory> |
+ |
+#import "base/mac/scoped_nsobject.h" |
+#include "base/strings/string16.h" |
+#import "base/test/ios/wait_util.h" |
+#include "base/time/time.h" |
+#include "ios/chrome/browser/browser_state/test_chrome_browser_state.h" |
+#include "ios/chrome/browser/signin/authentication_service_factory.h" |
+#include "ios/chrome/browser/signin/authentication_service_fake.h" |
+#import "ios/chrome/browser/ui/history/history_entry.h" |
+#import "ios/chrome/browser/ui/history/history_service_facade.h" |
+#import "ios/chrome/browser/ui/history/history_service_facade_delegate.h" |
+#import "ios/chrome/browser/ui/url_loader.h" |
+#include "ios/chrome/test/block_cleanup_test.h" |
+#include "ios/web/public/test/test_web_thread.h" |
+#include "ios/web/public/test/test_web_thread_bundle.h" |
+#include "testing/gtest/include/gtest/gtest.h" |
+#import "third_party/ocmock/OCMock/OCMock.h" |
+#import "third_party/ocmock/gtest_support.h" |
+ |
+namespace { |
+ |
+HistoryServiceFacade::QueryResult QueryResultWithVisits( |
+ std::vector<std::pair<const GURL&, base::Time>> visits) { |
+ std::vector<history::HistoryEntry> entries{}; |
+ for (std::pair<const GURL&, base::Time> visit : visits) { |
+ history::HistoryEntry entry = history::HistoryEntry(); |
+ entry.url = visit.first; |
+ entry.time = visit.second; |
+ entries.push_back(entry); |
+ } |
+ HistoryServiceFacade::QueryResult result{}; |
+ result.entries = entries; |
+ result.finished = true; |
+ return result; |
+} |
+ |
+} // namespace |
+ |
+@interface HistoryCollectionViewController ( |
+ Testing)<HistoryServiceFacadeDelegate> |
+- (void)didPressClearBrowsingBar; |
+@end |
+ |
+class HistoryCollectionViewControllerTest : public BlockCleanupTest { |
+ public: |
+ HistoryCollectionViewControllerTest() {} |
+ ~HistoryCollectionViewControllerTest() override {} |
+ |
+ void SetUp() override { |
+ BlockCleanupTest::SetUp(); |
+ DCHECK_CURRENTLY_ON(web::WebThread::UI); |
+ TestChromeBrowserState::Builder builder; |
+ builder.AddTestingFactory( |
+ AuthenticationServiceFactory::GetInstance(), |
+ AuthenticationServiceFake::CreateAuthenticationService); |
+ mock_browser_state_ = builder.Build(); |
+ mock_delegate_.reset([[OCMockObject |
+ niceMockForProtocol:@protocol(HistoryCollectionViewControllerDelegate)] |
+ retain]); |
+ mock_url_loader_.reset( |
+ [[OCMockObject niceMockForProtocol:@protocol(UrlLoader)] retain]); |
+ history_collection_view_controller_.reset( |
+ [[HistoryCollectionViewController alloc] |
+ initWithLoader:mock_url_loader_ |
+ browserState:mock_browser_state_.get() |
+ delegate:mock_delegate_]); |
+ } |
+ |
+ void TearDown() override { |
+ history_collection_view_controller_.reset(); |
+ BlockCleanupTest::TearDown(); |
+ } |
+ |
+ protected: |
+ web::TestWebThreadBundle thread_bundle_; |
+ base::scoped_nsprotocol<id<UrlLoader>> mock_url_loader_; |
+ std::unique_ptr<TestChromeBrowserState> mock_browser_state_; |
+ base::scoped_nsprotocol<id<HistoryCollectionViewControllerDelegate>> |
+ mock_delegate_; |
+ base::scoped_nsobject<HistoryCollectionViewController> |
+ history_collection_view_controller_; |
+ bool privacy_settings_opened_; |
+ DISALLOW_COPY_AND_ASSIGN(HistoryCollectionViewControllerTest); |
+}; |
+ |
+// Tests that hasHistoryEntries property returns YES after entries have been |
+// received. |
+TEST_F(HistoryCollectionViewControllerTest, HasHistoryEntries) { |
+ GURL url_1("http://test1"); |
+ HistoryServiceFacade::QueryResult query_result = |
+ QueryResultWithVisits({{url_1, base::Time::Now()}}); |
+ [history_collection_view_controller_ historyServiceFacade:nil |
+ didReceiveQueryResult:query_result]; |
+ EXPECT_TRUE([history_collection_view_controller_ hasHistoryEntries]); |
+} |
+ |
+// Tests adding two entries to history from the same day, then deleting the |
+// first of them results in one history entry in the collection. |
+TEST_F(HistoryCollectionViewControllerTest, DeleteSingleEntry) { |
+ // Add history entries |
+ GURL url_1("http://test1"); |
+ GURL url_2("http://test2"); |
+ HistoryServiceFacade::QueryResult query_result = QueryResultWithVisits( |
+ {{url_1, base::Time::Now()}, {url_2, base::Time::Now()}}); |
+ [history_collection_view_controller_ historyServiceFacade:nil |
+ didReceiveQueryResult:query_result]; |
+ |
+ UICollectionView* collection_view = |
+ [history_collection_view_controller_ collectionView]; |
+ [collection_view |
+ selectItemAtIndexPath:[NSIndexPath indexPathForItem:0 inSection:1] |
+ animated:NO |
+ scrollPosition:UICollectionViewScrollPositionNone]; |
+ [history_collection_view_controller_ deleteSelectedItemsFromHistory]; |
+ |
+ // Expect header section with one item and one entries section with one item. |
+ EXPECT_EQ(2, [collection_view numberOfSections]); |
+ EXPECT_EQ(1, [collection_view numberOfItemsInSection:0]); |
+ EXPECT_EQ(1, [collection_view numberOfItemsInSection:1]); |
+} |
+ |
+// Tests that adding two entries to history from the same day then deleting |
+// both of them results in only the header section in the collection. |
+TEST_F(HistoryCollectionViewControllerTest, DeleteMultipleEntries) { |
+ // Add history entries. |
+ GURL url_1("http://test1"); |
+ GURL url_2("http://test2"); |
+ HistoryServiceFacade::QueryResult query_result = QueryResultWithVisits( |
+ {{url_1, base::Time::Now()}, {url_2, base::Time::Now()}}); |
+ [history_collection_view_controller_ historyServiceFacade:nil |
+ didReceiveQueryResult:query_result]; |
+ |
+ // Select history entries and tap delete. |
+ UICollectionView* collection_view = |
+ [history_collection_view_controller_ collectionView]; |
+ collection_view.allowsMultipleSelection = YES; |
+ [collection_view |
+ selectItemAtIndexPath:[NSIndexPath indexPathForItem:0 inSection:1] |
+ animated:NO |
+ scrollPosition:UICollectionViewScrollPositionNone]; |
+ [collection_view |
+ selectItemAtIndexPath:[NSIndexPath indexPathForItem:1 inSection:1] |
+ animated:NO |
+ scrollPosition:UICollectionViewScrollPositionNone]; |
+ EXPECT_EQ(2, (int)[[collection_view indexPathsForSelectedItems] count]); |
+ [history_collection_view_controller_ deleteSelectedItemsFromHistory]; |
+ |
+ // Expect only the header section to remain. |
+ EXPECT_EQ(1, [collection_view numberOfSections]); |
+ EXPECT_EQ(1, [collection_view numberOfItemsInSection:0]); |
+} |
+ |
+// Tests that adding two entries to history from different days then deleting |
+// both of them results in only the header section in the collection. |
+TEST_F(HistoryCollectionViewControllerTest, DeleteMultipleSections) { |
+ GURL url_1("http://test1"); |
+ GURL url_2("http://test2"); |
+ |
+ HistoryServiceFacade::QueryResult query_result = QueryResultWithVisits( |
+ {{url_1, base::Time::Now() - base::TimeDelta::FromDays(1)}, |
+ {url_2, base::Time::Now()}}); |
+ [history_collection_view_controller_ historyServiceFacade:nil |
+ didReceiveQueryResult:query_result]; |
+ UICollectionView* collection_view = |
+ [history_collection_view_controller_ collectionView]; |
+ // Expect two history sections in addition to the header section. |
+ EXPECT_EQ(3, [collection_view numberOfSections]); |
+ |
+ // Select all history items, and delete. |
+ collection_view.allowsMultipleSelection = YES; |
+ [collection_view |
+ selectItemAtIndexPath:[NSIndexPath indexPathForItem:0 inSection:1] |
+ animated:NO |
+ scrollPosition:UICollectionViewScrollPositionNone]; |
+ [collection_view |
+ selectItemAtIndexPath:[NSIndexPath indexPathForItem:0 inSection:2] |
+ animated:NO |
+ scrollPosition:UICollectionViewScrollPositionNone]; |
+ [history_collection_view_controller_ deleteSelectedItemsFromHistory]; |
+ |
+ // Expect only the header section to remain. |
+ EXPECT_EQ(1, [collection_view numberOfSections]); |
+ EXPECT_EQ(1, [collection_view numberOfItemsInSection:0]); |
+} |