Add files from the old svn, r101.
[matthijs/upstream/mobilegtd.git] / tests / specs / persistence / projects_directory_spec.py
diff --git a/tests/specs/persistence/projects_directory_spec.py b/tests/specs/persistence/projects_directory_spec.py
new file mode 100644 (file)
index 0000000..8f5e20f
--- /dev/null
@@ -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))
+