Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Bug 1336452 : migrate all remaining Rules and Users APIs #317

Merged
merged 19 commits into from
May 29, 2017
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
4 changes: 4 additions & 0 deletions auslib/test/admin/views/base.py
Original file line number Diff line number Diff line change
Expand Up @@ -166,9 +166,13 @@ def _badAuthPost(self, url, data={}):
return self.client.post(url, data=json.dumps(data), content_type="application/json", environ_base=self._getBadAuth())

def _put(self, url, data={}, username='bill'):
if type(data) == dict:
data["csrf_token"] = "lorem"
return self.client.put(url, data=json.dumps(data), content_type="application/json", environ_base=self._getAuth(username))

def _delete(self, url, qs={}, username='bill'):
if type(qs) == dict:
qs["csrf_token"] = "lorem"
return self.client.delete(url, query_string=qs, environ_base=self._getAuth(username))

def assertStatusCode(self, response, expected):
Expand Down
35 changes: 26 additions & 9 deletions auslib/test/admin/views/test_rules.py
Original file line number Diff line number Diff line change
Expand Up @@ -209,6 +209,19 @@ def testValidationEmptyInput(self):
self.assertEquals(r[0]['buildID'], None)
self.assertEquals(r[0]['version'], None)

def testInvalidMapping(self):
data_dict = dict(backgroundRate=31, mapping='random', priority=33, product='a', update_type='minor')
ret = self._post('/rules', data=data_dict)
self.assertEquals(ret.status_code, 400, "Status Code: %d, Data: %s" % (ret.status_code, ret.data))
self.assertIn("mapping", ret.data, "Status Code: %d, Data: %s" % (ret.status_code, ret.data))

def testPutDataVersionLessThanOne(self):
# Throw 400 error when data_version is less than 1.
ret = self._put('/rules/1', data=dict(backgroundRate=71, mapping='d',
priority=73, data_version=0,
product='Firefox', channel='nightly', update_type='minor'))
self.assertEquals(ret.status_code, 400, "Status Code: %d, Data: %s" % (ret.status_code, ret.data))


class TestSingleRuleView_JSON(ViewTest):

Expand Down Expand Up @@ -270,8 +283,8 @@ def testGetRule404(self):

def testPost(self):
# Make some changes to a rule
ret = self._post('/rules/1', data=dict(backgroundRate=71, mapping='d',
fallbackMapping="fallback_d", priority=73, data_version=1,
ret = self._post('/rules/1', data=dict(backgroundRate=71, mapping='d', update_type='minor',
fallbackMapping="b", priority=73, data_version=1,
product='Firefox', channel='nightly', systemCapabilities="SSE"))
self.assertEquals(ret.status_code, 200, "Status Code: %d, Data: %s" % (ret.status_code, ret.data))
load = json.loads(ret.data)
Expand All @@ -281,7 +294,7 @@ def testPost(self):
r = dbo.rules.t.select().where(dbo.rules.rule_id == 1).execute().fetchall()
self.assertEquals(len(r), 1)
self.assertEquals(r[0]['mapping'], 'd')
self.assertEquals(r[0]['fallbackMapping'], 'fallback_d')
self.assertEquals(r[0]['fallbackMapping'], 'b')
self.assertEquals(r[0]['backgroundRate'], 71)
self.assertEquals(r[0]['systemCapabilities'], "SSE")
self.assertEquals(r[0]['priority'], 73)
Expand All @@ -293,7 +306,9 @@ def testPost(self):

def testPutRuleOutdatedData(self):
# Make changes to a rule
ret = self._put('/rules/1', data=dict(backgroundRate=71, mapping='d', priority=73, data_version=1, product='Firefox', channel='nightly'))
ret = self._put('/rules/1', data=dict(backgroundRate=71, mapping='d',
priority=73, data_version=1,
product='Firefox', channel='nightly'))
self.assertEquals(ret.status_code, 200, "Status Code: %d, Data: %s" % (ret.status_code, ret.data))
load = json.loads(ret.data)
self.assertEquals(load['new_data_version'], 2)
Expand All @@ -307,7 +322,8 @@ def testPutRuleOutdatedData(self):

def testPostRuleOutdatedData(self):
# Make changes to a rule
ret = self._post('/rules/1', data=dict(backgroundRate=71, mapping='d', priority=73, data_version=1, product='Firefox', channel='nightly'))
ret = self._post('/rules/1', data=dict(backgroundRate=71, mapping='d', priority=73, data_version=1,
product='Firefox', channel='nightly'))
self.assertEquals(ret.status_code, 200, "Status Code: %d, Data: %s" % (ret.status_code, ret.data))
load = json.loads(ret.data)
self.assertEquals(load['new_data_version'], 2)
Expand All @@ -316,7 +332,8 @@ def testPostRuleOutdatedData(self):
self.assertEquals(r[0]['data_version'], 2)

# OutdatedDataVersion Request
ret2 = self._put('/rules/1', data=dict(backgroundRate=71, mapping='d', priority=73, data_version=1, product='Firefox', channel='nightly'))
ret2 = self._put('/rules/1', data=dict(backgroundRate=71, mapping='d', priority=73,
data_version=1, product='Firefox', channel='nightly'))
self.assertEquals(ret2.status_code, 400, "Status Code: %d, Data: %s" % (ret2.status_code, ret2.data))

def testPostByAlias(self):
Expand Down Expand Up @@ -438,7 +455,7 @@ def testPostRemoveRestriction(self):
self.assertEquals(r["product"], "a")

def testPost404(self):
ret = self._post("/rules/555", data=dict(mapping="d"))
ret = self._post("/rules/555", data=dict(mapping="d", data_version=1))
self.assertEquals(ret.status_code, 404)

def testPostWithBadData(self):
Expand Down Expand Up @@ -505,11 +522,11 @@ def testDeleteRuleOutdatedData(self):
self.assertEquals(ret.status_code, 400, msg=ret.data)

def testDeleteRuleByAlias(self):
ret = self._delete('/rules/frodo', qs=dict(data_version=1))
ret = self._delete('/rules/frodo', qs={"data_version": 1})
self.assertEquals(ret.status_code, 200, msg=ret.data)

def testDeleteRule404(self):
ret = self._delete("/rules/112")
ret = self._delete("/rules/112", qs={"data_version": 25})
self.assertEquals(ret.status_code, 404)

def testDeleteWithProductAdminPermission(self):
Expand Down
18 changes: 4 additions & 14 deletions auslib/web/admin/base.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,16 +14,17 @@
'body': BalrogRequestBodyValidator
}

# TODO set debug=False after fully migrating all the admin APIs
connexion_app = connexion.App(__name__, specification_dir='swagger/', validator_map=validator_map, debug=True)
connexion_app.add_api("api.yaml", validate_responses=True, strict_validation=True)
app = connexion_app.app
sentry = Sentry()

from auslib.web.admin.views.permissions import PermissionsView, \
SpecificPermissionView, UserRolesView, UserRoleView, AllRolesView, \
from auslib.web.admin.views.permissions import \
SpecificPermissionView, \
PermissionScheduledChangesView, PermissionScheduledChangeView, \
EnactPermissionScheduledChangeView, PermissionScheduledChangeHistoryView, \
PermissionScheduledChangeSignoffsView, SpecificUserView
PermissionScheduledChangeSignoffsView
from auslib.web.admin.views.releases import SingleLocaleView, \
SingleReleaseView, ReleaseHistoryView, \
ReleasesAPIView, SingleReleaseColumnView, ReleaseReadOnlyView, \
Expand All @@ -45,7 +46,6 @@
PermissionsRequiredSignoffScheduledChangeSignoffsView, \
PermissionsRequiredSignoffScheduledChangeHistoryView
from auslib.web.admin.views.rules import RuleScheduledChangeSignoffsView, \
SingleRuleView, RuleHistoryAPIView, SingleRuleColumnView, \
RuleScheduledChangesView, RuleScheduledChangeView, \
EnactRuleScheduledChangeView, RuleScheduledChangeHistoryView
from auslib.dockerflow import create_dockerflow_endpoints
Expand Down Expand Up @@ -101,17 +101,7 @@ def add_security_headers(response):
# and the static admin UI are hosted on the same domain. This API wsgi app is
# hosted at "/api", which is stripped away by the web server before we see
# these requests.
app.add_url_rule("/users/roles", view_func=AllRolesView.as_view("all_users_roles"))
app.add_url_rule("/users/<username>", view_func=SpecificUserView.as_view("specific_user"))
app.add_url_rule("/users/<username>/permissions", view_func=PermissionsView.as_view("user_permissions"))
app.add_url_rule("/users/<username>/permissions/<permission>", view_func=SpecificPermissionView.as_view("specific_permission"))
app.add_url_rule("/users/<username>/roles", view_func=UserRolesView.as_view("user_roles"))
app.add_url_rule("/users/<username>/roles/<role>", view_func=UserRoleView.as_view("user_role"))
# Normal operations (get/update/delete) on rules can be done by id or alias...
app.add_url_rule("/rules/<id_or_alias>", view_func=SingleRuleView.as_view("rule"))
app.add_url_rule("/rules/columns/<column>", view_func=SingleRuleColumnView.as_view("rule_columns"))
# ...but anything to do with history must be done by id, beacuse alias may change over time
app.add_url_rule("/rules/<int:rule_id>/revisions", view_func=RuleHistoryAPIView.as_view("rules_revisions"))
app.add_url_rule("/releases", view_func=ReleasesAPIView.as_view("releases"))
app.add_url_rule("/releases/<release>", view_func=SingleReleaseView.as_view("single_release"))
app.add_url_rule("/releases/<release>/read_only", view_func=ReleaseReadOnlyView.as_view("read_only"))
Expand Down