def test_perform_action(self): """Integration-test metagov.perform_action function with randomness plugin""" # 1) Create Policy that performs a metagov action policy = Policy(kind=Policy.PLATFORM) policy.community = self.slack_community policy.filter = "return True" policy.initialize = "debug('help!')" policy.check = """parameters = {"low": 4, "high": 5} response = metagov.perform_action('randomness.random-int', parameters) if response and response.get('value') == 4: return PASSED return FAILED""" policy.notify = "pass" policy.success = "pass" policy.fail = "pass" policy.description = "test" policy.name = "test policy" policy.save() # 2) Save an action to trigger the policy execution action = SlackPinMessage() action.initiator = self.user action.community = self.slack_community action.community_origin = True action.save() self.assertEqual(action.proposal.status, "passed") # Check that evaluation debug log was generated from django_db_logger.models import EvaluationLog self.assertEqual( EvaluationLog.objects.filter(community=policy.community, msg__contains="help!").count(), 1)
def test_metagov_trigger(self): """Test policy triggered by generic metagov event""" # 1) Create Policy that is triggered by a metagov action policy = Policy(kind=Policy.PLATFORM) policy.community = self.slack_community policy.filter = """return action.action_codename == 'metagovaction' \ and action.event_type == 'discourse.post_created'""" policy.initialize = "action.data.set('test_verify_username', action.initiator.metagovuser.external_username)" policy.notify = "pass" policy.check = "return PASSED if action.event_data['category'] == 0 else FAILED" policy.success = "pass" policy.fail = "pass" policy.description = "test" policy.name = "test policy" policy.save() event_payload = { "community": self.slack_community.metagov_slug, "initiator": { "user_id": "miriam", "provider": "discourse" }, "source": "discourse", "event_type": "post_created", "data": { "title": "test", "raw": "post text", "category": 0 }, } # 2) Mimick an incoming notification from Metagov that the action has occurred client = Client() response = client.post(f"/metagov/internal/action", data=event_payload, content_type="application/json") self.assertEqual(response.status_code, 200) self.assertEqual(MetagovPlatformAction.objects.all().count(), 1) action = MetagovPlatformAction.objects.filter( event_type="discourse.post_created").first() # the action.community is the community that is connected to metagov self.assertEqual(action.community.platform, "slack") self.assertEqual(action.initiator.username, "discourse.miriam") self.assertEqual(action.initiator.metagovuser.external_username, "miriam") self.assertEqual(action.data.get("test_verify_username"), "miriam") self.assertEqual(action.event_data["raw"], "post text") self.assertEqual(action.proposal.status, "passed")
def test_metagov_slack_trigger(self): """Test receiving a Slack event from Metagov that creates a SlackPinMessage action""" # 1) Create Policy that is triggered by a metagov action policy = Policy(kind=Policy.PLATFORM) policy.community = self.community policy.filter = """return action.action_type == 'slackpinmessage'""" policy.initialize = "pass" policy.notify = "pass" policy.check = "return PASSED" policy.success = "proposal.data.set('got here', True)\nlogger.debug('hello world!')" policy.fail = "pass" policy.description = "test" policy.name = "test policy" policy.save() event_payload = { "community": self.slack_community.metagov_slug, "initiator": { "user_id": "alice", "provider": "slack" }, "source": "slack", "event_type": "pin_added", "data": { "channel_id": "123", "item": { "message": { "ts": "123" } } }, } # 2) Mimick an incoming notification from Metagov that the action has occurred client = Client() response = client.post(f"/metagov/internal/action", data=event_payload, content_type="application/json") self.assertEqual(response.status_code, 200) self.assertEqual(SlackPinMessage.objects.all().count(), 1) action = SlackPinMessage.objects.first() self.assertEqual(action.community.platform, "slack") proposal = Proposal.objects.get(action=action, policy=policy) self.assertEqual(proposal.data.get("got here"), True) self.assertEqual(proposal.status, Proposal.PASSED) # Check that proposal debug log was generated self.assertEqual( EvaluationLog.objects.filter(proposal=proposal, msg__contains="hello world!").count(), 1)
def init_kit(self, community, creator_token=None): for policy in self.genericpolicy_set.all(): p = Policy() p.kind = Policy.CONSTITUTION if policy.is_constitution else Policy.PLATFORM p.community = community p.filter = policy.filter p.initialize = policy.initialize p.check = policy.check p.notify = policy.notify p.success = policy.success p.fail = policy.fail p.description = policy.description p.name = policy.name proposal = Proposal.objects.create(status=Proposal.PASSED) p.proposal = proposal p.save() for role in self.genericrole_set.all(): c = None if role.is_base_role: c = community.base_role role.is_base_role = False else: c = CommunityRole() c.community = community c.role_name = role.role_name c.name = "Discord: " + community.community_name + ": " + role.role_name c.description = role.description c.save() for perm in role.permissions.all(): c.permissions.add(perm) jsonDec = json.decoder.JSONDecoder() perm_set = jsonDec.decode(role.plat_perm_set) if 'view' in perm_set: for perm in DISCORD_VIEW_PERMS: p1 = Permission.objects.get(name=perm) c.permissions.add(p1) if 'propose' in perm_set: for perm in DISCORD_PROPOSE_PERMS: p1 = Permission.objects.get(name=perm) c.permissions.add(p1) if 'execute' in perm_set: for perm in DISCORD_EXECUTE_PERMS: p1 = Permission.objects.get(name=perm) c.permissions.add(p1) if role.user_group == "admins": group = CommunityUser.objects.filter(community = community, is_community_admin = True) for user in group: c.user_set.add(user) elif role.user_group == "nonadmins": group = CommunityUser.objects.filter(community = community, is_community_admin = False) for user in group: c.user_set.add(user) elif role.user_group == "all": group = CommunityUser.objects.filter(community = community) for user in group: c.user_set.add(user) elif role.user_group == "creator": user = CommunityUser.objects.get(access_token=creator_token) c.user_set.add(user) c.save()