Пример #1
0
def notify(request: Request):
    log = NarukoLogging(request)
    logger = log.get_logger(__name__)
    logger.info("START: notify")
    # リクエストがSNSからであるかを検証する
    use_case = ControlNotificationUseCase(log)
    body_data = json.loads(request.body)
    logger.info(body_data)
    use_case.verify_sns_notification(body_data)

    # SNSの種別ごとに分岐
    sns_type = body_data.get("Type")
    logger.info("Message Type is {}.".format(sns_type))
    if sns_type == "Notification":
        # 通知:アラームの内容に従って通知処理を実施する
        alarm_message = json.loads(body_data["Message"])
        use_case.notify(
            NotificationDestinationModel.NotificationMessage(alarm_message))
    elif sns_type == "SubscriptionConfirmation":

        # 購読開始:SNSトピック登録時に初期検証を実施する
        use_case.confirm_subscription(body_data)
    elif sns_type == "UnsubscribeConfirmation":
        # 購読解除:SNSトピック購読解除
        logger.info("UnsubscribeConfirmation. {}".format(body_data["Message"]))
    else:
        # 存在しない種別
        logger.warning("UnknownSnsMessageType.")
        logger.warning(body_data)

    logger.info("END: notify")
    return Response(status=status.HTTP_200_OK)
    def create(self, request, tenant_pk=None):
        log = NarukoLogging(request)
        logger = log.get_logger(__name__)
        logger.info("START: create")
        try:
            with transaction.atomic():
                # バリデーション
                data_dest = request.data
                data_dest["tenant"] = tenant_pk
                dest_serializer = get_serializer(data_dest)
                dest_serializer.is_valid(raise_exception=True)

                # 作成
                destination = ControlNotificationUseCase(
                    log).create_destination(request.user,
                                            dest_serializer.save())
                data = serialize_destination(destination)
        except (TypeError, ValueError, TenantModel.DoesNotExist) as e:
            logger.exception(e)
            return Response(status=status.HTTP_404_NOT_FOUND)
        except Exception as e:
            logger.exception(e)
            raise
        else:
            logger.info("END: create")
            return Response(data=data, status=status.HTTP_201_CREATED)
Пример #3
0
    def test_fetch_groups_user_role(self, mock_group):
        mock_user = mock.Mock()
        mock_user.can_control_notification.return_value = False
        mock_tenant = mock.Mock()

        with self.assertRaises(PermissionDenied):
            ControlNotificationUseCase(mock.Mock()).fetch_groups(
                mock_user, mock_tenant)
Пример #4
0
    def test_notify(self):
        mock_message = mock.Mock()
        mock_group = mock.Mock()
        mock_dest = mock.Mock()
        mock_group.destinations.filter.return_value = [mock_dest]
        mock_message.aws.notification_groups.filter.return_value = [mock_group]

        ControlNotificationUseCase(mock.Mock()).notify(mock_message)
Пример #5
0
    def test_verify_sns_notification_fail(self, mock_sns):
        mock_sns.verify_notification.return_value = False
        data = dict()

        with self.assertRaises(InvalidNotificationException):
            ControlNotificationUseCase(
                mock.Mock()).verify_sns_notification(data)

        mock_sns.verify_notification.assert_called_with(data)
Пример #6
0
    def test_delete_group(self):
        mock_user = mock.Mock()
        mock_user.can_control_notification.return_value = True
        mock_group = mock.Mock()

        ControlNotificationUseCase(mock.Mock()).delete_group(
            mock_user, mock_group)

        mock_group.delete.assert_called_once()
Пример #7
0
    def test_create_group(self):
        mock_user = mock.Mock()
        mock_user.can_control_notification.return_value = True
        mock_group = mock.Mock()

        res = ControlNotificationUseCase(mock.Mock()).save_group(
            mock_user, mock_group)

        mock_group.save.assert_called_once()
        self.assertEqual(res, mock_group)
Пример #8
0
    def test_create_destination_not_belong_to_tenant(self):
        mock_user = mock.Mock()
        mock_user.is_belong_to_tenant.return_value = False
        mock_dest = mock.Mock()

        with self.assertRaises(PermissionDenied):
            ControlNotificationUseCase(mock.Mock()).create_destination(
                mock_user, mock_dest)

        mock_dest.save.assert_not_called()
Пример #9
0
    def test_create_destination(self):
        mock_user = mock.Mock()
        mock_user.can_control_notification.return_value = True
        mock_dest = mock.Mock()

        res = ControlNotificationUseCase(mock.Mock()).create_destination(
            mock_user, mock_dest)

        self.assertEqual(res, mock_dest)
        mock_dest.save.assert_called_once()
Пример #10
0
    def test_delete_group_user_role(self):
        mock_user = mock.Mock()
        mock_user.can_control_notification.return_value = False
        mock_group = mock.Mock()

        with self.assertRaises(PermissionDenied):
            ControlNotificationUseCase(mock.Mock()).delete_group(
                mock_user, mock_group)

        mock_group.delete.assert_not_called()
Пример #11
0
    def test_fetch_destinations_user_role(self, mock_dest):

        mock_user = mock.Mock()
        mock_user.can_control_notification.return_value = False
        mock_user.is_belong_to_tenant.return_value = False

        with self.assertRaises(PermissionDenied):
            ControlNotificationUseCase(mock.Mock()).fetch_destinations(
                mock_user, mock.Mock())

        mock_dest.assert_not_called()
Пример #12
0
    def test_create_group_no_tenant(self):
        mock_user = mock.Mock()
        mock_user.can_control_notification.return_value = True
        mock_user.is_belong_to_tenant.return_value = False
        mock_group = mock.Mock()

        with self.assertRaises(PermissionDenied):
            ControlNotificationUseCase(mock.Mock()).save_group(
                mock_user, mock_group)

        mock_group.save.assert_not_called()
Пример #13
0
    def test_fetch_groups(self, mock_group):
        mock_user = mock.Mock()
        mock_user.can_control_notification.return_value = True
        mock_tenant = mock.Mock()

        mock_group1 = mock.Mock()
        mock_group2 = mock.Mock()
        mock_group3 = mock.Mock()
        expected_value = [mock_group1, mock_group2, mock_group3]
        objects_filter = mock_group.objects.filter
        objects_filter.return_value = expected_value

        res = ControlNotificationUseCase(mock.Mock()).fetch_groups(
            mock_user, mock_tenant)

        objects_filter.assert_called_once_with(tenant=mock_tenant)
        self.assertEqual(res, expected_value)
 def destroy(self, request, tenant_pk=None, pk=None):
     log = NarukoLogging(request)
     logger = log.get_logger(__name__)
     logger.info("START: destroy")
     try:
         with transaction.atomic():
             notification_group = NotificationGroupModel.objects.get(id=pk, tenant_id=tenant_pk)
             ControlNotificationUseCase(log).delete_group(request.user, notification_group)
     except (TypeError, ValueError, ObjectDoesNotExist) as e:
         logger.exception(e)
         return Response(status=status.HTTP_404_NOT_FOUND)
     except Exception as e:
         logger.exception(e)
         raise
     else:
         logger.info("END: destroy")
         return Response(status=status.HTTP_204_NO_CONTENT)
 def list(self, request, tenant_pk=None):
     log = NarukoLogging(request)
     logger = log.get_logger(__name__)
     logger.info("START: list")
     try:
         tenant = TenantModel.objects.get(id=tenant_pk)
         groups = ControlNotificationUseCase(log).fetch_groups(request.user, tenant)
         data = [NotificationGroupModelDetailSerializer(group).data for group in groups]
     except (TypeError, ValueError, ObjectDoesNotExist) as e:
         logger.exception(e)
         return Response(status=status.HTTP_404_NOT_FOUND)
     except Exception as e:
         logger.exception(e)
         raise
     else:
         logger.info("END: list")
         return Response(data=data, status=status.HTTP_200_OK)
Пример #16
0
    def test_fetch_destinations(self, mock_dest):
        mock_dest1 = mock.Mock()
        mock_dest2 = mock.Mock()
        mock_dest3 = mock.Mock()
        expected_value = [mock_dest1, mock_dest2, mock_dest3]
        mock_tenant = mock.Mock()

        value_filter = mock_dest.all.return_value.filter
        value_filter.return_value = expected_value

        mock_user = mock.Mock()
        mock_user.can_control_notification.return_value = True
        response = ControlNotificationUseCase(mock.Mock()).fetch_destinations(
            mock_user, mock_tenant)

        value_filter.assert_called_once_with(tenant=mock_tenant)
        self.assertEqual(response, expected_value)
    def create(self, request, tenant_pk=None):
        log = NarukoLogging(request)
        logger = log.get_logger(__name__)
        logger.info("START: create")
        try:
            with transaction.atomic():
                # バリデーション
                data_group = request.data
                data_group["tenant"] = tenant_pk
                serializer = NotificationGroupModelSerializer(data=data_group)
                serializer.is_valid(raise_exception=True)

                data = ControlNotificationUseCase(log).save_group(request.user, serializer.save())
        except (TypeError, ValueError, ObjectDoesNotExist) as e:
            logger.exception(e)
            return Response(status=status.HTTP_404_NOT_FOUND)
        except Exception as e:
            logger.exception(e)
            raise
        else:
            logger.info("END: create")
            return Response(data=NotificationGroupModelSerializer(data).data, status=status.HTTP_201_CREATED)
    def update(self, request, tenant_pk=None, pk=None):
        log = NarukoLogging(request)
        logger = log.get_logger(__name__)
        logger.info("START: update")
        try:
            with transaction.atomic():
                # バリデーション
                notification_group_model = NotificationGroupModel.objects.get(id=pk, tenant_id=tenant_pk)
                serializer = NotificationGroupModelSerializer(
                    instance=notification_group_model,
                    data=request.data,
                    partial=True)
                serializer.is_valid(raise_exception=True)

                data = ControlNotificationUseCase(log).save_group(request.user, serializer.save())
        except (TypeError, ValueError, ObjectDoesNotExist) as e:
            logger.exception(e)
            return Response(status=status.HTTP_404_NOT_FOUND)
        except Exception as e:
            logger.exception(e)
            raise
        else:
            logger.info("END: update")
            return Response(data=NotificationGroupModelSerializer(data).data, status=status.HTTP_200_OK)
Пример #19
0
    def test_verify_sns_notification(self, mock_sns):
        mock_sns.return_value.verify_notification.return_value = True
        data = dict()
        ControlNotificationUseCase(mock.Mock()).verify_sns_notification(data)

        mock_sns.verify_notification.assert_called_with(data)
Пример #20
0
    def test_confirm_subscription(self, mock_sns):
        ControlNotificationUseCase(mock.Mock()).confirm_subscription(
            dict(Token="token", TopicArn="topicarn"))

        mock_sns.assert_called_with(arn="topicarn")
        mock_sns.return_value.confirm_subscription.assert_called_with("token")