diff --git a/invenio_circulation/api.py b/invenio_circulation/api.py index 3055c50..e89b5b4 100644 --- a/invenio_circulation/api.py +++ b/invenio_circulation/api.py @@ -40,7 +40,7 @@ from sqlalchemy.dialects.postgresql import JSONB from sqlalchemy_continuum import version_class -from invenio_circulation.models import ItemStatus +from .models import ItemStatus def check_status(method=None, statuses=None): diff --git a/invenio_circulation/bundles.py b/invenio_circulation/bundles.py index 898edd7..4a53c22 100644 --- a/invenio_circulation/bundles.py +++ b/invenio_circulation/bundles.py @@ -39,16 +39,15 @@ 'node_modules/angular/angular.js', 'node_modules/invenio-search-js/dist/invenio-search-js.js', 'node_modules/angular-ui-bootstrap/dist/ui-bootstrap.js', - 'js/circulation/app.js', - 'js/circulation/circulationItemBasket.js', - 'js/circulation/directives/circulationUserSearch.js', - 'js/circulation/directives/circulationAddItem.js', - 'js/circulation/directives/circulationItemBasket.js', - 'js/circulation/factories/circulationItemStore.js', - 'js/circulation/factories/circulationUserStore.js', - 'js/circulation/circulationSettings.js', - 'js/circulation/directives/circulationSettings.js', - 'js/circulation/factories/circulationSettingsStore.js', + 'js/circulation/circulation_admin/circulation_app.js', + 'js/circulation/circulation_admin/circulation.js', + 'js/circulation/circulation_admin/directives/circulationUserSearch.js', + 'js/circulation/circulation_admin/directives/circulationAddItem.js', + 'js/circulation/circulation_admin/directives/circulationItemBasket.js', + 'js/circulation/circulation_admin/directives/circulationSettings.js', + 'js/circulation/circulation_admin/factories/circulationUserStore.js', + 'js/circulation/circulation_admin/factories/circulationItemStore.js', + 'js/circulation/circulation_admin/factories/circulationSettingsStore.js', filters='requirejs', output='gen/circulation.%(version)s.js', npm={ @@ -61,10 +60,10 @@ user_hub_js = NpmBundle( 'node_modules/almond/almond.js', - 'js/circulation/user_hub_app.js', - 'js/circulation/circulationUserHub.js', - 'js/circulation/factories/circulationUserHoldingsStore.js', - 'js/circulation/directives/circulationUserHoldings.js', + 'js/circulation/user_hub/user_hub_app.js', + 'js/circulation/user_hub/circulationUserHub.js', + 'js/circulation/user_hub/factories/circulationUserHoldingsStore.js', + 'js/circulation/user_hub/directives/circulationUserHoldings.js', filters='requirejs', output='gen/circulation_user_hub.%(version)s.js', npm={ diff --git a/invenio_circulation/config.py b/invenio_circulation/config.py index 140ad94..54e285c 100644 --- a/invenio_circulation/config.py +++ b/invenio_circulation/config.py @@ -51,6 +51,27 @@ 'item_route': '/circulation/items/', 'default_media_type': 'application/json', 'max_result_window': 10000, + }, + 'crcitmrev': { + 'pid_type': 'crcitm', + 'pid_minter': 'circulation_item', + 'pid_fetcher': 'circulation_item', + 'record_class': 'invenio_circulation.api:Item', + 'record_serializers': { + 'application/json': ('invenio_records_rest.serializers' + ':json_v1_response'), + }, + 'search_class': 'invenio_circulation.search:ItemRevisionSearch', + 'search_index': None, + 'search_type': None, + 'search_serializers': { + 'application/json': ('invenio_circulation.serializers' + ':revision_serializer'), + }, + 'list_route': '/circulation/item_revisions/', + 'item_route': '/circulation/item_revisions/', + 'default_media_type': 'application/json', + 'max_result_window': 10000, } } """Basic REST circulation configuration.""" diff --git a/invenio_circulation/search.py b/invenio_circulation/search.py index a550d0a..eafea76 100644 --- a/invenio_circulation/search.py +++ b/invenio_circulation/search.py @@ -23,9 +23,12 @@ # as an Intergovernmental Organization or submit itself to any jurisdiction. """Configuration for circulation search.""" +from elasticsearch_dsl.query import Bool, MultiMatch, Range from invenio_search import RecordsSearch +from .api import Item + class ItemSearch(RecordsSearch): """Default search class.""" @@ -35,3 +38,79 @@ class Meta: index = 'circulation-item' doc_types = None + + +class ItemRevisionSearch(object): + """Search class utilizing `Item.find_by_holding`. + + Since this function doesn't utilize elasticsearch, ItemRevisionSearch + has to mimick certain aspects of `elasticsearch_dsl.Search`. + """ + + class Meta: + """Configuration for circulation search.""" + + index = 'circulation-item' + doc_types = None + + class Results(object): + """Substitution of `elasticsearch_dsl.result.Result.""" + + class Hits(object): + """Wrapper class for the search hits.""" + + def __init__(self, results): + """Constructor to wrap the search results.""" + self.hits = self.Hits() + self.hits.total = len(results) + self.results = results + + def to_dict(self): + """Convert results into a dictionary.""" + return { + 'hits': { + 'hits': self.results, + 'total': self.hits.total + } + } + + def __init__(self): + """Constructor for `elasticsearch_dsl.result.Result substituion. + + Adds dummy `_index` value. + """ + self._index = [''] + self._query = {} + + def query(self, q, *args, **kwargs): + """Set the desired query.""" + if type(q) is not Bool: + q = Bool(must=[q]) + for must in q.must: + if type(must) == MultiMatch: + for field in must.fields: + self._query[field] = must.query + elif type(must) == Range: + for key, value in must._params.items(): + self._query[key] = [value['gte'], value['lte']] + return self + + def __getitem__(self, *args, **kwargs): + """Support slicing of the search results. Currently not implemented.""" + return self + + def params(self, *args, **kwargs): + """Specify query params to be used. Currently not implemented.""" + return self + + def execute(self): + """Execute the search. + + :returns: ItemRevisionSearch.Results + """ + res = [] + for uuid, revision in Item.find_by_holding(**self._query): + item = Item.get_record(uuid) + res.append(item.revisions[revision-2]) + + return self.Results(res) diff --git a/invenio_circulation/serializers.py b/invenio_circulation/serializers.py new file mode 100644 index 0000000..5faba28 --- /dev/null +++ b/invenio_circulation/serializers.py @@ -0,0 +1,54 @@ +# -*- coding: utf-8 -*- +# +# This file is part of Invenio. +# Copyright (C) 2016 CERN. +# +# Invenio is free software; you can redistribute it +# and/or modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation; either version 2 of the +# License, or (at your option) any later version. +# +# Invenio is distributed in the hope that it will be +# useful, but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with Invenio; if not, write to the +# Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, +# MA 02111-1307, USA. +# +# In applying this license, CERN does not +# waive the privileges and immunities granted to it by virtue of its status +# as an Intergovernmental Organization or submit itself to any jurisdiction. + +"""Serializers for circulation search.""" +import json + +from invenio_records_rest.serializers import JSONSerializer +from invenio_records_rest.serializers.response import search_responsify +from invenio_records_rest.serializers.schemas.json import RecordSchemaJSONV1 + + +class RevisionSerializer(JSONSerializer): + """JSON serializer for items found by `Item.find_by_holding`.""" + + def serialize_search(self, pid_fetcher, search_result, links=None, + item_links_factory=None): + """Serialize a search result. + + :param search_result: Elasticsearch search result. + :param links: Dictionary of links to add to response. + """ + return json.dumps({ + 'hits': { + 'hits': [hit for hit in search_result['hits']['hits']], + 'total': search_result['hits']['total'], + }, + 'links': links or {}, + 'aggregations': search_result.get('aggregations', {}), + }, **self._format_args()) + + +revision_serializer = search_responsify(RevisionSerializer(RecordSchemaJSONV1), + 'application/json') diff --git a/invenio_circulation/static/js/circulation/circulationItemBasket.js b/invenio_circulation/static/js/circulation/circulationItemBasket.js deleted file mode 100644 index 05b5f08..0000000 --- a/invenio_circulation/static/js/circulation/circulationItemBasket.js +++ /dev/null @@ -1,28 +0,0 @@ -/* - * This file is part of invenio. - * Copyright (C) 2016 CERN. - * - * invenio is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * invenio is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with invenio; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. - * - * In applying this license, CERN does not - * waive the privileges and immunities granted to it by virtue of its status - * as an Intergovernmental Organization or submit itself to any jurisdiction. - */ - - -(function (angular) { - angular.module('circulationItemBasket', - ['circulationUserSearch', 'circulationSettings']); -})(angular); diff --git a/invenio_circulation/static/js/circulation/circulationUserSearch.js b/invenio_circulation/static/js/circulation/circulationUserSearch.js deleted file mode 100644 index 60e94c8..0000000 --- a/invenio_circulation/static/js/circulation/circulationUserSearch.js +++ /dev/null @@ -1,27 +0,0 @@ -/* - * This file is part of invenio. - * Copyright (C) 2016 CERN. - * - * invenio is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * invenio is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with invenio; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. - * - * In applying this license, CERN does not - * waive the privileges and immunities granted to it by virtue of its status - * as an Intergovernmental Organization or submit itself to any jurisdiction. - */ - - -(function (angular) { - angular.module('circulationUserSearch', ['ui.bootstrap']); -})(angular); diff --git a/invenio_circulation/static/js/circulation/circulationSettings.js b/invenio_circulation/static/js/circulation/circulation_admin/circulation.js similarity index 95% rename from invenio_circulation/static/js/circulation/circulationSettings.js rename to invenio_circulation/static/js/circulation/circulation_admin/circulation.js index 5c1bee0..8303be4 100644 --- a/invenio_circulation/static/js/circulation/circulationSettings.js +++ b/invenio_circulation/static/js/circulation/circulation_admin/circulation.js @@ -23,5 +23,5 @@ (function (angular) { - angular.module('circulationSettings', []); + angular.module('circulation', ['ui.bootstrap']); })(angular); diff --git a/invenio_circulation/static/js/circulation/app.js b/invenio_circulation/static/js/circulation/circulation_admin/circulation_app.js similarity index 84% rename from invenio_circulation/static/js/circulation/app.js rename to invenio_circulation/static/js/circulation/circulation_admin/circulation_app.js index 43708a3..8cd7931 100644 --- a/invenio_circulation/static/js/circulation/app.js +++ b/invenio_circulation/static/js/circulation/circulation_admin/circulation_app.js @@ -25,16 +25,13 @@ require([ 'node_modules/angular/angular.js', 'node_modules/invenio-search-js/dist/invenio-search-js', - 'js/circulation/circulationUserSearch', - 'js/circulation/circulationItemBasket', - 'js/circulation/circulationSettings', + 'js/circulation/circulation_admin/circulation', ], function() { // When the DOM is ready bootstrap the `invenio-search-js` angular.element(document).ready(function() { angular.bootstrap( document.getElementById("invenio-search"), [ - 'invenioSearch', 'circulationUserSearch', 'circulationItemBasket', - 'circulationSettings' + 'invenioSearch', 'circulation', ] ); }); diff --git a/invenio_circulation/static/js/circulation/directives/circulationAddItem.js b/invenio_circulation/static/js/circulation/circulation_admin/directives/circulationAddItem.js similarity index 94% rename from invenio_circulation/static/js/circulation/directives/circulationAddItem.js rename to invenio_circulation/static/js/circulation/circulation_admin/directives/circulationAddItem.js index b8eba9e..cc18a61 100644 --- a/invenio_circulation/static/js/circulation/directives/circulationAddItem.js +++ b/invenio_circulation/static/js/circulation/circulation_admin/directives/circulationAddItem.js @@ -25,7 +25,7 @@ (function (angular) { // Setup angular - .module('circulationItemBasket') + .module('circulation') .directive('circulationAddItem', circulationAddItem); circulationAddItem.$inject = ['circulationItemStore']; @@ -42,7 +42,9 @@ return directive; function link(scope, element, attributes) { - scope.click = function() { + scope.addItem = addItem; + + function addItem() { circulationItemStore.items.push(scope.item); } } diff --git a/invenio_circulation/static/js/circulation/directives/circulationItemBasket.js b/invenio_circulation/static/js/circulation/circulation_admin/directives/circulationItemBasket.js similarity index 90% rename from invenio_circulation/static/js/circulation/directives/circulationItemBasket.js rename to invenio_circulation/static/js/circulation/circulation_admin/directives/circulationItemBasket.js index 7d5355a..dff59b2 100644 --- a/invenio_circulation/static/js/circulation/directives/circulationItemBasket.js +++ b/invenio_circulation/static/js/circulation/circulation_admin/directives/circulationItemBasket.js @@ -25,7 +25,7 @@ (function (angular) { // Setup angular - .module('circulationItemBasket') + .module('circulation') .directive('circulationItemBasket', circulationItemBasket); circulationItemBasket.$inject = [ @@ -51,22 +51,30 @@ function link(scope, element, attributes) { scope.items = circulationItemStore.items; - scope.remove = function(index) { + scope.remove = remove; + scope.loan = loan; + scope.request = request; + scope.return = returnItem; + + function remove(index) { circulationItemStore.items.splice(index, 1); } - scope.loan = function() { + + function loan() { var data = { 'user_id': circulationUserStore.user.id, }; performAction(attributes.loanEndpoint, data); } - scope.request = function() { + + function request() { var data = { 'user_id': circulationUserStore.user.id, }; performAction(attributes.requestEndpoint, data); } - scope.return = function() { + + function returnItem() { var data = {}; performAction(attributes.returnEndpoint, data); } diff --git a/invenio_circulation/static/js/circulation/directives/circulationSettings.js b/invenio_circulation/static/js/circulation/circulation_admin/directives/circulationSettings.js similarity index 97% rename from invenio_circulation/static/js/circulation/directives/circulationSettings.js rename to invenio_circulation/static/js/circulation/circulation_admin/directives/circulationSettings.js index 39d862a..fab13f6 100644 --- a/invenio_circulation/static/js/circulation/directives/circulationSettings.js +++ b/invenio_circulation/static/js/circulation/circulation_admin/directives/circulationSettings.js @@ -25,7 +25,7 @@ (function (angular) { // Setup angular - .module('circulationSettings') + .module('circulation') .directive('circulationSettings', circulationSettings); circulationSettings.$inject = ['circulationSettingsStore']; diff --git a/invenio_circulation/static/js/circulation/directives/circulationUserSearch.js b/invenio_circulation/static/js/circulation/circulation_admin/directives/circulationUserSearch.js similarity index 92% rename from invenio_circulation/static/js/circulation/directives/circulationUserSearch.js rename to invenio_circulation/static/js/circulation/circulation_admin/directives/circulationUserSearch.js index 480676f..c0b5d12 100644 --- a/invenio_circulation/static/js/circulation/directives/circulationUserSearch.js +++ b/invenio_circulation/static/js/circulation/circulation_admin/directives/circulationUserSearch.js @@ -25,7 +25,7 @@ (function (angular) { // Setup angular - .module('circulationUserSearch') + .module('circulation') .directive('circulationUserSearch', circulationUserSearch); circulationUserSearch.$inject = ['$http', 'circulationUserStore'] @@ -42,7 +42,10 @@ return directive; function link(scope, element, attributes) { - scope.getUser = function(query) { + scope.getUser = getUser; + scope.onSelect = onSelect; + + function getUser(query) { return $http({ method: 'GET', url: scope.userSearchEndpoint, @@ -54,7 +57,7 @@ }); } - scope.onSelect = function(user) { + function onSelect(user) { scope.selected = user.email; circulationUserStore.user = user; } diff --git a/invenio_circulation/static/js/circulation/factories/circulationItemStore.js b/invenio_circulation/static/js/circulation/circulation_admin/factories/circulationItemStore.js similarity index 97% rename from invenio_circulation/static/js/circulation/factories/circulationItemStore.js rename to invenio_circulation/static/js/circulation/circulation_admin/factories/circulationItemStore.js index 9b80730..c0b876b 100644 --- a/invenio_circulation/static/js/circulation/factories/circulationItemStore.js +++ b/invenio_circulation/static/js/circulation/circulation_admin/factories/circulationItemStore.js @@ -25,7 +25,7 @@ (function (angular) { // Setup angular - .module('circulationItemBasket') + .module('circulation') .factory('circulationItemStore', circulationItemStore); function circulationItemStore() { diff --git a/invenio_circulation/static/js/circulation/factories/circulationSettingsStore.js b/invenio_circulation/static/js/circulation/circulation_admin/factories/circulationSettingsStore.js similarity index 98% rename from invenio_circulation/static/js/circulation/factories/circulationSettingsStore.js rename to invenio_circulation/static/js/circulation/circulation_admin/factories/circulationSettingsStore.js index 48cd6e6..53ee3c1 100644 --- a/invenio_circulation/static/js/circulation/factories/circulationSettingsStore.js +++ b/invenio_circulation/static/js/circulation/circulation_admin/factories/circulationSettingsStore.js @@ -25,7 +25,7 @@ (function (angular) { // Setup angular - .module('circulationSettings') + .module('circulation') .factory('circulationSettingsStore', circulationSettingsStore); function circulationSettingsStore() { diff --git a/invenio_circulation/static/js/circulation/factories/circulationUserStore.js b/invenio_circulation/static/js/circulation/circulation_admin/factories/circulationUserStore.js similarity index 97% rename from invenio_circulation/static/js/circulation/factories/circulationUserStore.js rename to invenio_circulation/static/js/circulation/circulation_admin/factories/circulationUserStore.js index 7659a4e..a3e2188 100644 --- a/invenio_circulation/static/js/circulation/factories/circulationUserStore.js +++ b/invenio_circulation/static/js/circulation/circulation_admin/factories/circulationUserStore.js @@ -25,7 +25,7 @@ (function (angular) { // Setup angular - .module('circulationUserSearch') + .module('circulation') .factory('circulationUserStore', circulationUserStore); function circulationUserStore() { diff --git a/invenio_circulation/static/js/circulation/circulationUserHub.js b/invenio_circulation/static/js/circulation/user_hub/circulationUserHub.js similarity index 100% rename from invenio_circulation/static/js/circulation/circulationUserHub.js rename to invenio_circulation/static/js/circulation/user_hub/circulationUserHub.js diff --git a/invenio_circulation/static/js/circulation/directives/circulationUserHoldings.js b/invenio_circulation/static/js/circulation/user_hub/directives/circulationUserHoldings.js similarity index 94% rename from invenio_circulation/static/js/circulation/directives/circulationUserHoldings.js rename to invenio_circulation/static/js/circulation/user_hub/directives/circulationUserHoldings.js index fef3436..95b7602 100644 --- a/invenio_circulation/static/js/circulation/directives/circulationUserHoldings.js +++ b/invenio_circulation/static/js/circulation/user_hub/directives/circulationUserHoldings.js @@ -41,6 +41,9 @@ function link(scope, element, attributes) { scope.requestedEndDate = '', + scope.extend = extend; + scope.lose = lose; + scope.cancel = cancel; $http({ method: 'GET', @@ -56,7 +59,7 @@ scope.requests = circulationUserHoldingsStore.requests; }); - scope.extend = function(itemId) { + function extend(itemId) { var data = { item_id: itemId, }; @@ -76,7 +79,7 @@ }; - scope.lose = function(itemId) { + function lose(itemId) { $http({ method: 'POST', url: attributes.loseEndpoint, @@ -90,7 +93,7 @@ }); }; - scope.cancel = function(itemId, holdId) { + function cancel(itemId, holdId) { $http({ method: 'POST', url: attributes.cancelEndpoint, diff --git a/invenio_circulation/static/js/circulation/factories/circulationUserHoldingsStore.js b/invenio_circulation/static/js/circulation/user_hub/factories/circulationUserHoldingsStore.js similarity index 100% rename from invenio_circulation/static/js/circulation/factories/circulationUserHoldingsStore.js rename to invenio_circulation/static/js/circulation/user_hub/factories/circulationUserHoldingsStore.js diff --git a/invenio_circulation/static/js/circulation/user_hub_app.js b/invenio_circulation/static/js/circulation/user_hub/user_hub_app.js similarity index 96% rename from invenio_circulation/static/js/circulation/user_hub_app.js rename to invenio_circulation/static/js/circulation/user_hub/user_hub_app.js index 4d7c03a..173fe5f 100644 --- a/invenio_circulation/static/js/circulation/user_hub_app.js +++ b/invenio_circulation/static/js/circulation/user_hub/user_hub_app.js @@ -24,7 +24,7 @@ require([ 'node_modules/angular/angular', - 'js/circulation/circulationUserHub', + 'js/circulation/user_hub/circulationUserHub', ], function() { angular.element(document).ready(function() { angular.bootstrap( diff --git a/invenio_circulation/static/templates/invenio_circulation/circulation-add-item.html b/invenio_circulation/static/templates/invenio_circulation/circulation-add-item.html index 687dce5..484972e 100644 --- a/invenio_circulation/static/templates/invenio_circulation/circulation-add-item.html +++ b/invenio_circulation/static/templates/invenio_circulation/circulation-add-item.html @@ -1 +1 @@ - + diff --git a/tests/test_examples_app.py b/tests/test_examples_app.py index b53d7b7..bf75bb9 100644 --- a/tests/test_examples_app.py +++ b/tests/test_examples_app.py @@ -83,3 +83,10 @@ def test_example_app(example_app): subprocess.check_output(cmd, shell=True).decode('utf-8') ) assert len(output['hits']['hits']) > 0 + + # item revision search API + cmd = 'curl http://localhost:5000/api/circulation/item_revisions/' + output = json.loads( + subprocess.check_output(cmd, shell=True).decode('utf-8') + ) + assert output and 'hits' in output and 'hits' in output['hits'] diff --git a/tests/test_search_revision.py b/tests/test_search_revision.py new file mode 100644 index 0000000..ca2b961 --- /dev/null +++ b/tests/test_search_revision.py @@ -0,0 +1,120 @@ +# -*- coding: utf-8 -*- +# +# This file is part of Invenio. +# Copyright (C) 2016 CERN. +# +# Invenio is free software; you can redistribute it +# and/or modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation; either version 2 of the +# License, or (at your option) any later version. +# +# Invenio is distributed in the hope that it will be +# useful, but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with Invenio; if not, write to the +# Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, +# MA 02111-1307, USA. +# +# In applying this license, CERN does not +# waive the privileges and immunities granted to it by virtue of its status +# as an Intergovernmental Organization or submit itself to any jurisdiction. + + +"""Revision search tests.""" + +import datetime +import json + +import pytest +from elasticsearch_dsl.query import Bool, MultiMatch, Range + +from invenio_circulation.api import Item, ItemStatus, Location +from invenio_circulation.search import ItemRevisionSearch +from invenio_circulation.validators import LoanItemSchema + + +def test_item_revision_search_result(): + search_result = ['result1', 'result2'] + result = ItemRevisionSearch.Results(search_result) + + assert result.hits.total == len(search_result) + assert result.results == search_result + assert result.to_dict() == { + 'hits': { + 'hits': search_result, + 'total': len(search_result) + } + } + + +def test_item_revision_search_query(): + # Testing the initial setup + item_revision_search = ItemRevisionSearch() + + assert item_revision_search._index == [''] + assert item_revision_search._query == {} + + # Testing a MultiMatch query + item_revision_search = ItemRevisionSearch() + mm = MultiMatch(fields=['foo'], query='bar') + + item_revision_search.query(mm) + + assert item_revision_search._query == {'foo': 'bar'} + + # Testing a range query + item_revision_search = ItemRevisionSearch() + r = Range(foo={'gte': 'bar', 'lte': u'baz'}) + + item_revision_search.query(r) + + assert item_revision_search._query == {'foo': ['bar', 'baz']} + + +def test_item_revision_search_execute(app, db): + # Prepare the item + item = Item.create({'foo': 'bar'}) + db.session.commit() + + # Create loan data + la = LoanItemSchema() + la.context['item'] = item + + # Prepare the loan data + tmp = la.load({'user_id': 1}).data + data = la.dump(tmp).data + + # Loan item + item.loan_item(**data) + item.commit() + db.session.commit() + + # Return item + item.return_item() + item.commit() + db.session.commit() + + # Prepare ItemRevisionSearch + item_revision_search = ItemRevisionSearch() + mm = MultiMatch(fields=['user_id'], query=1) + + result = item_revision_search.query(mm).execute() + + assert result.hits.total == 1 + assert result.to_dict() == { + 'hits': { + 'hits': [item], + 'total': 1 + } + } + + +def test_item_revision_search_dummies(): + """Tests necessary dummy implementations.""" + item_revision_search = ItemRevisionSearch() + + assert item_revision_search == item_revision_search[0] + assert item_revision_search == item_revision_search.params() diff --git a/tests/test_serializer_revision.py b/tests/test_serializer_revision.py new file mode 100644 index 0000000..9597768 --- /dev/null +++ b/tests/test_serializer_revision.py @@ -0,0 +1,57 @@ +# -*- coding: utf-8 -*- +# +# This file is part of Invenio. +# Copyright (C) 2016 CERN. +# +# Invenio is free software; you can redistribute it +# and/or modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation; either version 2 of the +# License, or (at your option) any later version. +# +# Invenio is distributed in the hope that it will be +# useful, but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with Invenio; if not, write to the +# Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, +# MA 02111-1307, USA. +# +# In applying this license, CERN does not +# waive the privileges and immunities granted to it by virtue of its status +# as an Intergovernmental Organization or submit itself to any jurisdiction. + + +"""Revision serializer tests.""" + +import json +import pytest + +from invenio_circulation.serializers import RevisionSerializer + + +def test_serialize_search(): + + val1 = {'_source': {'title': 'test1', 'pid': '1'}, '_id': 'a', + '_version': 1} + val2 = {'_source': {'title': 'test2', 'pid': '2'}, '_id': 'b', + '_version': 1} + + data = json.loads(RevisionSerializer(None).serialize_search( + None, + { + 'hits': { + 'hits': [val1, val2], + 'total': 2, + }, + 'aggregations': {}, + } + )) + + assert data['aggregations'] == {} + assert 'links' in data + assert data['hits'] == { + 'hits': [val1, val2], + 'total': 2, + }