Merge lp:~stolowski/unity-scopes-shell/session-id into lp:unity-scopes-shell

Proposed by Paweł Stołowski
Status: Merged
Approved by: Pete Woods
Approved revision: 139
Merged at revision: 139
Proposed branch: lp:~stolowski/unity-scopes-shell/session-id
Merge into: lp:unity-scopes-shell
Prerequisite: lp:~stolowski/unity-scopes-shell/expandable-widget
Diff against target: 422 lines (+223/-4)
9 files modified
src/Unity/previewstack.cpp (+6/-1)
src/Unity/previewstack.h (+3/-1)
src/Unity/scope.cpp (+30/-1)
src/Unity/scope.h (+6/-0)
src/Unity/utils.cpp (+10/-0)
src/Unity/utils.h (+2/-0)
tests/data/mock-scope/mock-scope.cpp (+4/-1)
tests/previewtest.cpp (+1/-0)
tests/resultstest.cpp (+161/-0)
To merge this branch: bzr merge lp:~stolowski/unity-scopes-shell/session-id
Reviewer Review Type Date Requested Status
Marcus Tomlinson (community) Approve
PS Jenkins bot (community) continuous-integration Needs Fixing
Review via email: mp+233214@code.launchpad.net

Commit message

Generate session_id (uuid) and pass it with search and preview request via SearchMetadata / ActionMetadata hints.

Description of the change

Generate session_id (uuid) and pass it with search and preview request via SearchMetadata / ActionMetadata hints. This requires https://code.launchpad.net/~stolowski/unity-scopes-api/session-id/+merge/233210 ; i'm assuming it lands together with other changes in scopes API, so it depends on scopes api 0.6.5.

The session id is re-created whenever a new search query is entered; appending or removing characters from existing search query keeps current session id.

To post a comment you must log in.
Revision history for this message
PS Jenkins bot (ps-jenkins) wrote :
review: Needs Fixing (continuous-integration)
136. By Paweł Stołowski

Maintain and pass query_id.

Revision history for this message
PS Jenkins bot (ps-jenkins) wrote :
review: Needs Fixing (continuous-integration)
Revision history for this message
Marcus Tomlinson (marcustomlinson) wrote :

99 + // don't regenerate it if currenty query appends to previous query or removes

currenty -> currently

100 + // caharcters from previous query.

caharcters -> characters

101 + if (m_session_id.isNull() ||
102 + m_searchQuery.isEmpty() || search_query.isEmpty() ||
103 + !(m_searchQuery.startsWith(search_query) ||
104 + search_query.startsWith(m_searchQuery))) {

this is quite hard to read, and I think its wrong. Rather do something like this:

bool search_empty = m_searchQuery.isEmpty() || search_query.isEmpty();

bool updates_previous = m_searchQuery.startsWith(search_query) || search_query.startsWith(m_searchQuery);

if((m_session_id.isNull() || search_empty) && !updates_previous)

review: Needs Fixing
Revision history for this message
Marcus Tomlinson (marcustomlinson) wrote :

Also could we add a simple test for this?

137. By Paweł Stołowski

Refactored the conditional for re-creating session_id to be more readable.

138. By Paweł Stołowski

Added tests for session id in search metadata.

139. By Paweł Stołowski

Added test for passing session id with preview request.

Revision history for this message
Paweł Stołowski (stolowski) wrote :

> 99 + // don't regenerate it if currenty query appends to previous
> query or removes
>
> currenty -> currently
>
> 100 + // caharcters from previous query.
>
> caharcters -> characters
>
> 101 + if (m_session_id.isNull() ||
> 102 + m_searchQuery.isEmpty() || search_query.isEmpty() ||
> 103 + !(m_searchQuery.startsWith(search_query) ||
> 104 + search_query.startsWith(m_searchQuery))) {
>
> this is quite hard to read, and I think its wrong. Rather do something like
> this:
>
> bool search_empty = m_searchQuery.isEmpty() || search_query.isEmpty();
>
> bool updates_previous = m_searchQuery.startsWith(search_query) ||
> search_query.startsWith(m_searchQuery);
>
> if((m_session_id.isNull() || search_empty) && !updates_previous)

I think the logic in this conditional was correct though I agree it wasn't readable. The catch in it is that the startsWith check can only be made with non-empty strings (otherwise it yields true in cases where it shouldn't); I've refactored it a bit with helper variables.

Revision history for this message
Paweł Stołowski (stolowski) wrote :

> Also could we add a simple test for this?

Added.

Revision history for this message
PS Jenkins bot (ps-jenkins) wrote :
review: Needs Fixing (continuous-integration)
Revision history for this message
Marcus Tomlinson (marcustomlinson) wrote :

Looks good, thanks!

review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'src/Unity/previewstack.cpp'
--- src/Unity/previewstack.cpp 2014-07-18 17:10:39 +0000
+++ src/Unity/previewstack.cpp 2014-09-04 09:34:32 +0000
@@ -31,6 +31,7 @@
31#include <QJsonDocument>31#include <QJsonDocument>
32#include <QJsonObject>32#include <QJsonObject>
33#include <QJsonValue>33#include <QJsonValue>
34#include <QUuid>
3435
35#include <unity/scopes/ActionMetadata.h>36#include <unity/scopes/ActionMetadata.h>
36#include <unity/scopes/Scope.h>37#include <unity/scopes/Scope.h>
@@ -76,9 +77,10 @@
76 return false;77 return false;
77}78}
7879
79void PreviewStack::setAssociatedScope(scopes_ng::Scope* scope)80void PreviewStack::setAssociatedScope(scopes_ng::Scope* scope, QUuid const& session_id)
80{81{
81 m_associatedScope = scope;82 m_associatedScope = scope;
83 m_session_id = session_id;
82}84}
8385
84void PreviewStack::loadForResult(scopes::Result::SPtr const& result)86void PreviewStack::loadForResult(scopes::Result::SPtr const& result)
@@ -119,6 +121,9 @@
119 if (!extra_data.is_null()) {121 if (!extra_data.is_null()) {
120 metadata.set_scope_data(extra_data);122 metadata.set_scope_data(extra_data);
121 }123 }
124 if (!m_session_id.isNull()) {
125 metadata["session-id"] = uuidToString(m_session_id).toStdString();
126 }
122127
123 std::shared_ptr<PreviewDataReceiver> listener(new PreviewDataReceiver(m_activePreview));128 std::shared_ptr<PreviewDataReceiver> listener(new PreviewDataReceiver(m_activePreview));
124 std::weak_ptr<ScopeDataReceiverBase> wl(listener);129 std::weak_ptr<ScopeDataReceiverBase> wl(listener);
125130
=== modified file 'src/Unity/previewstack.h'
--- src/Unity/previewstack.h 2014-05-19 09:58:14 +0000
+++ src/Unity/previewstack.h 2014-09-04 09:34:32 +0000
@@ -28,6 +28,7 @@
28#include <QSharedPointer>28#include <QSharedPointer>
29#include <QMultiMap>29#include <QMultiMap>
30#include <QPointer>30#include <QPointer>
31#include <QUuid>
3132
32#include <unity/scopes/PreviewWidget.h>33#include <unity/scopes/PreviewWidget.h>
33#include <unity/scopes/Result.h>34#include <unity/scopes/Result.h>
@@ -59,7 +60,7 @@
5960
60 void setWidgetColumnCount(int columnCount) override;61 void setWidgetColumnCount(int columnCount) override;
61 int widgetColumnCount() const override;62 int widgetColumnCount() const override;
62 void setAssociatedScope(scopes_ng::Scope*);63 void setAssociatedScope(scopes_ng::Scope*, QUuid const&);
6364
64private Q_SLOTS:65private Q_SLOTS:
65 void widgetTriggered(QString const&, QString const&, QVariantMap const&);66 void widgetTriggered(QString const&, QString const&, QVariantMap const&);
@@ -79,6 +80,7 @@
79 std::shared_ptr<ScopeDataReceiverBase> m_lastActivation;80 std::shared_ptr<ScopeDataReceiverBase> m_lastActivation;
8081
81 unity::scopes::Result::SPtr m_previewedResult;82 unity::scopes::Result::SPtr m_previewedResult;
83 QUuid m_session_id;
82};84};
8385
84} // namespace scopes_ng86} // namespace scopes_ng
8587
=== modified file 'src/Unity/scope.cpp'
--- src/Unity/scope.cpp 2014-08-25 15:35:21 +0000
+++ src/Unity/scope.cpp 2014-09-04 09:34:32 +0000
@@ -54,6 +54,7 @@
54#include <unity/scopes/PreviewWidget.h>54#include <unity/scopes/PreviewWidget.h>
55#include <unity/scopes/SearchMetadata.h>55#include <unity/scopes/SearchMetadata.h>
56#include <unity/scopes/ActionMetadata.h>56#include <unity/scopes/ActionMetadata.h>
57#include <unity/scopes/Variant.h>
5758
58namespace scopes_ng59namespace scopes_ng
59{60{
@@ -67,6 +68,7 @@
67const int RESULTS_TTL_LARGE = 3600000; // 1 hour68const int RESULTS_TTL_LARGE = 3600000; // 1 hour
6869
69Scope::Scope(QObject *parent) : unity::shell::scopes::ScopeInterface(parent)70Scope::Scope(QObject *parent) : unity::shell::scopes::ScopeInterface(parent)
71 , m_query_id(0)
70 , m_formFactor("phone")72 , m_formFactor("phone")
71 , m_isActive(false)73 , m_isActive(false)
72 , m_searchInProgress(false)74 , m_searchInProgress(false)
@@ -625,6 +627,10 @@
625627
626 if (m_proxy) {628 if (m_proxy) {
627 scopes::SearchMetadata meta(QLocale::system().name().toStdString(), m_formFactor.toStdString());629 scopes::SearchMetadata meta(QLocale::system().name().toStdString(), m_formFactor.toStdString());
630 if (!m_session_id.isNull()) {
631 meta["session-id"] = uuidToString(m_session_id).toStdString();
632 }
633 meta["query-id"] = unity::scopes::Variant(m_query_id);
628 if (m_settings) {634 if (m_settings) {
629 QVariant remoteSearch(m_settings->get("remote-content-search"));635 QVariant remoteSearch(m_settings->get("remote-content-search"));
630 if (remoteSearch.toString() == QString("none")) {636 if (remoteSearch.toString() == QString("none")) {
@@ -940,6 +946,21 @@
940 */946 */
941947
942 if (m_searchQuery.isNull() || search_query != m_searchQuery) {948 if (m_searchQuery.isNull() || search_query != m_searchQuery) {
949 // regenerate session id uuid if previous or current search string is empty or
950 // if current and previous query have no common prefix;
951 // don't regenerate it if current query appends to previous query or removes
952 // characters from previous query.
953 bool search_empty = m_searchQuery.isEmpty() || search_query.isEmpty();
954
955 // only check for common prefix if search is not empty
956 bool common_prefix = (!search_empty) && (m_searchQuery.startsWith(search_query) || search_query.startsWith(m_searchQuery));
957
958 if (m_session_id.isNull() || search_empty || !common_prefix) {
959 m_session_id = QUuid::createUuid();
960 m_query_id = 0;
961 } else {
962 ++m_query_id;
963 }
943 m_searchQuery = search_query;964 m_searchQuery = search_query;
944965
945 // atm only empty query can have a filter state966 // atm only empty query can have a filter state
@@ -1049,7 +1070,7 @@
1049 }1070 }
10501071
1051 PreviewStack* stack = new PreviewStack(nullptr);1072 PreviewStack* stack = new PreviewStack(nullptr);
1052 stack->setAssociatedScope(this);1073 stack->setAssociatedScope(this, m_session_id);
1053 stack->loadForResult(result);1074 stack->loadForResult(result);
1054 return stack;1075 return stack;
1055}1076}
@@ -1084,6 +1105,14 @@
1084 return m_resultsDirty;1105 return m_resultsDirty;
1085}1106}
10861107
1108QString Scope::sessionId() const {
1109 return uuidToString(m_session_id);
1110}
1111
1112int Scope::queryId() const {
1113 return m_query_id;
1114}
1115
1087void Scope::activateUri(QString const& uri)1116void Scope::activateUri(QString const& uri)
1088{1117{
1089 /*1118 /*
10901119
=== modified file 'src/Unity/scope.h'
--- src/Unity/scope.h 2014-08-25 15:35:21 +0000
+++ src/Unity/scope.h 2014-09-04 09:34:32 +0000
@@ -31,6 +31,7 @@
31#include <QMultiMap>31#include <QMultiMap>
32#include <QSet>32#include <QSet>
33#include <QGSettings>33#include <QGSettings>
34#include <QUuid>
3435
35// scopes36// scopes
36#include <unity/scopes/ActivationResponse.h>37#include <unity/scopes/ActivationResponse.h>
@@ -159,6 +160,9 @@
159 bool resultsDirty() const;160 bool resultsDirty() const;
160 virtual unity::scopes::ScopeProxy proxy_for_result(unity::scopes::Result::SPtr const& result) const;161 virtual unity::scopes::ScopeProxy proxy_for_result(unity::scopes::Result::SPtr const& result) const;
161162
163 QString sessionId() const;
164 int queryId() const;
165
162public Q_SLOTS:166public Q_SLOTS:
163 void invalidateResults();167 void invalidateResults();
164168
@@ -198,6 +202,8 @@
198 static unity::scopes::Department::SCPtr findDepartmentById(unity::scopes::Department::SCPtr const& root, std::string const& id);202 static unity::scopes::Department::SCPtr findDepartmentById(unity::scopes::Department::SCPtr const& root, std::string const& id);
199 static unity::scopes::Department::SCPtr findUpdateNode(DepartmentNode* node, unity::scopes::Department::SCPtr const& scopeNode);203 static unity::scopes::Department::SCPtr findUpdateNode(DepartmentNode* node, unity::scopes::Department::SCPtr const& scopeNode);
200204
205 QUuid m_session_id;
206 int m_query_id;
201 QString m_searchQuery;207 QString m_searchQuery;
202 QString m_noResultsHint;208 QString m_noResultsHint;
203 QString m_formFactor;209 QString m_formFactor;
204210
=== modified file 'src/Unity/utils.cpp'
--- src/Unity/utils.cpp 2014-03-25 16:34:26 +0000
+++ src/Unity/utils.cpp 2014-09-04 09:34:32 +0000
@@ -123,4 +123,14 @@
123 }123 }
124}124}
125125
126Q_DECL_EXPORT QString uuidToString(QUuid const& uuid)
127{
128 // workaround: use mid to get rid of curly braces; see https://bugreports.qt-project.org/browse/QTBUG-885
129 auto const uuid_str = uuid.toString();
130 if (uuid_str.startsWith("{")) {
131 return uuid_str.mid(1, 36);
132 }
133 return uuid_str;
134}
135
126} // namespace scopes_ng136} // namespace scopes_ng
127137
=== modified file 'src/Unity/utils.h'
--- src/Unity/utils.h 2014-03-25 16:34:26 +0000
+++ src/Unity/utils.h 2014-09-04 09:34:32 +0000
@@ -22,6 +22,7 @@
2222
23// Qt23// Qt
24#include <QVariant>24#include <QVariant>
25#include <QUuid>
2526
26#include <unity/scopes/Variant.h>27#include <unity/scopes/Variant.h>
2728
@@ -31,6 +32,7 @@
31Q_DECL_EXPORT QVariant scopeVariantToQVariant(unity::scopes::Variant const& variant);32Q_DECL_EXPORT QVariant scopeVariantToQVariant(unity::scopes::Variant const& variant);
32Q_DECL_EXPORT unity::scopes::Variant qVariantToScopeVariant(QVariant const& variant);33Q_DECL_EXPORT unity::scopes::Variant qVariantToScopeVariant(QVariant const& variant);
33Q_DECL_EXPORT QVariant backgroundUriToVariant(QString const& uri);34Q_DECL_EXPORT QVariant backgroundUriToVariant(QString const& uri);
35Q_DECL_EXPORT QString uuidToString(QUuid const& uuid);
3436
35} // namespace scopes_ng37} // namespace scopes_ng
3638
3739
=== modified file 'tests/data/mock-scope/mock-scope.cpp'
--- tests/data/mock-scope/mock-scope.cpp 2014-09-04 09:34:32 +0000
+++ tests/data/mock-scope/mock-scope.cpp 2014-09-04 09:34:32 +0000
@@ -233,6 +233,8 @@
233 res.set_title("result for: \"" + query_ + "\"");233 res.set_title("result for: \"" + query_ + "\"");
234 res.set_art("art");234 res.set_art("art");
235 res.set_dnd_uri("test:dnd_uri");235 res.set_dnd_uri("test:dnd_uri");
236 res["session-id"] = search_metadata()["session-id"].get_string();
237 res["query-id"] = Variant(search_metadata()["query-id"].get_int());
236 res.set_intercept_activation();238 res.set_intercept_activation();
237 reply->push(res);239 reply->push(res);
238 }240 }
@@ -326,13 +328,14 @@
326 }328 }
327329
328 PreviewWidgetList widgets;330 PreviewWidgetList widgets;
329 PreviewWidget w1(R"({"id": "hdr", "type": "header", "components": {"title": "title", "subtitle": "uri", "attribute-1": "extra-data"}})");331 PreviewWidget w1(R"({"id": "hdr", "type": "header", "components": {"title": "title", "subtitle": "uri", "attribute-1": "extra-data", "session-id": "session-id-val"}})");
330 PreviewWidget w2(R"({"id": "img", "type": "image", "components": {"source": "art"}, "zoomable": false})");332 PreviewWidget w2(R"({"id": "img", "type": "image", "components": {"source": "art"}, "zoomable": false})");
331 widgets.push_back(w1);333 widgets.push_back(w1);
332 widgets.push_back(w2);334 widgets.push_back(w2);
333 reply->push(widgets);335 reply->push(widgets);
334336
335 reply->push("extra-data", Variant("foo"));337 reply->push("extra-data", Variant("foo"));
338 reply->push("session-id-val", Variant(action_metadata()["session-id"]));
336 }339 }
337340
338private:341private:
339342
=== modified file 'tests/previewtest.cpp'
--- tests/previewtest.cpp 2014-09-04 09:34:32 +0000
+++ tests/previewtest.cpp 2014-09-04 09:34:32 +0000
@@ -115,6 +115,7 @@
115 QCOMPARE(props[QString("title")].toString(), QString::fromStdString(result->title()));115 QCOMPARE(props[QString("title")].toString(), QString::fromStdString(result->title()));
116 QCOMPARE(props[QString("subtitle")].toString(), QString::fromStdString(result->uri()));116 QCOMPARE(props[QString("subtitle")].toString(), QString::fromStdString(result->uri()));
117 QCOMPARE(props[QString("attribute-1")].toString(), QString("foo"));117 QCOMPARE(props[QString("attribute-1")].toString(), QString("foo"));
118 QCOMPARE(props[QString("session-id")].toString(), m_scope->sessionId());
118119
119 idx = preview_widgets->index(1);120 idx = preview_widgets->index(1);
120 QCOMPARE(preview_widgets->data(idx, PreviewWidgetModel::RoleWidgetId).toString(), QString("img"));121 QCOMPARE(preview_widgets->data(idx, PreviewWidgetModel::RoleWidgetId).toString(), QString("img"));
121122
=== modified file 'tests/resultstest.cpp'
--- tests/resultstest.cpp 2014-08-26 13:47:35 +0000
+++ tests/resultstest.cpp 2014-09-04 09:34:32 +0000
@@ -260,6 +260,167 @@
260 QCOMPARE(results->data(idx, ResultsModel::Roles::RoleCategoryId), categories->data(categories->index(0), Categories::Roles::RoleCategoryId));260 QCOMPARE(results->data(idx, ResultsModel::Roles::RoleCategoryId), categories->data(categories->index(0), Categories::Roles::RoleCategoryId));
261 }261 }
262262
263 void testSessionId()
264 {
265 std::string lastSessionId;
266
267 performSearch(m_scope, QString(""));
268
269 QVERIFY(!m_scope->sessionId().isEmpty());
270 QCOMPARE(m_scope->queryId(), 0);
271
272 {
273 auto categories = m_scope->categories();
274 QVERIFY(categories->rowCount() > 0);
275 QVariant results_var = categories->data(categories->index(0), Categories::Roles::RoleResults);
276 auto results = results_var.value<ResultsModel*>();
277 QVERIFY(results->rowCount() > 0);
278
279 auto idx = results->index(0);
280 auto result = results->data(idx, ResultsModel::Roles::RoleResult).value<std::shared_ptr<unity::scopes::Result>>();
281
282 auto sessionId = (*result)["session-id"].get_string();
283 auto queryId = (*result)["query-id"].get_int();
284
285 // mock scope should send session-id and query-id it received back via custom result's values
286 QCOMPARE(sessionId, m_scope->sessionId().toStdString());
287 QCOMPARE(queryId, m_scope->queryId());
288 QCOMPARE(queryId, 0);
289
290 lastSessionId = sessionId;
291 }
292
293 // new search
294 performSearch(m_scope, QString("m"));
295 {
296 auto categories = m_scope->categories();
297 QVERIFY(categories->rowCount() > 0);
298 QVariant results_var = categories->data(categories->index(0), Categories::Roles::RoleResults);
299 auto results = results_var.value<ResultsModel*>();
300 QVERIFY(results->rowCount() > 0);
301
302 auto idx = results->index(0);
303 auto result = results->data(idx, ResultsModel::Roles::RoleResult).value<std::shared_ptr<unity::scopes::Result>>();
304
305 auto sessionId = (*result)["session-id"].get_string();
306 auto queryId = (*result)["query-id"].get_int();
307
308 // mock scope should send session-id and query-id it received back via custom result's values
309 QCOMPARE(sessionId, m_scope->sessionId().toStdString());
310 QCOMPARE(queryId, m_scope->queryId());
311 QCOMPARE(queryId, 0);
312
313 // new session id
314 QVERIFY(sessionId != lastSessionId);
315
316 lastSessionId = sessionId;
317 }
318
319 // appends to previous search
320 performSearch(m_scope, QString("met"));
321 {
322 auto categories = m_scope->categories();
323 QVERIFY(categories->rowCount() > 0);
324 QVariant results_var = categories->data(categories->index(0), Categories::Roles::RoleResults);
325 auto results = results_var.value<ResultsModel*>();
326 QVERIFY(results->rowCount() > 0);
327
328 auto idx = results->index(0);
329 auto result = results->data(idx, ResultsModel::Roles::RoleResult).value<std::shared_ptr<unity::scopes::Result>>();
330
331 auto sessionId = (*result)["session-id"].get_string();
332 auto queryId = (*result)["query-id"].get_int();
333
334 // mock scope should send session-id and query-id it received back via custom result's values
335 QCOMPARE(sessionId, m_scope->sessionId().toStdString());
336 QCOMPARE(queryId, m_scope->queryId());
337 QCOMPARE(queryId, 1);
338
339 // session id unchanged
340 QVERIFY(sessionId == lastSessionId);
341
342 lastSessionId = sessionId;
343 }
344
345 // removes characters from previous search
346 performSearch(m_scope, QString("me"));
347 {
348 auto categories = m_scope->categories();
349 QVERIFY(categories->rowCount() > 0);
350 QVariant results_var = categories->data(categories->index(0), Categories::Roles::RoleResults);
351 auto results = results_var.value<ResultsModel*>();
352 QVERIFY(results->rowCount() > 0);
353
354 auto idx = results->index(0);
355 auto result = results->data(idx, ResultsModel::Roles::RoleResult).value<std::shared_ptr<unity::scopes::Result>>();
356
357 auto sessionId = (*result)["session-id"].get_string();
358 auto queryId = (*result)["query-id"].get_int();
359
360 // mock scope should send session-id and query-id it received back via custom result's values
361 QCOMPARE(sessionId, m_scope->sessionId().toStdString());
362 QCOMPARE(queryId, m_scope->queryId());
363 QCOMPARE(queryId, 2);
364
365 // session id unchanged
366 QVERIFY(sessionId == lastSessionId);
367
368 lastSessionId = sessionId;
369 }
370
371 // new non-empty search again
372 performSearch(m_scope, QString("iron"));
373 {
374 auto categories = m_scope->categories();
375 QVERIFY(categories->rowCount() > 0);
376 QVariant results_var = categories->data(categories->index(0), Categories::Roles::RoleResults);
377 auto results = results_var.value<ResultsModel*>();
378 QVERIFY(results->rowCount() > 0);
379
380 auto idx = results->index(0);
381 auto result = results->data(idx, ResultsModel::Roles::RoleResult).value<std::shared_ptr<unity::scopes::Result>>();
382
383 auto sessionId = (*result)["session-id"].get_string();
384 auto queryId = (*result)["query-id"].get_int();
385
386 // mock scope should send session-id and query-id it received back via custom result's values
387 QCOMPARE(sessionId, m_scope->sessionId().toStdString());
388 QCOMPARE(queryId, m_scope->queryId());
389 QCOMPARE(queryId, 0);
390
391 // new session id
392 QVERIFY(sessionId != lastSessionId);
393
394 lastSessionId = sessionId;
395 }
396
397 // new empty search again
398 performSearch(m_scope, QString(""));
399 {
400 auto categories = m_scope->categories();
401 QVERIFY(categories->rowCount() > 0);
402 QVariant results_var = categories->data(categories->index(0), Categories::Roles::RoleResults);
403 auto results = results_var.value<ResultsModel*>();
404 QVERIFY(results->rowCount() > 0);
405
406 auto idx = results->index(0);
407 auto result = results->data(idx, ResultsModel::Roles::RoleResult).value<std::shared_ptr<unity::scopes::Result>>();
408
409 auto sessionId = (*result)["session-id"].get_string();
410 auto queryId = (*result)["query-id"].get_int();
411
412 // mock scope should send session-id and query-id it received back via custom result's values
413 QCOMPARE(sessionId, m_scope->sessionId().toStdString());
414 QCOMPARE(queryId, m_scope->queryId());
415 QCOMPARE(queryId, 0);
416
417 // new session id
418 QVERIFY(sessionId != lastSessionId);
419
420 lastSessionId = sessionId;
421 }
422 }
423
263 void testResultMetadata()424 void testResultMetadata()
264 {425 {
265 performSearch(m_scope, QString("metadata"));426 performSearch(m_scope, QString("metadata"));

Subscribers

People subscribed via source and target branches

to all changes: