"""Expectation diff tests for continuous_tests.protoascii configs."""

import unittest

from catatester import config_utils


_FAILURE_MSG = (
    '{} config does not match expectation!\n\n' +
    'To update expectations, run:\n' +
    '```\n' +
    'python continuous-tests/catatester/config_expectations_update.py\n' +
    '```')


def _read_expectation(path):
  with open(path) as f:
    return f.read()


class ConfigExpectationsTest(unittest.TestCase):

  def testVerifyProdExpectation(self):
    """Verify prod config matches expectation."""
    message = config_utils.parse_continuous_tests_protoascii(
        config_utils.PROD_CONFIG_PATH)
    expectation = _read_expectation(config_utils.PROD_EXPECTATION_PATH)
    self.assertEqual(expectation, str(message), _FAILURE_MSG.format('Prod'))

  def testVerifyStagingExpectation(self):
    """Verify staging config matches expectation."""
    message = config_utils.parse_continuous_tests_protoascii(
        config_utils.STAGING_CONFIG_PATH)
    expectation = _read_expectation(config_utils.STAGING_EXPECTATION_PATH)
    self.assertEqual(expectation, str(message), _FAILURE_MSG.format('Staging'))


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