Writing tests for your productions
==================================

It's important that once productions have been made that they can be checked, and that their results can be verified.

To make this simple, asimov provides an extension to the built-in python ``unittest.TestCase``.
This provides access to all of the events and productions within an asimov project without the need to write additional boilerplate code.

You can then use tools from ``unittest`` such as asserts and ``subTest`` to construct your tests, whilst having full access to the information in the ledger.

Example: Checking prior files
-----------------------------

.. code-block:: python

   from asimov.testing import AsimovTest

   class TestBilbyPrior(AsimovTest):
       def test_component_chirp_mass(self):
	   """Verify the component chirp mass prior is correct."""

	   for event in self.events:
	       for production in event.productions:
		   if production.pipeline == "bilby":
		       with self.subTest(event=event.title, production=production.name):
			   repo = event.event_object.repository.directory
			   try:
			       with open(f"{repo}/C01_offline/{production.name}.prior", "r") as priorfile:
				   self.assertFalse("name='chirp_mass', minimum=7.932707, maximum=14.759644" in priorfile.read())
			   except FileNotFoundError:
			       pass


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