import os
import unittest
from types import SimpleNamespace
from unittest.mock import patch

from app.capture_trial import NoCaptureTrial, no_capture_enabled
from app.event_capture import EventCapture


class CaptureTrialTest(unittest.TestCase):
    def test_default_and_strict_option(self):
        with patch.dict(os.environ, {}, clear=True):
            self.assertFalse(no_capture_enabled())
        with patch.dict(os.environ, CONTEXTRA_TEST_NO_CAPTURE='1'):
            with self.assertRaises(ValueError):
                no_capture_enabled()

    def test_no_native_cache_store_training_or_worker_and_frozen_option(self):
        with patch.dict(os.environ, CONTEXTRA_TEST_NO_CAPTURE='true'), \
                patch('app.event_capture.ArtifactConfig.from_environment') as config, \
                patch('app.event_capture.EncodedCache') as cache, \
                patch('app.training_capture.TrainingCapture') as training:
            capture = EventCapture.from_environment({})
            self.assertIsInstance(capture, NoCaptureTrial)
            config.assert_not_called(); cache.assert_not_called(); training.assert_not_called()
        with patch.dict(os.environ, CONTEXTRA_TEST_NO_CAPTURE='false'):
            self.assertTrue(capture.submit(SimpleNamespace(events=('a', 'b'))))
        status = capture.status()
        self.assertEqual(status['event_candidates_suppressed'], 2)
        self.assertFalse(status['delivery_enabled'])
        self.assertNotIn('accepted', status)
        self.assertTrue(capture.close(0))
        self.assertFalse(capture.submit(SimpleNamespace(events=('c',))))
        self.assertEqual(capture.status()['event_candidates_suppressed'], 2)


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