test_data_convention.py 11.3 KB
Newer Older
Javier Vegas-Regidor's avatar
Javier Vegas-Regidor committed
from unittest import TestCase
from mock import Mock
import mock
import tempfile
Javier Vegas-Regidor's avatar
Javier Vegas-Regidor committed

from earthdiagnostics.data_convention import DataConvention
from earthdiagnostics.modelingrealm import ModelingRealms

Javier Vegas-Regidor's avatar
Javier Vegas-Regidor committed

class TestDataConvention(TestCase):
    def setUp(self):
        self.tmp_dir = tempfile.mkdtemp()
Javier Vegas-Regidor's avatar
Javier Vegas-Regidor committed
        os.mkdir(os.path.join(self.tmp_dir, "expid"))
Javier Vegas-Regidor's avatar
Javier Vegas-Regidor committed
        self.config = Mock()
Javier Vegas-Regidor's avatar
Javier Vegas-Regidor committed
        self.config.frequency = "mon"
        self.config.experiment.experiment_name = "expname"
        self.config.data_dir = self.tmp_dir
Javier Vegas-Regidor's avatar
Javier Vegas-Regidor committed
        self.config.experiment.expid = "expid"
        self.config.cmor.activity = "activity"
Javier Vegas-Regidor's avatar
Javier Vegas-Regidor committed
        self.config.experiment.institute = "institute"
        self.config.experiment.model = "model"
        self.config.experiment.atmos_timestep = 3
        self.config.experiment.ocean_timestep = 6
Javier Vegas-Regidor's avatar
Javier Vegas-Regidor committed
        self.config.cmor.append_startdate = False
Javier Vegas-Regidor's avatar
Javier Vegas-Regidor committed
        self.convention = DataConvention("name", self.config)
    def tearDown(self):
        shutil.rmtree(self.tmp_dir)
Javier Vegas-Regidor's avatar
Javier Vegas-Regidor committed

    def test_get_filename(self):
        with self.assertRaises(NotImplementedError):
Javier Vegas-Regidor's avatar
Javier Vegas-Regidor committed
            self.convention.get_file_name(
                None, None, None, None, None, None, None, None, None, None
            )
Javier Vegas-Regidor's avatar
Javier Vegas-Regidor committed

    def test_get_startdate_path(self):
Javier Vegas-Regidor's avatar
Javier Vegas-Regidor committed
        self.assertEqual(
            self.convention.get_startdate_path("19900101"),
            os.path.join(
                self.tmp_dir,
                "expid/cmorfiles/activity/institute/model/expname",
            ),
        )
Javier Vegas-Regidor's avatar
Javier Vegas-Regidor committed

    def test_experiment_name(self):
Javier Vegas-Regidor's avatar
Javier Vegas-Regidor committed
        self.assertEqual(
            self.convention.experiment_name("19900101"), "expname"
        )
Javier Vegas-Regidor's avatar
Javier Vegas-Regidor committed

    def test_experiment_name_append(self):
        self.config.cmor.append_startdate = True
Javier Vegas-Regidor's avatar
Javier Vegas-Regidor committed
        self.assertEqual(
            self.convention.experiment_name("19900101"), "expnameS19900101"
        )
Javier Vegas-Regidor's avatar
Javier Vegas-Regidor committed

    def test_get_cmor_folder_path(self):
        with self.assertRaises(NotImplementedError):
Javier Vegas-Regidor's avatar
Javier Vegas-Regidor committed
            self.convention.get_cmor_folder_path(
                None, None, None, None, None, None, None
            )
Javier Vegas-Regidor's avatar
Javier Vegas-Regidor committed
    def test_create_links(self):
        with self.assertRaises(NotImplementedError):
            self.convention.create_links(None, None)

    def test_get_member_str(self):
        with self.assertRaises(NotImplementedError):
            self.convention.get_member_str(None)
Javier Vegas-Regidor's avatar
Javier Vegas-Regidor committed

    def test_is_cmorized(self):
        with self.assertRaises(NotImplementedError):
            self.convention.is_cmorized(None, None, None, None)

Javier Vegas-Regidor's avatar
Javier Vegas-Regidor committed
    @mock.patch(
        "earthdiagnostics.data_convention.DataConvention.get_cmor_folder_path",
        autospec=True,
    )
    @mock.patch(
        "earthdiagnostics.data_convention.DataConvention.get_file_name",
        autospec=True,
    )
Javier Vegas-Regidor's avatar
Javier Vegas-Regidor committed
    def test_get_file_path(self, mock_filename, mock_cmor_path):
Javier Vegas-Regidor's avatar
Javier Vegas-Regidor committed
        mock_cmor_path.return_value = "path"
        mock_filename.return_value = "filename"
Javier Vegas-Regidor's avatar
Javier Vegas-Regidor committed
        cmor_var = Mock()
        omon = Mock()
Javier Vegas-Regidor's avatar
Javier Vegas-Regidor committed
        omon.name = "Omon"
Javier Vegas-Regidor's avatar
Javier Vegas-Regidor committed
        cmor_var.get_table.return_value = omon
Javier Vegas-Regidor's avatar
Javier Vegas-Regidor committed
        filepath = self.convention.get_file_path(
            "19900101", 1, ModelingRealms.ocean, "var", cmor_var, 1, "mon"
        )
        self.assertEqual("path/filename", filepath)

    @mock.patch(
        "earthdiagnostics.data_convention.DataConvention.get_cmor_folder_path",
        autospec=True,
    )
    @mock.patch(
        "earthdiagnostics.data_convention.DataConvention.get_file_name",
        autospec=True,
    )
Javier Vegas-Regidor's avatar
Javier Vegas-Regidor committed
    def test_get_file_path_no_freq(self, mock_filename, mock_cmor_path):
Javier Vegas-Regidor's avatar
Javier Vegas-Regidor committed
        mock_cmor_path.return_value = "path"
        mock_filename.return_value = "filename"
        cmor_var = Mock()
        omon = Mock()
Javier Vegas-Regidor's avatar
Javier Vegas-Regidor committed
        omon.name = "Omon"
        cmor_var.get_table.return_value = omon
Javier Vegas-Regidor's avatar
Javier Vegas-Regidor committed
        filepath = self.convention.get_file_path(
            "19900101", 1, ModelingRealms.ocean, "var", cmor_var, 1, None
        )
        self.assertEqual("path/filename", filepath)

    def test_create_link(self):
        file_descriptor, path = tempfile.mkstemp(dir=self.tmp_dir)
        os.close(file_descriptor)
        frequency = Mock()
Javier Vegas-Regidor's avatar
Javier Vegas-Regidor committed
        frequency.folder_name.return_value = "frequency_folder"
        self.convention.create_link(
            ModelingRealms.ocean, path, frequency, "var", None, False, None
        )
        filename = os.path.basename(path)
Javier Vegas-Regidor's avatar
Javier Vegas-Regidor committed
        self.assertTrue(
            os.path.islink(
                os.path.join(
                    self.tmp_dir,
                    "expid",
                    "frequency_folder",
                    "var_f6h",
                    filename,
                )
            )
        )

    def test_create_link_no_source(self):
        file_descriptor, path = tempfile.mkstemp(dir=self.tmp_dir)
        os.close(file_descriptor)
        os.remove(path)
        frequency = Mock()
Javier Vegas-Regidor's avatar
Javier Vegas-Regidor committed
        frequency.folder_name.return_value = "frequency_folder"
        with self.assertRaises(ValueError):
Javier Vegas-Regidor's avatar
Javier Vegas-Regidor committed
            self.convention.create_link(
                ModelingRealms.ocean, path, frequency, "var", None, False, None
            )

    def test_create_link_exists(self):
        file_descriptor, path = tempfile.mkstemp(dir=self.tmp_dir)
        os.close(file_descriptor)
        frequency = Mock()
Javier Vegas-Regidor's avatar
Javier Vegas-Regidor committed
        frequency.folder_name.return_value = "frequency_folder"
        filename = os.path.basename(path)

Javier Vegas-Regidor's avatar
Javier Vegas-Regidor committed
        os.makedirs(
            os.path.join(self.tmp_dir, "expid", "frequency_folder", "var_f6h")
        )
        os.symlink(
            path,
            os.path.join(
                self.tmp_dir, "expid", "frequency_folder", "var_f6h", filename
            ),
        )

        self.convention.create_link(
            ModelingRealms.ocean, path, frequency, "var", None, False, None
        )
        self.assertTrue(
            os.path.islink(
                os.path.join(
                    self.tmp_dir,
                    "expid",
                    "frequency_folder",
                    "var_f6h",
                    filename,
                )
            )
        )

    def test_create_link_default_is_link(self):
        file_descriptor, path = tempfile.mkstemp(dir=self.tmp_dir)
        os.close(file_descriptor)
Javier Vegas-Regidor's avatar
Javier Vegas-Regidor committed
        os.makedirs(
            os.path.join(
                self.tmp_dir, "expid", "frequency_folder", "var-original_f6h"
            )
        )
        os.symlink(
            os.path.join(
                self.tmp_dir, "expid", "frequency_folder", "var-original_f6h"
            ),
            os.path.join(self.tmp_dir, "expid", "frequency_folder", "var_f6h"),
        )
        frequency = Mock()
Javier Vegas-Regidor's avatar
Javier Vegas-Regidor committed
        frequency.folder_name.return_value = "frequency_folder"
        self.convention.create_link(
            ModelingRealms.ocean, path, frequency, "var", None, False, None
        )
        filename = os.path.basename(path)
Javier Vegas-Regidor's avatar
Javier Vegas-Regidor committed
        self.assertTrue(
            os.path.islink(
                os.path.join(
                    self.tmp_dir,
                    "expid",
                    "frequency_folder",
                    "var_f6h",
                    filename,
                )
            )
        )

    def test_create_link_move_old(self):
        file_descriptor, path = tempfile.mkstemp(dir=self.tmp_dir)
        os.close(file_descriptor)
Javier Vegas-Regidor's avatar
Javier Vegas-Regidor committed
        os.makedirs(
            os.path.join(self.tmp_dir, "expid", "frequency_folder", "var_f6h")
        )
        fd = open(
            os.path.join(
                self.tmp_dir,
                "expid",
                "frequency_folder",
                "var_f6h",
                "var_20001101.nc",
            ),
            "w",
        )
        fd.close()

        frequency = Mock()
Javier Vegas-Regidor's avatar
Javier Vegas-Regidor committed
        frequency.folder_name.return_value = "frequency_folder"
        self.convention.create_link(
            ModelingRealms.ocean, path, frequency, "var", None, True, None
        )
        filename = os.path.basename(path)
Javier Vegas-Regidor's avatar
Javier Vegas-Regidor committed
        self.assertTrue(
            os.path.islink(
                os.path.join(
                    self.tmp_dir,
                    "expid",
                    "frequency_folder",
                    "var_f6h",
                    filename,
                )
            )
        )
        self.assertTrue(
            os.path.isfile(
                os.path.join(
                    self.tmp_dir,
                    "expid",
                    "frequency_folder",
                    "old_var_f6h",
                    "var_20001101.nc",
                )
            )
        )

    def test_create_link_with_grid(self):
        file_descriptor, path = tempfile.mkstemp(dir=self.tmp_dir)
        os.close(file_descriptor)
        frequency = Mock()
Javier Vegas-Regidor's avatar
Javier Vegas-Regidor committed
        frequency.folder_name.return_value = "frequency_folder"
        self.convention.create_link(
            ModelingRealms.ocean, path, frequency, "var", "grid", False, None
        )
        filename = os.path.basename(path)
Javier Vegas-Regidor's avatar
Javier Vegas-Regidor committed
        var_mainfolder = os.path.join(
            self.tmp_dir, "expid", "frequency_folder", "var_f6h"
        )
        var_grid_folder = os.path.join(
            self.tmp_dir, "expid", "frequency_folder", "var-grid_f6h"
        )
        self.assertTrue(os.path.islink(var_mainfolder))
Javier Vegas-Regidor's avatar
Javier Vegas-Regidor committed
        self.assertTrue(
            os.path.islink(os.path.join(var_grid_folder, filename))
        )
        self.assertTrue(os.readlink(var_mainfolder), var_grid_folder)

    def test_create_link_with_grid_default_is_link(self):
        file_descriptor, path = tempfile.mkstemp(dir=self.tmp_dir)
        os.close(file_descriptor)
Javier Vegas-Regidor's avatar
Javier Vegas-Regidor committed
        os.makedirs(
            os.path.join(
                self.tmp_dir, "expid", "frequency_folder", "var-original_f6h"
            )
        )
        os.symlink(
            os.path.join(
                self.tmp_dir, "expid", "frequency_folder", "var-original_f6h"
            ),
            os.path.join(self.tmp_dir, "expid", "frequency_folder", "var_f6h"),
        )

        frequency = Mock()
Javier Vegas-Regidor's avatar
Javier Vegas-Regidor committed
        frequency.folder_name.return_value = "frequency_folder"
        self.convention.create_link(
            ModelingRealms.ocean, path, frequency, "var", "grid", False, None
        )
        filename = os.path.basename(path)
Javier Vegas-Regidor's avatar
Javier Vegas-Regidor committed
        var_mainfolder = os.path.join(
            self.tmp_dir, "expid", "frequency_folder", "var_f6h"
        )
        var_grid_folder = os.path.join(
            self.tmp_dir, "expid", "frequency_folder", "var-grid_f6h"
        )
        self.assertTrue(os.path.islink(var_mainfolder))
Javier Vegas-Regidor's avatar
Javier Vegas-Regidor committed
        self.assertTrue(
            os.path.islink(os.path.join(var_grid_folder, filename))
        )
        self.assertTrue(os.readlink(var_mainfolder), var_grid_folder)

    def test_create_link_with_grid_default_is_folder(self):
        file_descriptor, path = tempfile.mkstemp(dir=self.tmp_dir)
        os.close(file_descriptor)
Javier Vegas-Regidor's avatar
Javier Vegas-Regidor committed
        os.makedirs(
            os.path.join(self.tmp_dir, "expid", "frequency_folder", "var_f6h")
        )

        frequency = Mock()
Javier Vegas-Regidor's avatar
Javier Vegas-Regidor committed
        frequency.folder_name.return_value = "frequency_folder"
        self.convention.create_link(
            ModelingRealms.ocean, path, frequency, "var", "grid", False, None
        )
        filename = os.path.basename(path)
Javier Vegas-Regidor's avatar
Javier Vegas-Regidor committed
        var_mainfolder = os.path.join(
            self.tmp_dir, "expid", "frequency_folder", "var_f6h"
        )
        var_grid_folder = os.path.join(
            self.tmp_dir, "expid", "frequency_folder", "var-grid_f6h"
        )
        self.assertTrue(os.path.islink(var_mainfolder))
Javier Vegas-Regidor's avatar
Javier Vegas-Regidor committed
        self.assertTrue(
            os.path.islink(os.path.join(var_grid_folder, filename))
        )
        self.assertTrue(os.readlink(var_mainfolder), var_grid_folder)