blob: fa3f0acf18526263753e9529625b5d6010e02f9a [file] [log] [blame]
// Copyright 2017 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/reading_list/reading_list_coordinator.h"
#include "base/memory/ptr_util.h"
#include "base/threading/thread_task_runner_handle.h"
#include "base/time/default_clock.h"
#include "components/favicon/core/large_icon_service.h"
#include "components/favicon/core/test/mock_favicon_service.h"
#include "components/reading_list/core/reading_list_entry.h"
#include "components/reading_list/core/reading_list_model_impl.h"
#include "ios/chrome/browser/browser_state/test_chrome_browser_state.h"
#import "ios/chrome/browser/ui/collection_view/collection_view_model.h"
#import "ios/chrome/browser/ui/reading_list/reading_list_collection_view_controller.h"
#import "ios/chrome/browser/ui/reading_list/reading_list_collection_view_item.h"
#import "ios/chrome/browser/ui/reading_list/reading_list_mediator.h"
#import "ios/chrome/browser/ui/reading_list/reading_list_utils.h"
#import "ios/chrome/browser/ui/url_loader.h"
#include "ios/web/public/referrer.h"
#import "ios/web/public/test/web_test_with_web_state.h"
#include "testing/gmock/include/gmock/gmock.h"
#import "third_party/ocmock/OCMock/OCMock.h"
#import "third_party/ocmock/gtest_support.h"
#include "ui/base/page_transition_types.h"
#if !defined(__has_feature) || !__has_feature(objc_arc)
#error "This file requires ARC support."
#endif
using favicon::PostReply;
using testing::_;
#pragma mark - UrlLoader
@interface UrlLoaderStub : NSObject<UrlLoader> {
GURL _url;
web::Referrer _referrer;
}
@property(nonatomic, readonly) const GURL& url;
@property(nonatomic, readonly) const web::Referrer& referrer;
@property(nonatomic, assign) ui::PageTransition transition;
@property(nonatomic, assign) BOOL rendererInitiated;
@end
@implementation UrlLoaderStub
@synthesize transition = _transition;
@synthesize rendererInitiated = _rendererInitiated;
- (void)loadURL:(const GURL&)url
referrer:(const web::Referrer&)referrer
transition:(ui::PageTransition)transition
rendererInitiated:(BOOL)rendererInitiated {
_url = url;
_referrer = referrer;
self.transition = transition;
self.rendererInitiated = rendererInitiated;
}
- (void)webPageOrderedOpen:(const GURL&)url
referrer:(const web::Referrer&)referrer
inBackground:(BOOL)inBackground
appendTo:(OpenPosition)appendTo {
}
- (void)webPageOrderedOpen:(const GURL&)url
referrer:(const web::Referrer&)referrer
inIncognito:(BOOL)inIncognito
inBackground:(BOOL)inBackground
appendTo:(OpenPosition)appendTo {
}
- (void)loadSessionTab:(const sessions::SessionTab*)sessionTab {
}
- (void)loadJavaScriptFromLocationBar:(NSString*)script {
}
- (const GURL&)url {
return _url;
}
- (const web::Referrer&)referrer {
return _referrer;
}
@end
#pragma mark - ReadingListCoordinatorTest
class ReadingListCoordinatorTest : public web::WebTestWithWebState {
public:
ReadingListCoordinatorTest() {
loader_mock_ = [[UrlLoaderStub alloc] init];
TestChromeBrowserState::Builder builder;
browser_state_ = builder.Build();
reading_list_model_.reset(new ReadingListModelImpl(
nullptr, nullptr, base::MakeUnique<base::DefaultClock>()));
mediator_ =
[[ReadingListMediator alloc] initWithModel:reading_list_model_.get()];
large_icon_service_.reset(new favicon::LargeIconService(
&mock_favicon_service_, base::ThreadTaskRunnerHandle::Get(),
/*image_fetcher=*/nullptr));
coordinator_ = [[ReadingListCoordinator alloc]
initWithBaseViewController:nil
browserState:browser_state_.get()
loader:loader_mock_];
EXPECT_CALL(mock_favicon_service_,
GetLargestRawFaviconForPageURL(_, _, _, _, _))
.WillRepeatedly(PostReply<5>(favicon_base::FaviconRawBitmapResult()));
}
~ReadingListCoordinatorTest() override {}
ReadingListCoordinator* GetCoordinator() { return coordinator_; }
ReadingListModel* GetReadingListModel() { return reading_list_model_.get(); }
UrlLoaderStub* GetLoaderStub() { return loader_mock_; }
ReadingListCollectionViewController*
GetAReadingListCollectionViewController() {
return [[ReadingListCollectionViewController alloc]
initWithDataSource:mediator_
largeIconService:large_icon_service_.get()
toolbar:nil];
}
private:
ReadingListCoordinator* coordinator_;
ReadingListMediator* mediator_;
std::unique_ptr<ReadingListModelImpl> reading_list_model_;
UrlLoaderStub* loader_mock_;
testing::StrictMock<favicon::MockFaviconService> mock_favicon_service_;
std::unique_ptr<favicon::LargeIconService> large_icon_service_;
std::unique_ptr<TestChromeBrowserState> browser_state_;
};
// Tests that the implementation of ReadingListCoordinator openItemAtIndexPath
// opens the entry.
TEST_F(ReadingListCoordinatorTest, OpenItem) {
// Setup.
GURL url("https://chromium.org");
std::string title("Chromium");
std::unique_ptr<ReadingListEntry> entry =
base::MakeUnique<ReadingListEntry>(url, title, base::Time::FromTimeT(10));
ReadingListModel* model = GetReadingListModel();
model->AddEntry(url, title, reading_list::ADDED_VIA_CURRENT_APP);
ReadingListCollectionViewItem* item = [[ReadingListCollectionViewItem alloc]
initWithType:0
url:url
distillationState:ReadingListUIDistillationStatusSuccess];
// Action.
[GetCoordinator() readingListCollectionViewController:
GetAReadingListCollectionViewController()
openItem:item];
// Tests.
UrlLoaderStub* loader = GetLoaderStub();
EXPECT_EQ(url, loader.url);
EXPECT_TRUE(ui::PageTransitionCoreTypeIs(ui::PAGE_TRANSITION_AUTO_BOOKMARK,
loader.transition));
EXPECT_EQ(NO, loader.rendererInitiated);
}