Skip to content
This repository has been archived by the owner on Jan 25, 2022. It is now read-only.

Commit

Permalink
Merge 438b2a8 into d9f826a
Browse files Browse the repository at this point in the history
  • Loading branch information
leplatrem committed Nov 19, 2020
2 parents d9f826a + 438b2a8 commit 5323ccf
Show file tree
Hide file tree
Showing 4 changed files with 52 additions and 8 deletions.
4 changes: 2 additions & 2 deletions .travis.yml
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
language: python
python: 3.6
python: 3.8
sudo: false
env:
- TOX_ENV=py36
- TOX_ENVi=py38
- TOX_ENV=flake8
install: pip install -U tox
script: tox -e $TOX_ENV
Expand Down
4 changes: 3 additions & 1 deletion CHANGELOG.rst
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,9 @@ Changelog
3.2.0 (unreleased)
------------------

- Nothing changed yet.
**New features**

- Add filtering support in monitor/changes changeset endpoint


3.1.2 (2020-09-30)
Expand Down
14 changes: 13 additions & 1 deletion kinto_changes/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -221,6 +221,10 @@ def deserialize(self, cstruct=colander.null):
class ChangeSetQuerystring(colander.MappingSchema):
_since = QuotedTimestamp(missing=colander.drop)
_expected = colander.SchemaNode(colander.String())
_limit = colander.SchemaNode(colander.Integer(), missing=colander.drop)
# Query parameters used on monitor/changes endpoint.
bucket = colander.SchemaNode(colander.String(), missing=colander.drop)
collection = colander.SchemaNode(colander.String(), missing=colander.drop)


class ChangeSetSchema(colander.MappingSchema):
Expand All @@ -235,6 +239,7 @@ def get_changeset(request):
storage = request.registry.storage

queryparams = request.validated["querystring"]
limit = queryparams.get("_limit")
filters = []
include_deleted = False
if "_since" in queryparams:
Expand All @@ -246,10 +251,16 @@ def get_changeset(request):
# Redirect old since, on monitor/changes only.
_handle_old_since_redirect(request)

if "bucket" in queryparams:
filters.append(Filter("bucket", queryparams["bucket"], COMPARISON.EQ))

if "collection" in queryparams:
filters.append(Filter("collection", queryparams["collection"], COMPARISON.EQ))

model = ChangesModel(request)
metadata = {}
timestamp = model.timestamp()
changes = model.get_objects(filters=filters, include_deleted=include_deleted)
changes = model.get_objects(filters=filters, limit=limit, include_deleted=include_deleted)

else:
bucket_uri = instance_uri(request, "bucket", id=bid)
Expand Down Expand Up @@ -277,6 +288,7 @@ def get_changeset(request):
resource_name="record",
parent_id=collection_uri,
filters=filters,
limit=limit,
id_field='id',
modified_field='last_modified',
deleted_field='deleted',
Expand Down
38 changes: 34 additions & 4 deletions tests/test_changeset.py
Original file line number Diff line number Diff line change
Expand Up @@ -98,6 +98,12 @@ def test_timestamp_is_validated(self):
def test_expected_param_is_mandatory(self):
self.app.get(self.changeset_uri.split("?")[0], headers=self.headers, status=400)

def test_limit_is_supported(self):
self.app.post_json(self.records_uri, {}, headers=self.headers)

resp = self.app.get(self.changeset_uri + "&_limit=1", headers=self.headers)
assert len(resp.json["changes"]) == 1

def test_extra_param_is_allowed(self):
self.app.get(self.changeset_uri + "&_extra=abc", headers=self.headers)

Expand Down Expand Up @@ -129,12 +135,22 @@ def test_changeset_returns_404_if_collection_is_unknown(self):


class MonitorChangesetViewTest(BaseWebTest, unittest.TestCase):
records_uri = '/buckets/blocklists/collections/certificates/records'
records_uri = '/buckets/blocklists/collections/{cid}/records'
changeset_uri = '/buckets/monitor/collections/changes/changeset?_expected=42'

def setUp(self):
super().setUp()
self.app.post_json(self.records_uri, SAMPLE_RECORD, headers=self.headers)
self.create_collection("blocklists", "cfr")
self.app.post_json(
self.records_uri.format(cid="cfr"),
SAMPLE_RECORD,
headers=self.headers
)
self.app.post_json(
self.records_uri.format(cid="certificates"),
SAMPLE_RECORD,
headers=self.headers
)

@classmethod
def get_app_settings(cls, extras=None):
Expand All @@ -143,14 +159,17 @@ def get_app_settings(cls, extras=None):
return settings

def test_changeset_exists_for_monitor_changes(self):
resp = self.app.head(self.records_uri, headers=self.headers)
resp = self.app.head(
self.records_uri.format(cid="certificates"),
headers=self.headers
)
records_timestamp = int(resp.headers["ETag"].strip('"'))

resp = self.app.get(self.changeset_uri)
data = resp.json

assert data["timestamp"] == records_timestamp
assert len(data["changes"]) == 1
assert len(data["changes"]) == 2
assert data["changes"][0]["collection"] == "certificates"

def test_changeset_redirects_if_since_is_too_old(self):
Expand All @@ -161,3 +180,14 @@ def test_changeset_redirects_if_since_is_too_old(self):
'https://www.kinto-storage.org/v1'
'/buckets/monitor/collections/changes/records?_expected=42'
)

def test_limit_is_supported(self):
resp = self.app.get(self.changeset_uri + "&_limit=1", headers=self.headers)
assert len(resp.json["changes"]) == 1

def test_filter_by_collection(self):
resp = self.app.get(
self.changeset_uri + "&bucket=blocklists&collection=cfr",
headers=self.headers
)
assert len(resp.json["changes"]) == 1

0 comments on commit 5323ccf

Please sign in to comment.