From d983e10d089decdc8b80202b03f4b3eae800a784 Mon Sep 17 00:00:00 2001 From: Sylvain Baubeau Date: Thu, 18 Dec 2014 11:42:11 +0100 Subject: [PATCH] Add snapshots API test suite --- system/api_lib.py | 8 ++ system/lib.py | 11 +++ system/t12_api/__init__.py | 1 + system/t12_api/snapshots.py | 144 ++++++++++++++++++++++++++++++++++++ 4 files changed, 164 insertions(+) create mode 100644 system/t12_api/snapshots.py diff --git a/system/api_lib.py b/system/api_lib.py index f9646c7c..c62270c7 100644 --- a/system/api_lib.py +++ b/system/api_lib.py @@ -47,6 +47,14 @@ class APITest(BaseTest): kwargs["headers"]["Content-Type"] = "application/json" return requests.post("http://%s%s" % (self.base_url, uri), *args, **kwargs) + def put(self, uri, *args, **kwargs): + if "json" in kwargs: + kwargs["data"] = json.dumps(kwargs.pop("json")) + if not "headers" in kwargs: + kwargs["headers"] = {} + kwargs["headers"]["Content-Type"] = "application/json" + return requests.put("http://%s%s" % (self.base_url, uri), *args, **kwargs) + def delete(self, uri, *args, **kwargs): if "json" in kwargs: kwargs["data"] = json.dumps(kwargs.pop("json")) diff --git a/system/lib.py b/system/lib.py index 7782729e..dc6ebd94 100644 --- a/system/lib.py +++ b/system/lib.py @@ -267,6 +267,17 @@ class BaseTest(object): if a != b: self.verify_match(a, b, match_prepare=pprint.pformat) + def check_subset(self, a, b): + diff = '' + for k, v in a.items(): + if k not in b: + diff += "unexpected key '%s'\n" % (k,) + elif b[k] != v: + diff += "wrong value '%s' for key '%s', expected '%s'\n" % (v, k, b[k]) + if diff: + raise Exception("content doesn't match:\n" + diff) + + def verify_match(self, a, b, match_prepare=None): if match_prepare is not None: a = match_prepare(a) diff --git a/system/t12_api/__init__.py b/system/t12_api/__init__.py index 51c8c87f..93ef8eff 100644 --- a/system/t12_api/__init__.py +++ b/system/t12_api/__init__.py @@ -4,3 +4,4 @@ Testing aptly REST API from .repos import * from .files import * +from .snapshots import * \ No newline at end of file diff --git a/system/t12_api/snapshots.py b/system/t12_api/snapshots.py new file mode 100644 index 00000000..c2f3e4c6 --- /dev/null +++ b/system/t12_api/snapshots.py @@ -0,0 +1,144 @@ +from api_lib import APITest + + +class SnapshotsAPITestCreateShow(APITest): + """ + GET /api/snapshots/:name, POST /api/snapshots, GET /api/snapshots/:name/packages + """ + def check(self): + snapshot_name = self.random_name() + snapshot_desc = {u'Description': u'fun snapshot', + u'Name': snapshot_name} + + resp = self.post("/api/snapshots", json=snapshot_desc) + self.check_subset(snapshot_desc, resp.json()) + self.check_equal(resp.status_code, 201) + + self.check_subset(snapshot_desc, self.get("/api/snapshots/" + snapshot_name).json()) + self.check_equal(self.get("/api/snapshots/" + snapshot_name).status_code, 200) + + self.check_equal(self.get("/api/snapshots/" + self.random_name()).status_code, 404) + + +class SnapshotsAPITestCreateFromRepo(APITest): + """ + POST /api/repos, POST /api/repos/:name/snapshots, GET /api/snapshots/:name + """ + def check(self): + repo_name = self.random_name() + snapshot_name = self.random_name() + self.check_equal(self.post("/api/repos", json={"Name": repo_name}).status_code, 201) + + resp = self.post("/api/repos/" + repo_name + '/snapshots', json={'Name': snapshot_name}) + self.check_equal(resp.status_code, 400) + + d = self.random_name() + self.check_equal(self.upload("/api/files/" + d, + "libboost-program-options-dev_1.49.0.1_i386.deb").status_code, 200) + + self.check_equal(self.post("/api/repos/" + repo_name + "/file/" + d).status_code, 200) + + resp = self.post("/api/repos/" + repo_name + '/snapshots', json={'Name': snapshot_name}) + self.check_equal(self.get("/api/snapshots/" + snapshot_name).status_code, 200) + + self.check_subset({u'Architecture': 'i386', u'Name': 'libboost-program-options-dev', u'Version': '1.49.0.1', 'FilesHash': '918d2f433384e378'}, + self.get("/api/snapshots/" + snapshot_name + "/packages").json()[0]) + + self.check_subset({u'Architecture': 'i386', u'Name': 'libboost-program-options-dev', u'Version': '1.49.0.1', 'FilesHash': '918d2f433384e378'}, + self.get("/api/snapshots/" + snapshot_name + "/packages", params={"q": "Version (> 0.6.1-1.4)"}).json()[0]) + + +class SnapshotsAPITestCreateUpdate(APITest): + """ + POST /api/snapshots, PUT /api/snapshots/:name, GET /api/snapshots/:name + """ + def check(self): + snapshot_name = self.random_name() + snapshot_desc = {u'Description': u'fun snapshot', + u'Name': snapshot_name} + + resp = self.post("/api/snapshots", json=snapshot_desc) + self.check_equal(resp.status_code, 201) + + new_snapshot_name = self.random_name() + resp = self.put("/api/snapshots/" + snapshot_name, json={'Name': new_snapshot_name, + 'Description': 'New description'}) + self.check_equal(resp.status_code, 200) + + resp = self.get("/api/snapshots/" + new_snapshot_name) + self.check_equal(resp.status_code, 200) + self.check_subset({"Name": new_snapshot_name, + "Description": "New description"}, resp.json()) + + +class SnapshotsAPITestCreateDelete(APITest): + """ + POST /api/snapshots, DELETE /api/snapshots/:name, GET /api/snapshots/:name + """ + def check(self): + snapshot_name = self.random_name() + snapshot_desc = {u'Description': u'fun snapshot', + u'Name': snapshot_name} + + resp = self.post("/api/snapshots", json=snapshot_desc) + self.check_equal(resp.status_code, 201) + + self.check_equal(self.delete("/api/snapshots/" + snapshot_name).status_code, 200) + + self.check_equal(self.get("/api/snapshots/" + snapshot_name).status_code, 404) + + +class SnapshotsAPITestSearch(APITest): + """ + POST /api/snapshots, GET /api/snapshots?sort=name, GET /api/snapshots/:name + """ + def check(self): + + repo_name = self.random_name() + self.check_equal(self.post("/api/repos", json={"Name": repo_name}).status_code, 201) + + d = self.random_name() + snapshot_name = self.random_name() + self.check_equal(self.upload("/api/files/" + d, + "libboost-program-options-dev_1.49.0.1_i386.deb").status_code, 200) + + self.check_equal(self.post("/api/repos/" + repo_name + "/file/" + d).status_code, 200) + + resp = self.post("/api/repos/" + repo_name + '/snapshots', json={'Name': snapshot_name}) + self.check_equal(resp.status_code, 201) + + resp = self.get("/api/snapshots/" + snapshot_name + "/packages?q=libboost-program-options-dev") + self.check_equal(resp.status_code, 200) + + self.check_equal(len(resp.json()), 1) + self.check_equal(resp.json()[0]["Name"], "libboost-program-options-dev") + + +class SnapshotsAPITestDiff(APITest): + """ + POST /api/snapshot/:name/diff/:name2 + """ + def check(self): + repos = [ self.random_name() for x in xrange(2) ] + snapshots = [ self.random_name() for x in xrange(2) ] + + for repo_name in repos: + self.check_equal(self.post("/api/repos", json={"Name": repo_name}).status_code, 201) + + d = self.random_name() + self.check_equal(self.upload("/api/files/" + d, + "libboost-program-options-dev_1.49.0.1_i386.deb").status_code, 200) + + self.check_equal(self.post("/api/repos/" + repo_name + "/file/" + d).status_code, 200) + + resp = self.post("/api/repos/" + repo_name + '/snapshots', json={'Name': snapshots[0]}) + self.check_equal(resp.status_code, 201) + + resp = self.post("/api/snapshots", json={'Name': snapshots[1]}) + self.check_equal(resp.status_code, 201) + + resp = self.post("/api/snapshots/" + snapshots[0] + "/diff/" + snapshots[1]) + + self.check_equal(resp.status_code, 200) + self.check_subset({"Right": None}, resp.json()[0]) + self.check_subset({"Name": "libboost-program-options-dev"}, resp.json()[0]["Left"])