X-Git-Url: https://git.stderr.nl/gitweb?a=blobdiff_plain;f=tests%2Fspecs%2Fpersistence%2Fprojects_directory_spec.py;fp=tests%2Fspecs%2Fpersistence%2Fprojects_directory_spec.py;h=8f5e20f565bdbf01bc9ff53f989f82c6d3966da7;hb=826cc2e9923c858d3c6a86c04f371cfb326e1728;hp=0000000000000000000000000000000000000000;hpb=44f7fa2ef41d54548aa800b2bb71a886261c5046;p=matthijs%2Fupstream%2Fmobilegtd.git diff --git a/tests/specs/persistence/projects_directory_spec.py b/tests/specs/persistence/projects_directory_spec.py new file mode 100644 index 0000000..8f5e20f --- /dev/null +++ b/tests/specs/persistence/projects_directory_spec.py @@ -0,0 +1,112 @@ +# coding: utf-8 +import unittest +from mock import Mock,patch_object,patch +from persistence.projects_directory import ProjectsDirectory +from file_based_spec import FileSystemBasedBehaviour +from model.project import Project,active +from persistence.project_file import ProjectFile +from persistence import project_file +from sets import Set +class ProjectsDirectoryBehaviour(FileSystemBasedBehaviour): + + def setUp(self): + super(ProjectsDirectoryBehaviour,self).setUp() + self.projects = Mock() + self.project_list = [] + self.projects.__iter__ = self.project_list.__iter__ + self.projects_directory = ProjectsDirectory(self.projects) + self.projects_directory.add_directory('.') + + def create_project_file(self,name,subdir=None): + file_name = name+'.prj' + if subdir: + filename = os.path.join(subdir,file_name) + self.create_file(file_name) + + def assert_project_added(self,project_name): + calls = self.projects.append.call_args_list + self.assertTrue(((Project(project_name,active),),{}) in calls,u"Project %s was not created:\n%s"%(repr(Project(project_name)),calls)) +# self.projects.append.assert_called_with(Project(project_name)) + + def test_should_register_itself_as_observer(self): + self.projects.observers.append.assert_called_with(self.projects_directory) + + def read(self): + self.projects_directory.read() + + + +class EmptyProjectsDirectoryBehaviour(ProjectsDirectoryBehaviour): + + def test_should_not_read_any_projects(self): + self.read() + self.assertFalse(self.projects.append.called) + + + +class NonEmptyProjectsDirectoryBehaviour(ProjectsDirectoryBehaviour): + + def setUp(self): + super(NonEmptyProjectsDirectoryBehaviour,self).setUp() + self.project_names = Set([u'Fürst Project',u'other project',u'third something']) + self.create_project_files(self.project_names) + + + def create_project_files(self,names): + for name in names: + self.create_project_file(name) + + def test_should_read_all_projects_in_this_directory(self): + self.read() + for p in self.project_names: + self.assert_project_added(p) + + def test_should_read_only_project_files(self): + self.create_file('First something.txt') + self.read() + self.assertEqual(len(self.projects.append.call_args_list),len(self.project_names)) + self.assertFalse(((Project(u'First something.txt'),),{}) in self.projects.append.call_args_list) + + def has_project_file(self,p): + has_project_file = False + for o in p.observers: + if type(o) == ProjectFile: + if has_project_file: + self.fail("Added ProjectFile twice") + has_project_file = True + return has_project_file + + def test_should_add_read_projects_to_projects(self): +# self.projects.append.side_effect = self.mock_notify + self.read() + read_project_names = Set() + for call in self.projects.append.call_args_list: + read_project_names.add(call[0][0].name) + self.assertEqual(read_project_names,self.project_names) + + def test_should_clear_the_projects_before_reading(self): + self.read() + self.read() + self.assertEqual(len(self.projects.pop.call_args_list),len(self.project_names)) + + @patch('persistence.project_file.ProjectFile') + def test_should_create_project_files_when_notified_of_added_projects(self,project_file_constructor): + p = self.create_and_notify_of_new_project() + project_file_constructor.assert_called_with(p) + + @patch('persistence.project_file.ProjectFile') + def test_should_immediately_write_added_project_files(self,project_file_constructor): + self.create_and_notify_of_new_project() + project_file_constructor().write.assert_called_with() + + def create_and_notify_of_new_project(self): + p = Mock() + self.projects_directory.notify(self.projects,'add_item',p, None) + return p + + @patch('persistence.project_file.read') + def test_should_make_the_project_file_read_the_file_contents(self,read_method): + read_method.return_value=(None,[],[]) + self.read() + self.assertEqual(len(read_method.call_args_list),len(self.project_names)) +