summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBruno Wagner <bwagner@thoughtworks.com>2014-10-16 11:53:56 +0200
committerBruno Wagner <bwagner@thoughtworks.com>2014-10-16 11:53:56 +0200
commiteacd5fd5f7f47791ddc2e5568b8e4622420d8562 (patch)
treef303e7593c8eec8cc626b0df489b7e81128ca6dd
parent693957054255b1807ae9c09478a06e191114b7fb (diff)
#96 Mail searches are now paginated, the pages number start at 1 now
-rw-r--r--service/pixelated/adapter/search.py9
-rw-r--r--service/pixelated/controllers/mails_controller.py2
-rw-r--r--service/test/integration/search_test.py30
-rw-r--r--service/test/support/integration_helper.py4
-rw-r--r--web-ui/app/js/mail_list_actions/ui/pagination_trigger.js2
-rw-r--r--web-ui/app/js/services/mail_service.js8
-rw-r--r--web-ui/test/spec/mail_list_actions/ui/pagination_trigger.spec.js2
-rw-r--r--web-ui/test/spec/services/mail_service.spec.js18
8 files changed, 53 insertions, 22 deletions
diff --git a/service/pixelated/adapter/search.py b/service/pixelated/adapter/search.py
index 72e714e9..6b579d87 100644
--- a/service/pixelated/adapter/search.py
+++ b/service/pixelated/adapter/search.py
@@ -116,16 +116,17 @@ class SearchEngine(object):
results = searcher.search(query, **options)
return results
- def search(self, query):
- options = {'limit': 100}
+ def search(self, query, window, page):
+ page = int(page) if (page is not None and int(page) > 0) else 1
+ window = int(window) or 25
query = query.replace('\"', '')
query = query.replace('-in:', 'AND NOT tag:')
query = query.replace('in:all', '*')
with self._index.searcher() as searcher:
- query = QueryParser('body', self._index.schema).parse(query)
- results = searcher.search(query, **options)
+ query = QueryParser('raw', self._index.schema).parse(query)
+ results = searcher.search_page(query, page, pagelen=window)
return [mail['ident'] for mail in results]
def remove_from_index(self, mail_id):
diff --git a/service/pixelated/controllers/mails_controller.py b/service/pixelated/controllers/mails_controller.py
index 6765fc78..6bd2fe99 100644
--- a/service/pixelated/controllers/mails_controller.py
+++ b/service/pixelated/controllers/mails_controller.py
@@ -29,7 +29,7 @@ class MailsController:
self._search_engine = search_engine
def mails(self, _request=request):
- mail_ids = self._search_engine.search(_request.args.get('q'))
+ mail_ids = self._search_engine.search(_request.args.get('q'), _request.args.get('w'), _request.args.get('p'))
mails = self._mail_service.mails(mail_ids)
mails = sorted(mails, key=lambda mail: dateparser.parse(mail.date), reverse=True)
diff --git a/service/test/integration/search_test.py b/service/test/integration/search_test.py
index 7323866d..81d1fad2 100644
--- a/service/test/integration/search_test.py
+++ b/service/test/integration/search_test.py
@@ -58,3 +58,33 @@ class SearchTest(unittest.TestCase, SoledadTestBase):
all_tag_names = [t['name'] for t in all_tags]
self.assertEqual(1, len(all_tag_names))
self.assertTrue('sometag' in all_tag_names)
+
+ def test_search_mails_different_window(self):
+ input_mail = MailBuilder().build_input_mail()
+ input_mail2 = MailBuilder().build_input_mail()
+ self.add_mail_to_inbox(input_mail)
+ self.add_mail_to_inbox(input_mail2)
+
+ first_page = self.get_mails_by_tag('inbox', page=1, window=1)
+
+ self.assertEqual(len(first_page), 1)
+
+ def test_search_mails_with_multiple_pages(self):
+ input_mail = MailBuilder().build_input_mail()
+ input_mail2 = MailBuilder().build_input_mail()
+ self.add_mail_to_inbox(input_mail)
+ self.add_mail_to_inbox(input_mail2)
+
+ first_page = self.get_mails_by_tag('inbox', page=1, window=1)
+ second_page = self.get_mails_by_tag('inbox', page=2, window=1)
+
+ idents = [input_mail.ident, input_mail2.ident]
+
+ self.assertIn(first_page[0].ident, idents)
+ self.assertIn(second_page[0].ident, idents)
+
+ def test_page_zero_fetches_first_page(self):
+ input_mail = MailBuilder().build_input_mail()
+ self.add_mail_to_inbox(input_mail)
+ page = self.get_mails_by_tag('inbox', page=0, window=1)
+ self.assertEqual(page[0].ident, input_mail.ident)
diff --git a/service/test/support/integration_helper.py b/service/test/support/integration_helper.py
index 268eb812..f0f3b02a 100644
--- a/service/test/support/integration_helper.py
+++ b/service/test/support/integration_helper.py
@@ -173,8 +173,8 @@ class SoledadTestBase:
app_factory._setup_routes(self.client.application, home_controller, mails_controller, tags_controller,
features_controller)
- def get_mails_by_tag(self, tag):
- response = json.loads(self.client.get("/mails?q=tag:" + tag).data)
+ def get_mails_by_tag(self, tag, page=1, window=100):
+ response = json.loads(self.client.get("/mails?q=tag:%s&w=%s&p=%s" % (tag, window, page)).data)
return [ResponseMail(m) for m in response['mails']]
def post_mail(self, data):
diff --git a/web-ui/app/js/mail_list_actions/ui/pagination_trigger.js b/web-ui/app/js/mail_list_actions/ui/pagination_trigger.js
index f9d531a4..3bc13d40 100644
--- a/web-ui/app/js/mail_list_actions/ui/pagination_trigger.js
+++ b/web-ui/app/js/mail_list_actions/ui/pagination_trigger.js
@@ -46,7 +46,7 @@ define(
};
this.updatePageDisplay = function(event, data) {
- this.renderWithPageNumber(data.currentPage + 1);
+ this.renderWithPageNumber(data.currentPage);
};
this.previousPage = function(event) {
diff --git a/web-ui/app/js/services/mail_service.js b/web-ui/app/js/services/mail_service.js
index 2e877a2c..b773bd8b 100644
--- a/web-ui/app/js/services/mail_service.js
+++ b/web-ui/app/js/services/mail_service.js
@@ -38,8 +38,8 @@ define(
singleMailResource: '/mail',
currentTag: '',
lastQuery: '',
- currentPage: 0,
- numPages: 0,
+ currentPage: 1,
+ numPages: 1,
w: 25
});
@@ -150,7 +150,7 @@ define(
this.fetchByTag = function (ev, data) {
this.attr.currentTag = data.tag;
- this.updateCurrentPageNumber(0);
+ this.updateCurrentPageNumber(1);
this.fetchMail(compileQuery(data), this.attr.currentTag, false, data);
};
@@ -223,7 +223,7 @@ define(
};
this.previousPage = function () {
- if (this.attr.currentPage > 0) {
+ if (this.attr.currentPage > 1) {
this.updateCurrentPageNumber(this.attr.currentPage - 1);
this.refreshResults();
}
diff --git a/web-ui/test/spec/mail_list_actions/ui/pagination_trigger.spec.js b/web-ui/test/spec/mail_list_actions/ui/pagination_trigger.spec.js
index bf47794a..d23c2839 100644
--- a/web-ui/test/spec/mail_list_actions/ui/pagination_trigger.spec.js
+++ b/web-ui/test/spec/mail_list_actions/ui/pagination_trigger.spec.js
@@ -21,6 +21,6 @@ describeComponent('mail_list_actions/ui/pagination_trigger', function () {
it('re-renders with current page number when page changes', function () {
this.component.trigger(document, Pixelated.events.ui.page.changed, {currentPage: 0});
- expect(this.component.select('currentPage').text()).toBe('1');
+ expect(this.component.select('currentPage').text()).toBe('0');
});
});
diff --git a/web-ui/test/spec/services/mail_service.spec.js b/web-ui/test/spec/services/mail_service.spec.js
index bce54857..85680cb6 100644
--- a/web-ui/test/spec/services/mail_service.spec.js
+++ b/web-ui/test/spec/services/mail_service.spec.js
@@ -210,21 +210,21 @@ describeComponent('services/mail_service', function () {
});
it('changes to the previous page and refetch email when ui:page:previous is fired', function() {
- this.component.attr.currentPage = 1;
+ this.component.attr.currentPage = 2;
this.component.trigger(Pixelated.events.ui.page.previous);
expect(this.component.fetchMail).toHaveBeenCalled();
- expect(this.component.attr.currentPage).toEqual(0);
+ expect(this.component.attr.currentPage).toEqual(1);
});
it('won\'t change the page if it was already at the first page and trying to go to previous', function() {
- this.component.attr.currentPage = 0;
+ this.component.attr.currentPage = 1;
this.component.trigger(Pixelated.events.ui.page.previous);
expect(this.component.fetchMail).not.toHaveBeenCalled();
- expect(this.component.attr.currentPage).toEqual(0);
+ expect(this.component.attr.currentPage).toEqual(1);
});
it('changes to the next page and refetch email when ui:page:next is fired', function() {
@@ -252,15 +252,15 @@ describeComponent('services/mail_service', function () {
this.component.attr.numPages = 10;
this.component.trigger(Pixelated.events.ui.page.next);
- expect(pageChangedEvent).toHaveBeenTriggeredOnAndWith(document, {currentPage: 1, numPages: 10});
+ expect(pageChangedEvent).toHaveBeenTriggeredOnAndWith(document, {currentPage: 2, numPages: 10});
});
it('triggers pageChanged event when going to previous page', function() {
this.component.attr.numPages = 10;
- this.component.attr.currentPage = 1;
+ this.component.attr.currentPage = 2;
this.component.trigger(Pixelated.events.ui.page.previous);
- expect(pageChangedEvent).toHaveBeenTriggeredOnAndWith(document, {currentPage: 0, numPages: 10});
+ expect(pageChangedEvent).toHaveBeenTriggeredOnAndWith(document, {currentPage: 1, numPages: 10});
});
it('resets currentPage when fetching mails by tag', function() {
@@ -268,8 +268,8 @@ describeComponent('services/mail_service', function () {
this.component.attr.currentPage = 999;
this.component.trigger(Pixelated.events.ui.mails.fetchByTag, {tag: 'inbox'});
- expect(this.component.attr.currentPage).toEqual(0);
- expect(pageChangedEvent).toHaveBeenTriggeredOnAndWith(document, {currentPage: 0, numPages: 10});
+ expect(this.component.attr.currentPage).toEqual(1);
+ expect(pageChangedEvent).toHaveBeenTriggeredOnAndWith(document, {currentPage: 1, numPages: 10});
});
describe('total page numbers', function() {