Changeset View
Changeset View
Standalone View
Standalone View
tests/units/widgets/availablesourcesviewtest.cpp
Show All 36 Lines | |||||
37 | #include "presentation/querytreemodelbase.h" | 37 | #include "presentation/querytreemodelbase.h" | ||
38 | 38 | | |||
39 | #include "widgets/availablesourcesview.h" | 39 | #include "widgets/availablesourcesview.h" | ||
40 | #include "widgets/datasourcedelegate.h" | 40 | #include "widgets/datasourcedelegate.h" | ||
41 | 41 | | |||
42 | class AvailableSourcesModelStub : public QObject | 42 | class AvailableSourcesModelStub : public QObject | ||
43 | { | 43 | { | ||
44 | Q_OBJECT | 44 | Q_OBJECT | ||
45 | Q_PROPERTY(QString searchTerm READ searchTerm WRITE setSearchTerm) | | |||
46 | public: | 45 | public: | ||
47 | explicit AvailableSourcesModelStub(QObject *parent = Q_NULLPTR) | 46 | explicit AvailableSourcesModelStub(QObject *parent = Q_NULLPTR) | ||
48 | : QObject(parent), | 47 | : QObject(parent), | ||
49 | settingsCalled(false) | 48 | settingsCalled(false) | ||
50 | { | 49 | { | ||
51 | } | 50 | } | ||
52 | 51 | | |||
53 | QString searchTerm() const | | |||
54 | { | | |||
55 | return m_searchTerm; | | |||
56 | } | | |||
57 | | ||||
58 | public slots: | 52 | public slots: | ||
59 | void showConfigDialog() | 53 | void showConfigDialog() | ||
60 | { | 54 | { | ||
61 | settingsCalled = true; | 55 | settingsCalled = true; | ||
62 | } | 56 | } | ||
63 | 57 | | |||
64 | void setDefaultItem(const QModelIndex &index) | 58 | void setDefaultItem(const QModelIndex &index) | ||
65 | { | 59 | { | ||
66 | defaultIndex = index; | 60 | defaultIndex = index; | ||
67 | } | 61 | } | ||
68 | 62 | | |||
69 | void setSearchTerm(const QString &term) | | |||
70 | { | | |||
71 | m_searchTerm = term; | | |||
72 | } | | |||
73 | | ||||
74 | void listSource(const Domain::DataSource::Ptr &source) | | |||
75 | { | | |||
76 | listedSources << source; | | |||
77 | } | | |||
78 | | ||||
79 | void unlistSource(const Domain::DataSource::Ptr &source) | | |||
80 | { | | |||
81 | unlistedSources << source; | | |||
82 | } | | |||
83 | | ||||
84 | void bookmarkSource(const Domain::DataSource::Ptr &source) | | |||
85 | { | | |||
86 | bookmarkedSources << source; | | |||
87 | } | | |||
88 | | ||||
89 | public: | 63 | public: | ||
90 | bool settingsCalled; | 64 | bool settingsCalled; | ||
91 | QList<Domain::DataSource::Ptr> listedSources; | | |||
92 | QList<Domain::DataSource::Ptr> unlistedSources; | | |||
93 | QList<Domain::DataSource::Ptr> bookmarkedSources; | | |||
94 | QPersistentModelIndex defaultIndex; | 65 | QPersistentModelIndex defaultIndex; | ||
95 | | ||||
96 | private: | | |||
97 | QString m_searchTerm; | | |||
98 | }; | 66 | }; | ||
99 | 67 | | |||
100 | 68 | | |||
101 | class AvailableSourcesViewTest : public QObject | 69 | class AvailableSourcesViewTest : public QObject | ||
102 | { | 70 | { | ||
103 | Q_OBJECT | 71 | Q_OBJECT | ||
104 | private slots: | 72 | private slots: | ||
105 | void shouldHaveDefaultState() | 73 | void shouldHaveDefaultState() | ||
106 | { | 74 | { | ||
107 | Widgets::AvailableSourcesView available; | 75 | Widgets::AvailableSourcesView available; | ||
108 | 76 | | |||
109 | QVERIFY(!available.model()); | 77 | QVERIFY(!available.model()); | ||
110 | 78 | | |||
111 | auto sourcesView = available.findChild<QTreeView*>(QStringLiteral("sourcesView")); | 79 | auto sourcesView = available.findChild<QTreeView*>(QStringLiteral("sourcesView")); | ||
112 | QVERIFY(sourcesView); | 80 | QVERIFY(sourcesView); | ||
113 | QVERIFY(sourcesView->isVisibleTo(&available)); | 81 | QVERIFY(sourcesView->isVisibleTo(&available)); | ||
114 | QVERIFY(!sourcesView->header()->isVisibleTo(&available)); | 82 | QVERIFY(!sourcesView->header()->isVisibleTo(&available)); | ||
115 | auto delegate = qobject_cast<Widgets::DataSourceDelegate*>(sourcesView->itemDelegate()); | 83 | auto delegate = qobject_cast<Widgets::DataSourceDelegate*>(sourcesView->itemDelegate()); | ||
116 | #ifdef ZANSHIN_HIDING_SOURCES_ENABLED | 84 | QVERIFY(delegate); | ||
117 | QVERIFY(delegate->actionsEnabled()); | | |||
118 | #else | | |||
119 | QVERIFY(!delegate->isActionsEnabled()); | | |||
120 | #endif | | |||
121 | | ||||
122 | auto searchEdit = available.findChild<KLineEdit*>(QStringLiteral("searchEdit")); | | |||
123 | QVERIFY(searchEdit); | | |||
124 | #ifdef ZANSHIN_HIDING_SOURCES_ENABLED | | |||
125 | QVERIFY(searchEdit->isVisibleTo(&available)); | | |||
126 | #else | | |||
127 | QVERIFY(!searchEdit->isVisibleTo(&available)); | | |||
128 | #endif | | |||
129 | QVERIFY(searchEdit->isClearButtonShown()); | | |||
130 | QCOMPARE(searchEdit->placeholderText(), tr("Search...")); | | |||
131 | 85 | | |||
132 | auto proxy = qobject_cast<QSortFilterProxyModel*>(sourcesView->model()); | 86 | auto proxy = qobject_cast<QSortFilterProxyModel*>(sourcesView->model()); | ||
133 | QVERIFY(proxy); | 87 | QVERIFY(proxy); | ||
134 | QVERIFY(proxy->dynamicSortFilter()); | 88 | QVERIFY(proxy->dynamicSortFilter()); | ||
135 | QCOMPARE(proxy->sortColumn(), 0); | 89 | QCOMPARE(proxy->sortColumn(), 0); | ||
136 | QCOMPARE(proxy->sortOrder(), Qt::AscendingOrder); | 90 | QCOMPARE(proxy->sortOrder(), Qt::AscendingOrder); | ||
137 | 91 | | |||
138 | auto actionBar = available.findChild<QToolBar*>(QStringLiteral("actionBar")); | 92 | auto actionBar = available.findChild<QToolBar*>(QStringLiteral("actionBar")); | ||
▲ Show 20 Lines • Show All 136 Lines • ▼ Show 20 Line(s) | 220 | { | |||
275 | QVERIFY(settingsAction); | 229 | QVERIFY(settingsAction); | ||
276 | 230 | | |||
277 | // WHEN | 231 | // WHEN | ||
278 | settingsAction->trigger(); | 232 | settingsAction->trigger(); | ||
279 | 233 | | |||
280 | // THEN | 234 | // THEN | ||
281 | QVERIFY(stubSourcesModel.settingsCalled); | 235 | QVERIFY(stubSourcesModel.settingsCalled); | ||
282 | } | 236 | } | ||
283 | | ||||
284 | void shouldListASourceWhenTheDelegateButtonIsClicked() | | |||
285 | { | | |||
286 | // GIVEN | | |||
287 | auto source = Domain::DataSource::Ptr::create(); | | |||
288 | | ||||
289 | QStringListModel model(QStringList() << QStringLiteral("A") << QStringLiteral("B") << QStringLiteral("C") ); | | |||
290 | AvailableSourcesModelStub stubPagesModel; | | |||
291 | stubPagesModel.setProperty("sourceListModel", QVariant::fromValue(static_cast<QAbstractItemModel*>(&model))); | | |||
292 | | ||||
293 | Widgets::AvailableSourcesView available; | | |||
294 | auto sourcesDelegate = available.findChild<Widgets::DataSourceDelegate*>(); | | |||
295 | QVERIFY(sourcesDelegate); | | |||
296 | available.setModel(&stubPagesModel); | | |||
297 | QTest::qWait(10); | | |||
298 | | ||||
299 | // WHEN | | |||
300 | QVERIFY(QMetaObject::invokeMethod(sourcesDelegate, "actionTriggered", | | |||
301 | Q_ARG(Domain::DataSource::Ptr, source), | | |||
302 | Q_ARG(int, Widgets::DataSourceDelegate::AddToList))); | | |||
303 | | ||||
304 | // THEN | | |||
305 | QCOMPARE(stubPagesModel.listedSources.size(), 1); | | |||
306 | QCOMPARE(stubPagesModel.listedSources.first(), source); | | |||
307 | } | | |||
308 | | ||||
309 | void shouldUnlistASourceWhenTheDelegateButtonIsClicked() | | |||
310 | { | | |||
311 | // GIVEN | | |||
312 | auto source = Domain::DataSource::Ptr::create(); | | |||
313 | | ||||
314 | QStringListModel model(QStringList() << QStringLiteral("A") << QStringLiteral("B") << QStringLiteral("C") ); | | |||
315 | AvailableSourcesModelStub stubPagesModel; | | |||
316 | stubPagesModel.setProperty("sourceListModel", QVariant::fromValue(static_cast<QAbstractItemModel*>(&model))); | | |||
317 | | ||||
318 | Widgets::AvailableSourcesView available; | | |||
319 | auto sourcesDelegate = available.findChild<Widgets::DataSourceDelegate*>(); | | |||
320 | QVERIFY(sourcesDelegate); | | |||
321 | available.setModel(&stubPagesModel); | | |||
322 | QTest::qWait(10); | | |||
323 | | ||||
324 | // WHEN | | |||
325 | QVERIFY(QMetaObject::invokeMethod(sourcesDelegate, "actionTriggered", | | |||
326 | Q_ARG(Domain::DataSource::Ptr, source), | | |||
327 | Q_ARG(int, Widgets::DataSourceDelegate::RemoveFromList))); | | |||
328 | | ||||
329 | // THEN | | |||
330 | QCOMPARE(stubPagesModel.unlistedSources.size(), 1); | | |||
331 | QCOMPARE(stubPagesModel.unlistedSources.first(), source); | | |||
332 | } | | |||
333 | | ||||
334 | void shouldBookmarkASourceWhenTheDelegateButtonIsClicked() | | |||
335 | { | | |||
336 | // GIVEN | | |||
337 | auto source = Domain::DataSource::Ptr::create(); | | |||
338 | | ||||
339 | QStringListModel model(QStringList() << QStringLiteral("A") << QStringLiteral("B") << QStringLiteral("C") ); | | |||
340 | AvailableSourcesModelStub stubPagesModel; | | |||
341 | stubPagesModel.setProperty("sourceListModel", QVariant::fromValue(static_cast<QAbstractItemModel*>(&model))); | | |||
342 | | ||||
343 | Widgets::AvailableSourcesView available; | | |||
344 | auto sourcesDelegate = available.findChild<Widgets::DataSourceDelegate*>(); | | |||
345 | QVERIFY(sourcesDelegate); | | |||
346 | available.setModel(&stubPagesModel); | | |||
347 | QTest::qWait(10); | | |||
348 | | ||||
349 | // WHEN | | |||
350 | QVERIFY(QMetaObject::invokeMethod(sourcesDelegate, "actionTriggered", | | |||
351 | Q_ARG(Domain::DataSource::Ptr, source), | | |||
352 | Q_ARG(int, Widgets::DataSourceDelegate::Bookmark))); | | |||
353 | | ||||
354 | // THEN | | |||
355 | QCOMPARE(stubPagesModel.bookmarkedSources.size(), 1); | | |||
356 | QCOMPARE(stubPagesModel.bookmarkedSources.first(), source); | | |||
357 | } | | |||
358 | | ||||
359 | void shouldSwitchToSearchListWhenASearchTermIsGiven() | | |||
360 | { | | |||
361 | // GIVEN | | |||
362 | QStringListModel sourceModel(QStringList() << QStringLiteral("A") << QStringLiteral("B") << QStringLiteral("C") ); | | |||
363 | QStringListModel searchModel(QStringList() << QStringLiteral("D") << QStringLiteral("E") << QStringLiteral("F") ); | | |||
364 | | ||||
365 | AvailableSourcesModelStub stubPagesModel; | | |||
366 | stubPagesModel.setProperty("sourceListModel", QVariant::fromValue(static_cast<QAbstractItemModel*>(&sourceModel))); | | |||
367 | stubPagesModel.setProperty("searchListModel", QVariant::fromValue(static_cast<QAbstractItemModel*>(&searchModel))); | | |||
368 | | ||||
369 | Widgets::AvailableSourcesView available; | | |||
370 | auto sourcesView = available.findChild<QTreeView*>(QStringLiteral("sourcesView")); | | |||
371 | QVERIFY(sourcesView); | | |||
372 | auto proxy = qobject_cast<QSortFilterProxyModel*>(sourcesView->model()); | | |||
373 | QVERIFY(proxy); | | |||
374 | available.setModel(&stubPagesModel); | | |||
375 | QCOMPARE(proxy->sourceModel(), &sourceModel); | | |||
376 | | ||||
377 | auto searchEdit = available.findChild<QLineEdit*>(QStringLiteral("searchEdit")); | | |||
378 | QVERIFY(searchEdit); | | |||
379 | | ||||
380 | // WHEN | | |||
381 | QTest::keyClick(searchEdit, 'm'); | | |||
382 | | ||||
383 | // THEN | | |||
384 | QCOMPARE(proxy->sourceModel(), &sourceModel); | | |||
385 | QVERIFY(stubPagesModel.searchTerm().isEmpty()); | | |||
386 | | ||||
387 | // WHEN | | |||
388 | QTest::keyClick(searchEdit, 'y'); | | |||
389 | | ||||
390 | // THEN | | |||
391 | QCOMPARE(proxy->sourceModel(), &sourceModel); | | |||
392 | QVERIFY(stubPagesModel.searchTerm().isEmpty()); | | |||
393 | | ||||
394 | // WHEN | | |||
395 | QTest::keyClick(searchEdit, ' '); | | |||
396 | | ||||
397 | // THEN | | |||
398 | QCOMPARE(proxy->sourceModel(), &searchModel); | | |||
399 | QCOMPARE(stubPagesModel.searchTerm(), QStringLiteral("my ")); | | |||
400 | | ||||
401 | // WHEN | | |||
402 | QTest::keyClicks(searchEdit, QStringLiteral("term")); | | |||
403 | | ||||
404 | // THEN | | |||
405 | QCOMPARE(proxy->sourceModel(), &searchModel); | | |||
406 | QCOMPARE(stubPagesModel.searchTerm(), QStringLiteral("my term")); | | |||
407 | | ||||
408 | // WHEN | | |||
409 | searchEdit->clear(); | | |||
410 | | ||||
411 | // THEN | | |||
412 | QCOMPARE(proxy->sourceModel(), &sourceModel); | | |||
413 | QVERIFY(stubPagesModel.searchTerm().isEmpty()); | | |||
414 | } | | |||
415 | }; | 237 | }; | ||
416 | 238 | | |||
417 | ZANSHIN_TEST_MAIN(AvailableSourcesViewTest) | 239 | ZANSHIN_TEST_MAIN(AvailableSourcesViewTest) | ||
418 | 240 | | |||
419 | #include "availablesourcesviewtest.moc" | 241 | #include "availablesourcesviewtest.moc" |