diff --git a/database/schema.py b/database/schema.py index c4df8d23e128d89c7e6a1946d5957bfd1e688e32..35e97623a58fae5c3e76af35bf65ca57c182463b 100644 --- a/database/schema.py +++ b/database/schema.py @@ -86,6 +86,22 @@ class AddRoleToUser(graphene.Mutation): return AddRoleToUser(user=user,role=role) +class AddApplicationToUser(graphene.Mutation): + class Arguments: + username = graphene.String(required=True) + application = graphene.String(required=True) + + user = graphene.Field(User) + application = graphene.Field(Application) + + def mutate(self, info, username, application): + user = user_datastore.db.session().query(UserModel).filter_by(username=username).first() + application = user_datastore.db.session().query(ApplicationModel).filter_by(name=application).first() + user.applications.append(application) + user_datastore.commit() + return AddApplicationToUser(user=user,application=application) + + class Query(graphene.ObjectType): node = relay.Node.Field() all_users = SQLAlchemyConnectionField(User) @@ -101,6 +117,7 @@ class Mutation(graphene.ObjectType): create_role = CreateRole.Field() create_application = CreateApplication.Field() add_role_to_user = AddRoleToUser.Field() + add_application_to_user = AddApplicationToUser.Field() schema = graphene.Schema(query=Query, types=[User, Role, Application], mutation=Mutation) diff --git a/test/test_graphql.py b/test/test_graphql.py index c847f6ee04671b9707ce837299222aba8c7d5a27..715df308b68ef19f97bad67fde906a075fe39d49 100644 --- a/test/test_graphql.py +++ b/test/test_graphql.py @@ -18,7 +18,7 @@ class GraphQlTests(LiveServerTestCase): def tearDown(self): # clean up tables - for username in ["graphqluser", "graphqluser2"]: + for username in ["graphqluser", "graphqluser2", "graphqluser3"]: user = db_session.query(User).filter_by(username=username).first() if user is not None: user.roles = [] @@ -145,7 +145,7 @@ class GraphQlTests(LiveServerTestCase): '''.format(name, description).strip() return loads(self.client.execute(querystring)) - def test_create_application(self): + def test_create_and_assign_application(self): application_name = "testapp" result = self._create_application(application_name) self.assertIn("data", result) @@ -153,6 +153,51 @@ class GraphQlTests(LiveServerTestCase): self.assertIn("application", result["data"]["createApplication"]) application = result["data"]["createApplication"]["application"] self.assertEqual(application["name"], application_name) + username = "graphqluser3" + password = "randompassword" + email = "user3@example.com" + self._create_user(username, password, email) + querystring = ''' + mutation{{ + addApplicationToUser( + username: "{0}", + application: "{1}"){{ + user{{ + username, + applications{{ + edges{{ + node{{ + name + }} + }} + }} + }} + application{{ + name, + users{{ + edges{{ + node{{ + username + }} + }} + }} + }} + }} + }} + '''.format(username, application_name).strip() + result = loads(self.client.execute(querystring)) + self.assertIn("data", result) + self.assertIn("addApplicationToUser", result["data"]) + user = result["data"]["addApplicationToUser"]["user"] + self.assertEqual(username, user["username"]) + self.assertIn("edges", user["applications"]) + applications = user["applications"]["edges"] + self.assertEqual(application_name, applications[0]["node"]["name"]) + application = result["data"]["addApplicationToUser"]["application"] + self.assertEqual(application_name, application["name"]) + self.assertIn("edges", application["users"]) + users = application["users"]["edges"] + self.assertEqual(username, users[0]["node"]["username"]) def _create_application(self, name): querystring = '''