import json
import unittest
from app.metadata_runtime import publisher_from_environment


class DemoLimitsTest(unittest.TestCase):
    def test_exact_message_limit_and_latest_queue(self):
        publisher = publisher_from_environment({
            'CONTEXTRA_METADATA_ENABLED': 'true',
            'CONTEXTRA_METADATA_REDIS_URL': 'redis://test:fixture@127.0.0.1:1/0',
            'CONTEXTRA_METADATA_MAX_MESSAGE_BYTES': str(10 * 1024**2),
            'CONTEXTRA_METADATA_MAX_BYTES': str(256 * 1024**2),
        })
        publisher.channel('demo', 'r', 1, 'RUNNING')
        payload = dict(cameraId='demo', runId='r', runGeneration=1, frameSeq=0, pad='')
        payload['pad'] = 'x' * (publisher.settings.max_message_bytes - len(json.dumps(payload, separators=(',', ':')).encode()))
        self.assertTrue(publisher.submit(payload))
        self.assertEqual(publisher.metrics()['queuedBytes'], 10 * 1024**2)
        payload['frameSeq'] = 1
        payload['pad'] += 'x'
        self.assertFalse(publisher.submit(payload))
        self.assertEqual(publisher.metrics()['message_limit'], 1)
        self.assertEqual(publisher.metrics()['queued'], 1)
        self.assertEqual(publisher.settings.stream_length, 100)
        self.assertEqual(publisher.settings.stream_ttl, 10)
        publisher.close()


if __name__ == '__main__':
    unittest.main()
