Skip to content

Commit

Permalink
Bug 1336452: migrate all remaining Rules and Users APIs (mozilla-rele…
Browse files Browse the repository at this point in the history
…ng#317). r=bhearsum
  • Loading branch information
bhearsum committed Jun 30, 2017
1 parent 654ab08 commit 97151b7
Show file tree
Hide file tree
Showing 13 changed files with 1,333 additions and 223 deletions.
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 @@ -210,6 +210,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 @@ -273,8 +286,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 @@ -284,7 +297,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 @@ -296,7 +309,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 @@ -310,7 +325,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 @@ -319,7 +335,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 @@ -441,7 +458,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 @@ -508,11 +525,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

0 comments on commit 97151b7

Please sign in to comment.