# Copyright (C) 2009 Lars Wirzenius # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . import datetime import os import tempfile import unittest import dimbola class MockExiv2Image(dict): def __init__(self): dict.__init__(self) self["Exif.Image.DateTime"] = datetime.datetime(2009, 4, 11, 8, 6, 38) def exifKeys(self): return self.keys() class MockOptions: def __init__(self): self.rename = False self.template = "" self.input = "/foo" self.output = "/bar" self.verbose = False class ImageDictTests(unittest.TestCase): def setUp(self): mock_image = MockExiv2Image() self.dict = dimbola.ImageDict("/foo/img_1234.cr2", mock_image, 42) def test_gets_input_suffix_when_one_exists(self): suffix = self.dict.get_input_suffix("/foo.bar/img_1234.cr2") self.assertEqual(suffix, ".cr2") def test_returns_empty_input_suffix_when_none_exists(self): suffix = self.dict.get_input_suffix("/foo/bar.foobar/yeehaa") self.assertEqual(suffix, "") def test_returns_camera_counter_from_filename(self): counter = self.dict.get_camera_counter("/foo/bar_1234.suffix5678") self.assertEqual(counter, "1234") def test_returns_empty_string_when_no_camera_counter_in_filename(self): counter = self.dict.get_camera_counter("/foo/bar.suffix5678") self.assertEqual(counter, "") def test_sets_username_to_nonempty_string(self): self.assertNotEqual(self.dict["username"], "") def test_sets_suffix_to_input_filename_suffix(self): self.assertEqual(self.dict["suffix"], ".cr2") def test_sets_camera_counter_from_input_filename(self): self.assertEqual(self.dict["cameracounter"], "1234") def test_sets_counter_correctly(self): self.assertEqual(self.dict["counter"], 42) def test_sets_date_correctly(self): self.assertEqual(self.dict["date"], "2009-04-11") def test_sets_year_correctly(self): self.assertEqual(self.dict["year"], 2009) def test_sets_month_correctly(self): self.assertEqual(self.dict["month"], 04) def test_sets_day_correctly(self): self.assertEqual(self.dict["day"], 11) def test_sets_hour_correctly(self): self.assertEqual(self.dict["hour"], 8) def test_sets_min_correctly(self): self.assertEqual(self.dict["min"], 6) def test_sets_sec_correctly(self): self.assertEqual(self.dict["sec"], 38) def test_sets_exif_with_prefix(self): self.assert_("Exif.Image.DateTime" in self.dict) def test_sets_exif_without_prefix(self): self.assert_("DateTime" in self.dict) class CopierTests(unittest.TestCase): def setUp(self): self.options = MockOptions() self.importer = dimbola.Copier() def test_initializes_counter_to_zero(self): self.assertEqual(self.importer.counter, 0) def test_increments_counter_when_copying_a_file(self): fd, tempname = tempfile.mkstemp() os.close(fd) os.remove(tempname) self.importer.output_name = lambda *args: tempname self.importer.copy_file('/dev/null', self.options) def test_has_nonempty_list_of_known_image_types(self): self.assert_(self.importer.known_image_types) def test_uses_basename_of_input_for_output_when_no_renaming(self): self.assertEqual(self.importer.output_name("/foo/img_1234.cr2", self.options), "/bar/img_1234.cr2") def test_uses_template_when_renaming(self): self.options.template = "%(date)s-%(cameracounter)s%(suffix)s" self.options.rename = True self.importer.read_exif = lambda s: MockExiv2Image() self.assertEqual(self.importer.output_name("/foo/img_1234.cr2", self.options), "/bar/2009-04-11-1234.cr2")