Example #1
0
 def test_message_queue_integration_enqueue_single_message(self):
     """Test that Queue enqueues single message properly"""
     tq = Queue(self.config)
     message = {"key": "value"}
     tq.enqueue(message)
     tq.engine.producer.close()
     self.assertEqual(get_kafka_end_offset(tq, self.queue_name), 1)
Example #2
0
    def test_cli_integration_enqueues_raw(self):
        """Test that CLI enqueues raw messages from CLI options"""

        tq = Queue(self.config)
        self.assertEqual(get_kafka_end_offset(tq, self.queue_name), 0)

        runner = CliRunner()

        with runner.isolated_filesystem():
            with open("raw_input.txt", "w") as f:
                f.write(
                    '{"raw-key-1": "raw-value-1"}\n{"raw-key-2": "raw-value-2"}\n'
                )

            result = runner.invoke(
                cli.main,
                [
                    "--broker-url",
                    self.broker_url,
                    "--queue-name",
                    self.queue_name,
                    "enqueue-raw",
                    "--message-input",
                    "raw_input.txt",
                ],
                obj={},
            )
        self.assertTrue(result.exit_code == 0)
        self.assertEqual(get_kafka_end_offset(tq, self.queue_name), 2)

        result = tq.dequeue()
        self.assertEqual(result, b'{"raw-key-1": "raw-value-1"}')
        result = tq.dequeue()
        self.assertEqual(result, b'{"raw-key-2": "raw-value-2"}')
Example #3
0
 def setUp(self):
     self.broker_url = "memory://"
     self.queue_name = "test-message-queue"
     self.config = deepcopy(Queue.get_default_config())
     self.config["BROKER_URL"] = self.broker_url
     self.config["QUEUE_NAME"] = self.queue_name
     self.tq = Queue(self.config)
Example #4
0
    def test_message_queue_unit_enqueue(self, mock_connection):
        """Test that Queue mock enqueues message"""

        message = {"key": "value"}
        tq = Queue(self.config)
        tq.enqueue(message)
        tq.engine.queue.put.assert_called_once_with(message)
Example #5
0
    def test_message_queue_integration_connection(self):
        """Test that Queue connects properly"""

        with closing(Queue(self.config)) as tq:
            self.assertTrue(tq.engine.conn.connected)

        self.assertFalse(tq.engine.conn.connected)
Example #6
0
def enqueue(ctx: click.core.Context, message_entry: Tuple[Tuple[str, str]]):
    """Enqueue a message in the key/value format to the queue"""

    # Convert input key/value to message
    message: Dict[str, str] = {k: v for (k, v) in message_entry}
    with closing(Queue(ctx.obj)) as queue:
        queue.enqueue(message)
Example #7
0
 def setUp(self):
     self.broker_url = CONFIG_TEST_IN_MEMORY_URL
     self.queue_name = "test-message-queue"
     self.config = deepcopy(Queue.get_default_config())
     self.config["BROKER_URL"] = self.broker_url
     self.config["QUEUE_NAME"] = self.queue_name
     self.tq = Queue(self.config)
Example #8
0
    def test_cli_integration_enqueues_message_multiple_keys(self):
        """Test that CLI enqueues message from CLI options"""
        tq = Queue(self.config)
        self.assertEqual(get_kafka_end_offset(tq, self.queue_name), 0)

        runner = CliRunner()
        result = runner.invoke(
            cli.main,
            [
                "--broker-url",
                self.broker_url,
                "--queue-name",
                self.queue_name,
                "enqueue",
                "--message-entry",
                "k1",
                "v1",
                "--message-entry",
                "k2",
                "v2",
                "--message-entry",
                "k3",
                "v3",
            ],
            obj={},
        )
        self.assertTrue(result.exit_code == 0)
        self.assertEqual(get_kafka_end_offset(tq, self.queue_name), 1)

        result = tq.dequeue()
        self.assertEqual(result, b'{"k1": "v1", "k2": "v2", "k3": "v3"}')
Example #9
0
    def test_message_queue_unit_dequeue_empty(self, mock_producer,
                                              mock_consumer):
        """Test that Queue mock dequeues empty message"""

        tq = Queue(self.config)
        tq.engine.consumer.__next__.side_effect = StopIteration()
        self.assertEqual(tq.dequeue(), "{}")
Example #10
0
    def test_cli_integration_dequeues_batch(self):
        """Test that CLI dequeues batched message from CLI"""
        tq = Queue(self.config)

        self.assertEqual(get_kafka_end_offset(tq, self.queue_name), 0)
        for i in range(3):
            message = {f"cli-input-key-{i}": f"cli-input-value-{i}"}
            tq.enqueue(message)
        tq.engine.producer.close()

        self.assertEqual(get_kafka_end_offset(tq, self.queue_name), 3)

        runner = CliRunner()
        result = runner.invoke(
            cli.main,
            [
                "--broker-url",
                self.broker_url,
                "--queue-name",
                self.queue_name,
                "dequeue",
                "--batch",
                "3",
            ],
            obj={},
        )

        self.assertTrue(result.exit_code == 0)

        expected_messages = [
            '{"cli-input-key-0": "cli-input-value-0"}\n',
            '{"cli-input-key-1": "cli-input-value-1"}\n',
            '{"cli-input-key-2": "cli-input-value-2"}\n',
        ]
        self.assertEqual(result.output, "".join(expected_messages))
Example #11
0
    def test_message_queue_unit_enqueue(self, mock_producer, mock_consumer):
        """Test that Queue mock enqueues message"""

        message = {"key": "value"}
        tq = Queue(self.config)
        tq.enqueue(message)
        tq.engine.producer.send.assert_called_once_with(self.queue_name,
                                                        value=message)
Example #12
0
    def test_message_queue_unit_dequeue_raises_empty(self, mock_producer,
                                                     mock_consumer):
        """Test that Queue mock dequeues raises on empty message"""

        self.config["RAISE_ON_EMPTY_DEQUEUE"] = True
        tq = Queue(self.config)
        tq.engine.consumer.__next__.side_effect = EmptyQueueException()
        with self.assertRaises(EmptyQueueException):
            tq.dequeue()
Example #13
0
    def test_message_queue_unit_dequeue(self, mock_producer, mock_consumer):
        """Test that Queue mock dequeues message"""

        tq = Queue(self.config)
        message = {"key": "value"}
        msg = mock.Mock()
        msg.value = message
        tq.engine.consumer.__next__.return_value = msg
        result = tq.dequeue()
        tq.engine.consumer.__next__.assert_called_once()
        self.assertDictEqual(result, message)
Example #14
0
    def test_message_queue_unit_close(self, mock_producer, mock_consumer):
        """Test that Queue connections are closed properly"""

        with closing(Queue(self.config)) as tq:
            tq.engine.consumer.commit.assert_not_called()
            tq.engine.consumer.close.assert_not_called()
            tq.engine.producer.close.assert_not_called()

        tq.engine.consumer.commit.assert_called_once()
        tq.engine.consumer.close.assert_called_once()
        tq.engine.producer.close.assert_called_once()
Example #15
0
    def test_message_queue_unit_close(self, mock_connection):
        """Test that Queue connections are closed properly"""

        mock_conn_obj = mock.Mock()
        mock_connection.return_value = mock_conn_obj

        with closing(Queue(self.config)) as tq:
            tq.engine.queue.close.assert_not_called()
            tq.engine.conn.release.assert_not_called()

        tq.engine.queue.close.assert_called_once()
        tq.engine.conn.release.assert_called_once()
Example #16
0
 def test_message_queue_integration_dequeue_single_message(self):
     """Test that Queue dequeues single message properly"""
     tq = Queue(self.config)
     self.assertEqual(get_kafka_end_offset(tq, self.queue_name), 0)
     message = {"key-kafka-dequeue": "value"}
     tq.enqueue(message)
     tq.engine.producer.close()
     self.assertEqual(get_kafka_end_offset(tq, self.queue_name), 1)
     result = tq.dequeue()
     tq.engine.consumer.commit()
     self.assertEqual(result, b'{"key-kafka-dequeue": "value"}')
     self.assertEqual(get_kafka_committed_offset(tq, self.queue_name), 1)
Example #17
0
    def test_message_queue_unit_dequeue(self, mock_connection):
        """Test that Queue mock dequeues message"""

        msg = mock.Mock()
        msg.body = b'{"key-kombu-dequeue": "value"}'
        tq = Queue(self.config)
        tq.engine.queue.get.return_value = msg
        result = tq.dequeue()
        tq.engine.queue.get.assert_called_once_with(
            block=True,
            timeout=self.config["DEQUEUE_TIMEOUT"],
        )
        self.assertEqual(result, b'{"key-kombu-dequeue": "value"}')
Example #18
0
    def test_message_queue_unit_init(self, mock_connection):
        """Test that Queue attributes are set properly"""

        mock_conn_obj = mock.Mock()
        mock_connection.return_value = mock_conn_obj

        tq = Queue(self.config)
        self.assertEqual(tq.engine.name, self.queue_name)
        self.assertEqual(tq.engine.broker_url, self.broker_url)
        mock_connection.assert_called_once_with(
            self.broker_url, connect_timeout=self.config["CONNECTION_TIMEOUT"])
        mock_conn_obj.SimpleQueue.assert_called_once_with(self.queue_name,
                                                          serializer="json")
Example #19
0
def enqueue_raw(
    ctx: click.core.Context,
    message_input: TextIOWrapper,
    raise_on_serialization_error: bool,
):
    """Enqueue raw json formatted messages to the queue"""

    with closing(Queue(ctx.obj)) as queue:
        for line in message_input:
            try:
                message = json.loads(line)
                queue.enqueue(message)
            except JSONDecodeError as exc:
                if raise_on_serialization_error:
                    raise exc
                click.echo(f"Cannot decode JSON: {repr(line)}")
                click.echo(exc, err=True)
Example #20
0
    def test_message_queue_integration_dequeue_multiple_messages(self):
        """Test that Queue dequeues multiple message properly"""
        tq = Queue(self.config)
        self.assertEqual(get_kafka_end_offset(tq, self.queue_name), 0)

        messages = [
            {
                "key1": "value1"
            },
            {
                "key2": "value2"
            },
            {
                "key3": "value3"
            },
            {
                "key4": "value4"
            },
        ]

        for message in messages:
            tq.enqueue(message)

        tq.engine.producer.close()
        self.assertEqual(get_kafka_end_offset(tq, self.queue_name), 4)

        result = tq.dequeue()
        tq.engine.consumer.commit()
        self.assertEqual(result, b'{"key1": "value1"}')
        self.assertEqual(get_kafka_committed_offset(tq, self.queue_name), 1)

        result = tq.dequeue()
        tq.engine.consumer.commit()
        self.assertEqual(result, b'{"key2": "value2"}')
        self.assertEqual(get_kafka_committed_offset(tq, self.queue_name), 2)

        result = tq.dequeue()
        tq.engine.consumer.commit()
        self.assertEqual(result, b'{"key3": "value3"}')
        self.assertEqual(get_kafka_committed_offset(tq, self.queue_name), 3)

        result = tq.dequeue()
        tq.engine.consumer.commit()
        self.assertEqual(result, b'{"key4": "value4"}')
        self.assertEqual(get_kafka_committed_offset(tq, self.queue_name), 4)
Example #21
0
    def test_message_queue_unit_init(self, mock_producer, mock_consumer):
        """Test that Queue attributes are set properly"""

        tq = Queue(self.config)
        self.assertEqual(tq.engine.topic, self.queue_name)
        self.assertListEqual(tq.engine.servers,
                             ["kafka_hostname1", "kafka_hostname2"])
        mock_producer.assert_called_once_with(
            bootstrap_servers=["kafka_hostname1", "kafka_hostname2"],
            value_serializer=KafkaEngine.serializer,
        )
        mock_consumer.assert_called_once_with(
            self.queue_name,
            bootstrap_servers=["kafka_hostname1", "kafka_hostname2"],
            auto_offset_reset=self.config["CONSUMER_AUTO_OFFSET_RESET"],
            enable_auto_commit=self.config["CONSUMER_AUTOCOMMIT"],
            group_id="poppy-test-message-queue",
            consumer_timeout_ms=float("inf"),
        )
Example #22
0
    def test_cli_integration_dequeues_empty(self):
        """Test that CLI dequeues empty message from CLI"""
        tq = Queue(self.config)
        self.assertEqual(get_kafka_end_offset(tq, self.queue_name), 0)

        runner = CliRunner()
        result = runner.invoke(
            cli.main,
            [
                "--broker-url",
                self.broker_url,
                "--queue-name",
                self.queue_name,
                "dequeue",
                "--blocking-dequeue-timeout",
                "10",
            ],
            obj={},
        )
        self.assertTrue(result.exit_code == 0)
Example #23
0
def dequeue(
    ctx: click.core.Context,
    batch: int,
    exit_on_empty: bool,
    blocking_dequeue_timeout: int,
    dequeue_raise_on_empty: bool,
    consumer_group_id: str,
    consumer_autocommit: bool,
    consumer_auto_offset_reset: str,
):
    """Dequeue message from the queue"""

    ctx.obj["DEQUEUE_TIMEOUT"] = blocking_dequeue_timeout
    ctx.obj["RAISE_ON_EMPTY_DEQUEUE"] = dequeue_raise_on_empty
    ctx.obj["CONSUMER_AUTOCOMMIT"] = consumer_autocommit
    ctx.obj["CONSUMER_AUTO_OFFSET_RESET"] = consumer_auto_offset_reset
    ctx.obj["DEQUEUE_EXIT_ON_EMPTY"] = exit_on_empty

    if consumer_group_id:
        ctx.obj["CONSUMER_GROUP_ID"] = consumer_group_id

    if exit_on_empty and not blocking_dequeue_timeout:
        msg = "--exit-on-empty needs to be combined with --blocking-dequeue-timeout argument"
        raise click.exceptions.ClickException(msg)

    if exit_on_empty and not dequeue_raise_on_empty:
        msg = "--exit-on-empty needs to be combined with --dequeue-raise-on-empty=True"
        raise click.exceptions.ClickException(msg)

    with closing(Queue(ctx.obj)) as queue:
        for _ in range(batch):
            try:
                message = queue.dequeue()
                click.echo(message)
            except EmptyQueueException as exc:
                if exit_on_empty:
                    msg = "Queue is empty"
                    click.echo(msg, err=True)
                    sys.exit(100)
                raise exc
Example #24
0
    def test_cli_integration_dequeues_message(self):
        """Test that CLI dequeues message from CLI"""
        tq = Queue(self.config)
        message = {"cli-input-key": "cli-input-value"}
        self.assertEqual(get_kafka_end_offset(tq, self.queue_name), 0)
        tq.enqueue(message)
        tq.engine.producer.close()
        self.assertEqual(get_kafka_end_offset(tq, self.queue_name), 1)

        runner = CliRunner()
        result = runner.invoke(
            cli.main,
            [
                "--broker-url",
                self.broker_url,
                "--queue-name",
                self.queue_name,
                "dequeue",
            ],
            obj={},
        )
        self.assertTrue(result.exit_code == 0)
        self.assertEqual({"cli-input-key": "cli-input-value"}, message)
Example #25
0
    def test_message_queue_integration_enqueue_multiple_messages(self):
        """Test that Queue enqueues multiple messages properly"""
        tq = Queue(self.config)
        self.assertEqual(get_kafka_end_offset(tq, self.queue_name), 0)

        messages = [
            {
                "key1": "value1"
            },
            {
                "key2": "value2"
            },
            {
                "key3": "value3"
            },
            {
                "key4": "value4"
            },
        ]
        for message in messages:
            tq.enqueue(message)

        tq.engine.producer.close()
        self.assertEqual(get_kafka_end_offset(tq, self.queue_name), 4)