Index: ios/chrome/browser/ui/reading_list/reading_list_egtest.mm |
diff --git a/ios/chrome/browser/ui/reading_list/reading_list_egtest.mm b/ios/chrome/browser/ui/reading_list/reading_list_egtest.mm |
new file mode 100644 |
index 0000000000000000000000000000000000000000..31bb0cce29b5916eff26053d1a4f850806bd178b |
--- /dev/null |
+++ b/ios/chrome/browser/ui/reading_list/reading_list_egtest.mm |
@@ -0,0 +1,373 @@ |
+// 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 <EarlGrey/EarlGrey.h> |
+#import <UIKit/UIKit.h> |
+#import <XCTest/XCTest.h> |
+ |
+#include "base/mac/scoped_nsobject.h" |
+#include "base/strings/sys_string_conversions.h" |
+#include "components/reading_list/ios/reading_list_model.h" |
+#include "ios/chrome/browser/reading_list/reading_list_model_factory.h" |
+#import "ios/chrome/browser/ui/commands/generic_chrome_command.h" |
+#include "ios/chrome/browser/ui/commands/ios_command_ids.h" |
+#include "ios/chrome/grit/ios_strings.h" |
+#import "ios/chrome/test/app/chrome_test_util.h" |
+#import "ios/chrome/test/earl_grey/chrome_earl_grey_ui.h" |
+#import "ios/chrome/test/earl_grey/chrome_matchers.h" |
+#import "ios/chrome/test/earl_grey/chrome_test_case.h" |
+#import "ios/testing/wait_util.h" |
+ |
+namespace { |
+const char kReadTitle[] = "foobar"; |
+const char kReadURL[] = "http://readfoobar.com"; |
+const char kUnreadTitle[] = "I am an unread entry"; |
+const char kUnreadURL[] = "http://unreadfoobar.com"; |
+const char kReadURL2[] = "http://kReadURL2.com"; |
+const char kReadTitle2[] = "read item 2"; |
+const char kUnreadTitle2[] = "I am another unread entry"; |
+const char kUnreadURL2[] = "http://unreadfoobar2.com"; |
+const size_t kNumberReadEntries = 2; |
+const size_t kNumberUnreadEntries = 2; |
+const char kReadHeader[] = "Read"; |
+const char kUnreadHeader[] = "Unread"; |
+ |
+// Returns the reading list model. |
+ReadingListModel* GetReadingListModel() { |
+ ReadingListModel* model = |
+ ReadingListModelFactory::GetInstance()->GetForBrowserState( |
+ chrome_test_util::GetOriginalBrowserState()); |
+ GREYAssert(testing::WaitUntilConditionOrTimeout(2, |
+ ^{ |
+ return model->loaded(); |
+ }), |
+ @"Reading List model did not load"); |
+ return model; |
+} |
+ |
+// Asserts the |button_id| button is not visible. |
+void AssertButtonNotVisibleWithID(int button_id) { |
+ [[EarlGrey |
+ selectElementWithMatcher:chrome_test_util::buttonWithAccessibilityLabelId( |
+ button_id)] |
+ assertWithMatcher:grey_notVisible()]; |
+} |
+ |
+// Assert the |button_id| button is visible. |
+void AssertButtonVisibleWithID(int button_id) { |
+ [[EarlGrey |
+ selectElementWithMatcher:chrome_test_util::buttonWithAccessibilityLabelId( |
+ button_id)] |
+ assertWithMatcher:grey_sufficientlyVisible()]; |
+} |
+ |
+// Taps the |button_id| button. |
+void TapButtonWithID(int button_id) { |
+ [[EarlGrey |
+ selectElementWithMatcher:chrome_test_util::buttonWithAccessibilityLabelId( |
+ button_id)] performAction:grey_tap()]; |
+} |
+ |
+// Taps the entry |title|. |
+void TapEntry(std::string title) { |
+ [[EarlGrey selectElementWithMatcher: |
+ grey_allOf(chrome_test_util::staticTextWithAccessibilityLabel( |
+ base::SysUTF8ToNSString(title)), |
+ grey_sufficientlyVisible(), nil)] |
+ performAction:grey_tap()]; |
+} |
+ |
+// Asserts that the entry |title| is visible. |
+void AssertEntryVisible(std::string title) { |
+ [[GREYUIThreadExecutor sharedInstance] drainUntilIdle]; |
+ [[EarlGrey selectElementWithMatcher: |
+ grey_allOf(chrome_test_util::staticTextWithAccessibilityLabel( |
+ base::SysUTF8ToNSString(title)), |
+ grey_sufficientlyVisible(), nil)] |
+ assertWithMatcher:grey_sufficientlyVisible()]; |
+} |
+ |
+// Asserts that all the entries are visible. |
+void AssertAllEntriesVisible() { |
+ AssertEntryVisible(kReadTitle); |
+ AssertEntryVisible(kReadTitle2); |
+ AssertEntryVisible(kUnreadTitle); |
+ AssertEntryVisible(kUnreadTitle2); |
+ |
+ // If the number of entries changes, make sure this assert gets updated. |
+ GREYAssertEqual((size_t)2, kNumberReadEntries, |
+ @"The number of entries have changed"); |
+ GREYAssertEqual((size_t)2, kNumberUnreadEntries, |
+ @"The number of entries have changed"); |
+} |
+ |
+// Asserts that the entry |title| is not visible. |
+void AssertEntryNotVisible(std::string title) { |
+ [[GREYUIThreadExecutor sharedInstance] drainUntilIdle]; |
+ [[EarlGrey selectElementWithMatcher: |
+ grey_allOf(chrome_test_util::staticTextWithAccessibilityLabel( |
+ base::SysUTF8ToNSString(title)), |
+ grey_sufficientlyVisible(), nil)] |
+ assertWithMatcher:grey_notVisible()]; |
+} |
+ |
+// Asserts |header| is visible. |
+void AssertHeaderNotVisible(std::string header) { |
+ [[EarlGrey selectElementWithMatcher:chrome_test_util:: |
+ staticTextWithAccessibilityLabel( |
+ base::SysUTF8ToNSString(header))] |
+ assertWithMatcher:grey_notVisible()]; |
+} |
+ |
+// Opens the reading list menu using command line. |
+void OpenReadingList() { |
+ base::scoped_nsobject<GenericChromeCommand> command( |
+ [[GenericChromeCommand alloc] initWithTag:IDC_SHOW_READING_LIST]); |
+ chrome_test_util::RunCommandWithActiveViewController(command); |
+} |
+ |
+// Adds a read and an unread entry to the model, opens the reading list menu and |
+// enter edit mode. |
+void AddEntriesAndEnterEdit() { |
+ ReadingListModel* model = GetReadingListModel(); |
+ model->AddEntry(GURL(kReadURL), std::string(kReadTitle)); |
+ model->SetReadStatus(GURL(kReadURL), true); |
+ model->AddEntry(GURL(kReadURL2), std::string(kReadTitle2)); |
+ model->SetReadStatus(GURL(kReadURL2), true); |
+ model->AddEntry(GURL(kUnreadURL), std::string(kUnreadTitle)); |
+ model->AddEntry(GURL(kUnreadURL2), std::string(kUnreadTitle2)); |
+ OpenReadingList(); |
+ |
+ TapButtonWithID(IDS_IOS_READING_LIST_EDIT_BUTTON); |
+} |
+ |
+// Computes the number of read entries in the model. |
+size_t ModelReadSize(ReadingListModel* model) { |
+ size_t size = 0; |
+ for (const auto& url : model->Keys()) { |
+ if (model->GetEntryByURL(url)->IsRead()) { |
+ size++; |
+ } |
+ } |
+ return size; |
+} |
+} // namespace |
+ |
+// Test class for the Reading List menu. |
+@interface ReadingListTestCase : ChromeTestCase |
+ |
+@end |
+ |
+@implementation ReadingListTestCase |
+ |
+- (void)setUp { |
+ [super setUp]; |
+ ReadingListModel* model = GetReadingListModel(); |
+ for (const GURL& url : model->Keys()) |
+ model->RemoveEntryByURL(url); |
+} |
+ |
+// Tests that only the "Edit" button is showing when not editing. |
+- (void)testVisibleButtonsNonEditingMode { |
+ GetReadingListModel()->AddEntry(GURL(kUnreadURL), std::string(kUnreadTitle)); |
+ OpenReadingList(); |
+ |
+ AssertButtonNotVisibleWithID(IDS_IOS_READING_LIST_DELETE_BUTTON); |
+ AssertButtonNotVisibleWithID(IDS_IOS_READING_LIST_DELETE_ALL_READ_BUTTON); |
+ AssertButtonNotVisibleWithID(IDS_IOS_READING_LIST_MARK_READ_BUTTON); |
+ AssertButtonNotVisibleWithID(IDS_IOS_READING_LIST_MARK_UNREAD_BUTTON); |
+ AssertButtonNotVisibleWithID(IDS_IOS_READING_LIST_MARK_ALL_BUTTON); |
+ AssertButtonNotVisibleWithID(IDS_IOS_READING_LIST_MARK_BUTTON); |
+ AssertButtonNotVisibleWithID(IDS_IOS_READING_LIST_CANCEL_BUTTON); |
+ AssertButtonVisibleWithID(IDS_IOS_READING_LIST_EDIT_BUTTON); |
+} |
+ |
+// Tests that only the "Cancel", "Delete All Read" and "Mark All…" buttons are |
+// showing when not editing. |
+- (void)testVisibleButtonsEditingModeEmptySelection { |
+ AddEntriesAndEnterEdit(); |
+ |
+ AssertButtonNotVisibleWithID(IDS_IOS_READING_LIST_DELETE_BUTTON); |
+ AssertButtonNotVisibleWithID(IDS_IOS_READING_LIST_MARK_READ_BUTTON); |
+ AssertButtonNotVisibleWithID(IDS_IOS_READING_LIST_MARK_UNREAD_BUTTON); |
+ AssertButtonNotVisibleWithID(IDS_IOS_READING_LIST_MARK_BUTTON); |
+ AssertButtonNotVisibleWithID(IDS_IOS_READING_LIST_EDIT_BUTTON); |
+ AssertButtonVisibleWithID(IDS_IOS_READING_LIST_DELETE_ALL_READ_BUTTON); |
+ AssertButtonVisibleWithID(IDS_IOS_READING_LIST_MARK_ALL_BUTTON); |
+ AssertButtonVisibleWithID(IDS_IOS_READING_LIST_CANCEL_BUTTON); |
+} |
+ |
+// Tests that only the "Cancel", "Delete" and "Mark Unread" buttons are showing |
+// when not editing. |
+- (void)testVisibleButtonsOnlyReadEntrySelected { |
+ AddEntriesAndEnterEdit(); |
+ TapEntry(kReadTitle); |
+ |
+ AssertButtonNotVisibleWithID(IDS_IOS_READING_LIST_DELETE_ALL_READ_BUTTON); |
+ AssertButtonNotVisibleWithID(IDS_IOS_READING_LIST_MARK_READ_BUTTON); |
+ AssertButtonNotVisibleWithID(IDS_IOS_READING_LIST_MARK_BUTTON); |
+ AssertButtonNotVisibleWithID(IDS_IOS_READING_LIST_EDIT_BUTTON); |
+ AssertButtonNotVisibleWithID(IDS_IOS_READING_LIST_MARK_ALL_BUTTON); |
+ AssertButtonVisibleWithID(IDS_IOS_READING_LIST_MARK_UNREAD_BUTTON); |
+ AssertButtonVisibleWithID(IDS_IOS_READING_LIST_DELETE_BUTTON); |
+ AssertButtonVisibleWithID(IDS_IOS_READING_LIST_CANCEL_BUTTON); |
+} |
+ |
+// Tests that only the "Cancel", "Delete" and "Mark Read" buttons are showing |
+// when not editing. |
+- (void)testVisibleButtonsOnlyUnreadEntrySelected { |
+ AddEntriesAndEnterEdit(); |
+ TapEntry(kUnreadTitle); |
+ |
+ AssertButtonNotVisibleWithID(IDS_IOS_READING_LIST_DELETE_ALL_READ_BUTTON); |
+ AssertButtonNotVisibleWithID(IDS_IOS_READING_LIST_MARK_UNREAD_BUTTON); |
+ AssertButtonNotVisibleWithID(IDS_IOS_READING_LIST_MARK_BUTTON); |
+ AssertButtonNotVisibleWithID(IDS_IOS_READING_LIST_EDIT_BUTTON); |
+ AssertButtonNotVisibleWithID(IDS_IOS_READING_LIST_MARK_ALL_BUTTON); |
+ AssertButtonVisibleWithID(IDS_IOS_READING_LIST_MARK_READ_BUTTON); |
+ AssertButtonVisibleWithID(IDS_IOS_READING_LIST_DELETE_BUTTON); |
+ AssertButtonVisibleWithID(IDS_IOS_READING_LIST_CANCEL_BUTTON); |
+} |
+ |
+// Tests that only the "Cancel", "Delete" and "Mark…" buttons are showing when |
+// not editing. |
+- (void)testVisibleButtonsMixedEntriesSelected { |
+ AddEntriesAndEnterEdit(); |
+ TapEntry(kReadTitle); |
+ TapEntry(kUnreadTitle); |
+ |
+ AssertButtonNotVisibleWithID(IDS_IOS_READING_LIST_DELETE_ALL_READ_BUTTON); |
+ AssertButtonNotVisibleWithID(IDS_IOS_READING_LIST_MARK_UNREAD_BUTTON); |
+ AssertButtonNotVisibleWithID(IDS_IOS_READING_LIST_MARK_READ_BUTTON); |
+ AssertButtonNotVisibleWithID(IDS_IOS_READING_LIST_EDIT_BUTTON); |
+ AssertButtonNotVisibleWithID(IDS_IOS_READING_LIST_MARK_ALL_BUTTON); |
+ AssertButtonVisibleWithID(IDS_IOS_READING_LIST_MARK_BUTTON); |
+ AssertButtonVisibleWithID(IDS_IOS_READING_LIST_DELETE_BUTTON); |
+ AssertButtonVisibleWithID(IDS_IOS_READING_LIST_CANCEL_BUTTON); |
+} |
+ |
+// Tests the deletion of selected entries. |
+- (void)testDeleteEntries { |
+ AddEntriesAndEnterEdit(); |
+ |
+ TapEntry(kReadTitle2); |
+ |
+ TapButtonWithID(IDS_IOS_READING_LIST_DELETE_BUTTON); |
+ |
+ AssertEntryVisible(kReadTitle); |
+ AssertEntryNotVisible(kReadTitle2); |
+ AssertEntryVisible(kUnreadTitle); |
+ AssertEntryVisible(kUnreadTitle2); |
+ XCTAssertEqual(kNumberReadEntries - 1, ModelReadSize(GetReadingListModel())); |
+ XCTAssertEqual(kNumberUnreadEntries, GetReadingListModel()->unread_size()); |
+} |
+ |
+// Tests the deletion of all read entries. |
+- (void)testDeleteAllReadEntries { |
+ AddEntriesAndEnterEdit(); |
+ |
+ TapButtonWithID(IDS_IOS_READING_LIST_DELETE_ALL_READ_BUTTON); |
+ |
+ AssertEntryNotVisible(kReadTitle); |
+ AssertEntryNotVisible(kReadTitle2); |
+ AssertHeaderNotVisible(kReadHeader); |
+ AssertEntryVisible(kUnreadTitle); |
+ AssertEntryVisible(kUnreadTitle2); |
+ XCTAssertEqual((size_t)0, ModelReadSize(GetReadingListModel())); |
+ XCTAssertEqual(kNumberUnreadEntries, GetReadingListModel()->unread_size()); |
+} |
+ |
+// Marks all unread entries as read. |
+- (void)testMarkAllRead { |
+ AddEntriesAndEnterEdit(); |
+ |
+ TapButtonWithID(IDS_IOS_READING_LIST_MARK_ALL_BUTTON); |
+ |
+ // Tap the action sheet. |
+ TapButtonWithID(IDS_IOS_READING_LIST_MARK_ALL_READ_ACTION); |
+ |
+ AssertHeaderNotVisible(kUnreadHeader); |
+ AssertAllEntriesVisible(); |
+ XCTAssertEqual(kNumberUnreadEntries + kNumberReadEntries, |
+ ModelReadSize(GetReadingListModel())); |
+ XCTAssertEqual((size_t)0, GetReadingListModel()->unread_size()); |
+} |
+ |
+// Marks all read entries as unread. |
+- (void)testMarkAllUnread { |
+ AddEntriesAndEnterEdit(); |
+ |
+ TapButtonWithID(IDS_IOS_READING_LIST_MARK_ALL_BUTTON); |
+ |
+ // Tap the action sheet. |
+ TapButtonWithID(IDS_IOS_READING_LIST_MARK_ALL_UNREAD_ACTION); |
+ |
+ AssertHeaderNotVisible(kReadHeader); |
+ AssertAllEntriesVisible(); |
+ XCTAssertEqual(kNumberUnreadEntries + kNumberReadEntries, |
+ GetReadingListModel()->unread_size()); |
+ XCTAssertEqual((size_t)0, ModelReadSize(GetReadingListModel())); |
+} |
+ |
+// Selects an unread entry and mark it as read. |
+- (void)testMarkEntriesRead { |
+ AddEntriesAndEnterEdit(); |
+ TapEntry(kUnreadTitle); |
+ |
+ TapButtonWithID(IDS_IOS_READING_LIST_MARK_READ_BUTTON); |
+ |
+ AssertAllEntriesVisible(); |
+ XCTAssertEqual(kNumberReadEntries + 1, ModelReadSize(GetReadingListModel())); |
+ XCTAssertEqual(kNumberUnreadEntries - 1, |
+ GetReadingListModel()->unread_size()); |
+} |
+ |
+// Selects an read entry and mark it as unread. |
+- (void)testMarkEntriesUnread { |
+ AddEntriesAndEnterEdit(); |
+ TapEntry(kReadTitle); |
+ |
+ TapButtonWithID(IDS_IOS_READING_LIST_MARK_UNREAD_BUTTON); |
+ |
+ AssertAllEntriesVisible(); |
+ XCTAssertEqual(kNumberReadEntries - 1, ModelReadSize(GetReadingListModel())); |
+ XCTAssertEqual(kNumberUnreadEntries + 1, |
+ GetReadingListModel()->unread_size()); |
+} |
+ |
+// Selects read and unread entries and mark them as unread. |
+- (void)testMarkMixedEntriesUnread { |
+ AddEntriesAndEnterEdit(); |
+ TapEntry(kReadTitle); |
+ TapEntry(kUnreadTitle); |
+ |
+ TapButtonWithID(IDS_IOS_READING_LIST_MARK_BUTTON); |
+ |
+ // Tap the action sheet. |
+ TapButtonWithID(IDS_IOS_READING_LIST_MARK_UNREAD_BUTTON); |
+ |
+ AssertAllEntriesVisible(); |
+ XCTAssertEqual(kNumberReadEntries - 1, ModelReadSize(GetReadingListModel())); |
+ XCTAssertEqual(kNumberUnreadEntries + 1, |
+ GetReadingListModel()->unread_size()); |
+} |
+ |
+// Selects read and unread entries and mark them as read. |
+- (void)testMarkMixedEntriesRead { |
+ AddEntriesAndEnterEdit(); |
+ TapEntry(kReadTitle); |
+ TapEntry(kUnreadTitle); |
+ |
+ TapButtonWithID(IDS_IOS_READING_LIST_MARK_BUTTON); |
+ |
+ // Tap the action sheet. |
+ TapButtonWithID(IDS_IOS_READING_LIST_MARK_READ_BUTTON); |
+ |
+ AssertAllEntriesVisible(); |
+ XCTAssertEqual(kNumberReadEntries + 1, ModelReadSize(GetReadingListModel())); |
+ XCTAssertEqual(kNumberUnreadEntries - 1, |
+ GetReadingListModel()->unread_size()); |
+} |
+ |
+@end |