def test_worker(self):
        request_id = uuid.uuid4()

        def mock_send(_, request, **kwargs):
            """
            Mocked implementation of Session.send() that always returns a 200 HTTP
            status code.
            """
            webhook = Webhook.objects.get(type_create=True)
            signature = generate_signature(request.body, webhook.secret)

            # Validate the outgoing request headers
            self.assertEqual(request.headers["Content-Type"],
                             webhook.http_content_type)
            self.assertEqual(request.headers["X-Hook-Signature"], signature)

            # Validate the outgoing request body
            body = json.loads(request.body)
            self.assertEqual(body["event"], ObjectChangeAction.CREATE)
            self.assertEqual(body["timestamp"], job.args[4])
            self.assertEqual(body["model"], "autonomoussystem")
            self.assertEqual(body["username"], "testuser")
            self.assertEqual(body["request_id"], str(request_id))
            self.assertEqual(body["data"]["name"], "Guillaume Mazoyer")

            return HttpResponse()

        # Enqueue a webhook for processing
        a_s = AutonomousSystem.objects.create(asn=201281,
                                              name="Guillaume Mazoyer")
        enqueue_webhooks(a_s, self.user, request_id, ObjectChangeAction.CREATE)

        job = self.queue.jobs[0]
        with patch.object(Session, "send", mock_send):
            process_webhook(*job.args)
Beispiel #2
0
def _handle_deleted_object(request, sender, instance, **kwargs):
    """
    Fires when an object is deleted.
    """
    # Record an ObjectChange if applicable
    if hasattr(instance, "get_change"):
        change = instance.get_change(ObjectChangeAction.DELETE)
        change.user = request.user
        change.request_id = request.id
        change.save()

    # Enqueue webhooks
    enqueue_webhooks(instance, request.user, request.id,
                     ObjectChangeAction.DELETE)

    # Increment metric counters
    model_deletes.labels(instance._meta.model_name).inc()
Beispiel #3
0
def _handle_deleted_object(request, sender, instance, **kwargs):
    """
    Fires when an object is deleted.
    """
    # Ignore object without the right method
    if not hasattr(instance, "to_objectchange"):
        return

    # Record an object change
    change = instance.to_objectchange(ObjectChangeAction.DELETE)
    change.user = request.user
    change.request_id = request.id
    change.save()

    # Enqueue webhooks
    enqueue_webhooks(instance, request.user, request.id, ObjectChangeAction.DELETE)

    # Increment metric counters
    model_deletes.labels(instance._meta.model_name).inc()
Beispiel #4
0
def _handle_changed_object(request, sender, instance, **kwargs):
    """
    Fires when an object is created or updated.
    """
    # Ignore object without the right method
    if not hasattr(instance, "to_objectchange"):
        return

    # Queue the object for processing once the request completes
    if kwargs.get("created"):
        action = ObjectChangeAction.CREATE
    elif "created" in kwargs:
        action = ObjectChangeAction.UPDATE
    elif kwargs.get("action") in ["post_add", "post_remove"] and kwargs["pk_set"]:
        # m2m_changed with objects added or removed
        action = ObjectChangeAction.UPDATE
    else:
        return

    # Record an object change
    change = instance.to_objectchange(action)
    change.user = request.user
    change.request_id = request.id
    change.save()

    # Enqueue webhooks
    enqueue_webhooks(instance, request.user, request.id, action)

    # Increment metric counters
    if action == ObjectChangeAction.CREATE:
        model_inserts.labels(instance._meta.model_name).inc()
    elif action == ObjectChangeAction.UPDATE:
        model_updates.labels(instance._meta.model_name).inc()

    # Housekeeping: 0.1% chance of clearing out expired ObjectChanges
    if settings.CHANGELOG_RETENTION and random.randint(1, 1000) == 1:
        date_limit = timezone.now() - timedelta(days=settings.CHANGELOG_RETENTION)
        ObjectChange.objects.filter(time__lt=date_limit)._raw_delete(
            using=DEFAULT_DB_ALIAS
        )