X-Git-Url: https://cloud.milkyroute.net/gitweb/dolphin.git/blobdiff_plain/a6b4348ddbc8fdf64ddb2c454e7fa2179e82c61b..0464ea82a6850f58805bc4d6fc1df5369d83c3df:/src/tests/dolphinmainwindowtest.cpp diff --git a/src/tests/dolphinmainwindowtest.cpp b/src/tests/dolphinmainwindowtest.cpp index f620cb6ba..b3e52ce23 100644 --- a/src/tests/dolphinmainwindowtest.cpp +++ b/src/tests/dolphinmainwindowtest.cpp @@ -9,7 +9,9 @@ #include "dolphintabpage.h" #include "dolphintabwidget.h" #include "dolphinviewcontainer.h" +#include "dolphin_generalsettings.h" #include "kitemviews/kfileitemmodel.h" +#include "kitemviews/kfileitemmodelrolesupdater.h" #include "kitemviews/kitemlistcontainer.h" #include "kitemviews/kitemlistcontroller.h" #include "kitemviews/kitemlistselectionmanager.h" @@ -29,6 +31,10 @@ #include #include +#include +#include +#include +#include #include #include @@ -48,6 +54,8 @@ private Q_SLOTS: void testOpenInNewTabTitle(); void testNewFileMenuEnabled_data(); void testNewFileMenuEnabled(); + void testCreateFileAction(); + void testCreateFileActionRequiresWritePermission(); void testWindowTitle_data(); void testWindowTitle(); void testFocusLocationBar(); @@ -58,6 +66,7 @@ private Q_SLOTS: void testAccessibilityTree(); void testAutoSaveSession(); void testInlineRename(); + void testThumbnailAfterRename(); void cleanupTestCase(); private: @@ -67,6 +76,11 @@ private: void DolphinMainWindowTest::initTestCase() { QStandardPaths::setTestModeEnabled(true); + // Use fullWidth statusbar during testing, to test out most of the features. + GeneralSettings *settings = GeneralSettings::self(); + settings->setShowStatusBar(GeneralSettings::EnumShowStatusBar::FullWidth); + settings->setShowZoomSlider(true); + settings->save(); } void DolphinMainWindowTest::init() @@ -140,20 +154,20 @@ void DolphinMainWindowTest::testSyncDesktopAndPhoneUi() do { QVERIFY2(desktopUiElement.tagName() == phoneUiElement.tagName(), qPrintable(QStringLiteral("Node mismatch: dolphinui.rc/%1::%2 and dolphinuiforphones.rc/%3::%4") - .arg(desktopUiElement.parentNode().toElement().tagName()) - .arg(desktopUiElement.tagName()) - .arg(phoneUiElement.parentNode().toElement().tagName()) - .arg(phoneUiElement.tagName()))); + .arg(desktopUiElement.parentNode().toElement().tagName(), + desktopUiElement.tagName(), + phoneUiElement.parentNode().toElement().tagName(), + phoneUiElement.tagName()))); QCOMPARE(desktopUiElement.text(), phoneUiElement.text()); const auto desktopUiElementAttributes = desktopUiElement.attributes(); const auto phoneUiElementAttributes = phoneUiElement.attributes(); for (int i = 0; i < desktopUiElementAttributes.count(); i++) { QVERIFY2(phoneUiElementAttributes.count() >= i, qPrintable(QStringLiteral("Attribute mismatch: dolphinui.rc/%1::%2 has more attributes than dolphinuiforphones.rc/%3::%4") - .arg(desktopUiElement.parentNode().toElement().tagName()) - .arg(desktopUiElement.tagName()) - .arg(phoneUiElement.parentNode().toElement().tagName()) - .arg(phoneUiElement.tagName()))); + .arg(desktopUiElement.parentNode().toElement().tagName(), + desktopUiElement.tagName(), + phoneUiElement.parentNode().toElement().tagName(), + phoneUiElement.tagName()))); if (exceptions.count(desktopUiElementAttributes.item(i).nodeName())) { continue; } @@ -163,12 +177,11 @@ void DolphinMainWindowTest::testSyncDesktopAndPhoneUi() } QVERIFY2(desktopUiElementAttributes.count() == phoneUiElementAttributes.count(), qPrintable(QStringLiteral("Attribute mismatch: dolphinui.rc/%1::%2 has fewer attributes than dolphinuiforphones.rc/%3::%4. %5 < %6") - .arg(desktopUiElement.parentNode().toElement().tagName()) - .arg(desktopUiElement.tagName()) - .arg(phoneUiElement.parentNode().toElement().tagName()) - .arg(phoneUiElement.tagName()) - .arg(phoneUiElementAttributes.count()) - .arg(desktopUiElementAttributes.count()))); + .arg(desktopUiElement.parentNode().toElement().tagName(), + desktopUiElement.tagName(), + phoneUiElement.parentNode().toElement().tagName(), + phoneUiElement.tagName()) + .arg(phoneUiElementAttributes.count(), desktopUiElementAttributes.count()))); desktopUiElement = nextUiElement(desktopUiElement); phoneUiElement = nextUiElement(phoneUiElement); @@ -190,7 +203,7 @@ void DolphinMainWindowTest::testClosingTabsWithSearchBoxVisible() QVERIFY(tabWidget); // Show search box on first tab. - tabWidget->currentTabPage()->activeViewContainer()->setSearchModeEnabled(true); + tabWidget->currentTabPage()->activeViewContainer()->setSearchBarVisible(true); tabWidget->openNewActivatedTab(QUrl::fromLocalFile(QDir::homePath())); QCOMPARE(tabWidget->count(), 2); @@ -370,6 +383,74 @@ void DolphinMainWindowTest::testNewFileMenuEnabled() QTRY_COMPARE(newFileMenu->isEnabled(), expectedEnabled); } +void DolphinMainWindowTest::testCreateFileAction() +{ + QScopedPointer testDir{new TestDir()}; + QString testDirUrl(QDir::cleanPath(testDir->url().toString())); + m_mainWindow->openDirectories({testDirUrl}, false); + m_mainWindow->show(); + QVERIFY(QTest::qWaitForWindowExposed(m_mainWindow.data())); + QVERIFY(m_mainWindow->isVisible()); + + QCOMPARE(m_mainWindow->m_activeViewContainer->view()->items().count(), 0); + + auto createFileAction = m_mainWindow->actionCollection()->action(QStringLiteral("create_file")); + QTRY_COMPARE(createFileAction->isEnabled(), true); + + createFileAction->setShortcut(QKeySequence(Qt::CTRL | Qt::ALT | Qt::Key_N)); + + QSignalSpy createFileActionSpy(createFileAction, &QAction::triggered); + + QTest::keyClick(QApplication::activeWindow(), Qt::Key_N, Qt::ControlModifier | Qt::AltModifier); + + QTRY_COMPARE(createFileActionSpy.count(), 1); + + QTRY_VERIFY(QApplication::activeModalWidget() != nullptr); + + auto newFileDialog = QApplication::activeModalWidget()->focusWidget(); + QTest::keyClick(newFileDialog, Qt::Key_X); + QTest::keyClick(newFileDialog, Qt::Key_Y); + QTest::keyClick(newFileDialog, Qt::Key_Z); + QTest::keyClick(newFileDialog, Qt::Key_Enter); + + QTRY_COMPARE(m_mainWindow->m_activeViewContainer->view()->items().count(), 1); + + QFile file(testDir->url().toLocalFile() + "/xyz.txt"); + QVERIFY(file.exists()); + QCOMPARE(file.size(), 0); +} + + void DolphinMainWindowTest::testCreateFileActionRequiresWritePermission() +{ + QScopedPointer testDir{new TestDir()}; + QString testDirUrl(QDir::cleanPath(testDir->url().toString())); + auto testDirAsFile = QFile(testDir->url().toLocalFile()); + + // make test dir read only + QVERIFY(testDirAsFile.setPermissions(QFileDevice::ReadOwner)); + + m_mainWindow->openDirectories({testDirUrl}, false); + m_mainWindow->show(); + QVERIFY(QTest::qWaitForWindowExposed(m_mainWindow.data())); + QVERIFY(m_mainWindow->isVisible()); + + QCOMPARE(m_mainWindow->m_activeViewContainer->view()->items().count(), 0); + + auto createFileAction = m_mainWindow->actionCollection()->action(QStringLiteral("create_file")); + QTRY_COMPARE(createFileAction->isEnabled(), false); + + createFileAction->setShortcut(QKeySequence(Qt::CTRL | Qt::ALT | Qt::Key_N)); + QTest::keyClick(QApplication::activeWindow(), Qt::Key_N, Qt::ControlModifier | Qt::AltModifier); + + QTRY_COMPARE(QApplication::activeModalWidget(), nullptr); + + QTRY_COMPARE(m_mainWindow->m_activeViewContainer->view()->items().count(), 0); + + QTRY_COMPARE(createFileAction->isEnabled(), false); + + QVERIFY(m_mainWindow->isVisible()); +} + void DolphinMainWindowTest::testWindowTitle_data() { QTest::addColumn("activeViewUrl"); @@ -844,7 +925,7 @@ void DolphinMainWindowTest::testAccessibilityTree() // after going forwards which is probably not intended. } } - QCOMPARE_GE(testedObjectsSizeAfterTraversingForwards, 12); // The test did not reach many objects while using the Tab key to move through Dolphin. Did the + QCOMPARE_GE(testedObjectsSizeAfterTraversingForwards, 11); // The test did not reach many objects while using the Tab key to move through Dolphin. Did the // test run correctly? } @@ -937,6 +1018,52 @@ void DolphinMainWindowTest::testInlineRename() QCOMPARE(view->m_model->count(), 4); } +void DolphinMainWindowTest::testThumbnailAfterRename() +{ + // Create testdir and red square jpg for testing + QScopedPointer testDir{new TestDir()}; + QImage testImage(256, 256, QImage::Format_Mono); + testImage.setColorCount(1); + testImage.setColor(0, qRgba(255, 0, 0, 255)); // Index #0 = Red + for (short x = 0; x < 256; ++x) { + for (short y = 0; y < 256; ++y) { + testImage.setPixel(x, y, 0); + } + } + testImage.save(testDir.data()->path() + "/a.jpg"); + + // Open dir and show it + m_mainWindow->openDirectories({testDir->url()}, false); + DolphinView *view = m_mainWindow->activeViewContainer()->view(); + // Prepare signal spies + QSignalSpy viewDirectoryLoadingCompletedSpy(view, &DolphinView::directoryLoadingCompleted); + QSignalSpy itemsChangedSpy(view->m_model, &KFileItemModel::itemsChanged); + QSignalSpy modelDirectoryLoadingCompletedSpy(view->m_model, &KFileItemModel::directoryLoadingCompleted); + QSignalSpy previewUpdatedSpy(view->m_view->m_modelRolesUpdater, &KFileItemModelRolesUpdater::previewJobFinished); + // Show window and check that our preview has been updated, then wait for it to appear + m_mainWindow->show(); + QVERIFY(viewDirectoryLoadingCompletedSpy.wait()); + QVERIFY(previewUpdatedSpy.wait()); + QVERIFY(QTest::qWaitForWindowExposed(m_mainWindow.data())); + QVERIFY(m_mainWindow->isVisible()); + QTest::qWait(500); // we need to wait for the file widgets to become visible + + // Set image selected and rename it to b.jpg, make sure editing role is working + view->markUrlsAsSelected({QUrl(testDir->url().toString() + "/a.jpg")}); + view->updateViewState(); + view->renameSelectedItems(); + QVERIFY(view->m_view->m_editingRole); + QTest::keyClick(QApplication::focusWidget(), Qt::Key_B); + QTest::keyClick(QApplication::focusWidget(), Qt::Key_Enter); + QVERIFY(itemsChangedSpy.wait()); // Make sure that rename worked + + // Check that preview gets updated and filename is correct + QVERIFY(previewUpdatedSpy.wait()); + QVERIFY(!view->m_view->m_editingRole); + QCOMPARE(view->m_model->fileItem(0).name(), "b.jpg"); + QCOMPARE(view->m_model->count(), 1); +} + void DolphinMainWindowTest::cleanupTestCase() { m_mainWindow->showNormal();