def setUp(self):
        """
        Initialises common tests attributes.
        """

        self._data = json_open('https://zenodo.org/api/records/3245883')
        self._configuration = Configuration()

        self._record = Record(self._data, self._configuration)
    def test__init__(self):
        """
        Tests :func:`colour_datasets.records.zenodo.Record.__init__` method.
        """

        record = Record(self._data, self._configuration)

        self.assertEqual(record.title, 'Camera Spectral Sensitivity Database')
    def test_from_id(self):
        """
        Tests :func:`colour_datasets.records.zenodo.Record.from_id` method.
        """

        record = Record.from_id('3245883')

        self.assertIsInstance(record, Record)
        self.assertEqual(record.title, 'Camera Spectral Sensitivity Database')
class TestRecord(unittest.TestCase):
    """
    Defines :class:`colour_datasets.records.zenodo.Record` class unit tests
    methods.
    """
    def setUp(self):
        """
        Initialises common tests attributes.
        """

        self._data = json_open('https://zenodo.org/api/records/3245883')
        self._configuration = Configuration()

        self._record = Record(self._data, self._configuration)

    def test_required_attributes(self):
        """
        Tests presence of required attributes.
        """

        required_attributes = ('data', 'configuration', 'repository', 'id',
                               'title')

        for attribute in required_attributes:
            self.assertIn(attribute, dir(Record))

    def test_required_methods(self):
        """
        Tests presence of required methods.
        """

        required_methods = ('__init__', '__str__', '__repr__', 'from_id',
                            'synced', 'pull', 'remove')

        for method in required_methods:
            self.assertIn(method, dir(Record))

    def test_configuration(self):
        """
        Tests :func:colour_datasets.records.zenodo.Record.configuration`
        property.
        """

        self.assertEqual(self._record.configuration, self._configuration)

    def test_data(self):
        """
        Tests :func:colour_datasets.records.zenodo.Record.data` property.
        """

        self.assertEqual(self._record.data, self._data)

    def test_repository(self):
        """
        Tests :func:colour_datasets.records.zenodo.Record.repository`
        property.
        """

        self.assertEqual(
            self._record.repository,
            os.path.join(self._configuration.repository, '3245883'))

    def test_id(self):
        """
        Tests :func:colour_datasets.records.zenodo.Record.id` property.
        """

        self.assertEqual(self._record.id, '3245883')

    def test_title(self):
        """
        Tests :func:colour_datasets.records.zenodo.Record.title`
        property.
        """

        self.assertEqual(self._record.title,
                         'Camera Spectral Sensitivity Database')

    def test__init__(self):
        """
        Tests :func:`colour_datasets.records.zenodo.Record.__init__` method.
        """

        record = Record(self._data, self._configuration)

        self.assertEqual(record.title, 'Camera Spectral Sensitivity Database')

    def test__str__(self):
        """
        Tests :func:`colour_datasets.records.zenodo.Record.__str__` method.
        """

        if six.PY2:
            return

        self.assertEqual(
            str(self._record),
            textwrap.dedent("""
Camera Spectral Sensitivity Database - 1.0.0
============================================

Record ID        : 3245883
Authors          : Jiang, Jun; Liu, Dengyu; Gu, Jinwei; Süsstrunk, Sabine
License          : CC-BY-NC-SA-4.0
DOI              : 10.5281/zenodo.3245883
Publication Date : 2019-06-14
URL              : https://zenodo.org/record/3245883

Description
-----------

Source URL: http://www.gujinwei.org/research/camspec/db.html Source DOI:
10.1109/WACV.2013.6475015 Camera spectral sensitivity functions relate scene
radiance with captured RGB triplets. They are important for many computer
vision tasks that use color information, such as multispectral imaging, and
color constancy. We create a database of 28 cameras covering a variety of
types. The database contains the spectral sensitivity functions for 28 cameras,
including professional DSLRs, point-and-shoot, industrial and mobile phone
camera. We use a spectrometer PR655 from Photo Research Inc., a light source
and monochrometer combined with an integrating sphere to do the measurement.
Each measurement starts from wavelength 400nm to 720nm in an interval of 10nm.
Measured Sensitivities are normalized to 1 for RGB channels seperately. The
database is in the form of a text file. Each entry starts with camera name and
follows by measured spectral sensitivities in red, green and blue channel.

Files
-----

- camlist&equipment.txt : https://zenodo.org/api/files/\
a9c418ed-c354-4a90-abc7-5f88c89de741/camlist%26equipment.txt
- camspec_database.txt : https://zenodo.org/api/files/\
a9c418ed-c354-4a90-abc7-5f88c89de741/camspec_database.txt
- urls.txt : https://zenodo.org/api/files/\
a9c418ed-c354-4a90-abc7-5f88c89de741/urls.txt""")[1:])

    def test__repr__(self):
        """
        Tests :func:`colour_datasets.records.zenodo.Record.__repr__` method.
        """

        if six.PY2:
            return

        self.assertIsInstance(
            eval(repr(self._record), {}, {
                'Record': Record,
                'Configuration': Configuration
            }), Record)

    def test_from_id(self):
        """
        Tests :func:`colour_datasets.records.zenodo.Record.from_id` method.
        """

        record = Record.from_id('3245883')

        self.assertIsInstance(record, Record)
        self.assertEqual(record.title, 'Camera Spectral Sensitivity Database')

    def test_synced(self):
        """
        Tests :func:`colour_datasets.records.zenodo.Record.synced` method.
        """

        self._record.pull()
        self.assertTrue(self._record.synced())
        self._record.remove()
        self.assertFalse(self._record.synced())

    def test_pull(self):
        """
        Tests :func:`colour_datasets.records.zenodo.Record.pull` method.
        """

        self._record.remove()
        self._record.pull()
        self.assertTrue(self._record.synced())

    def test_remove(self):
        """
        Tests :func:`colour_datasets.records.zenodo.Record.remove` method.
        """

        self._record.pull()
        self._record.remove()
        self.assertFalse(self._record.synced())