def setup_method(self, method):
        self.patcher = patch('pysync_redmine.repositories.'
                             'ganttproject.ET.parse')
        element_tree = self.patcher.start()
        root = Mock()
        element_tree.return_value = root
        root.getroot.return_value = self.get_fake_source()

        self.repo = GanttRepo()
        self.repo.open_source(filename='fake_file.gan')
        self.repo.load_calendar()
        self.project = self.repo.project
class A_GanttRepo:

    def setup_method(self, method):
        self.patcher = patch('pysync_redmine.repositories.'
                             'ganttproject.ET.parse')
        element_tree = self.patcher.start()
        root = Mock()
        element_tree.return_value = root
        root.getroot.return_value = self.get_fake_source()

        self.repo = GanttRepo()
        self.repo.open_source(filename='fake_file.gan')
        self.repo.load_calendar()
        self.project = self.repo.project

    def get_fake_source(self):
        source = ET.Element('project', {'name': 'example'})

        roles = ET.SubElement(source, 'roles')
        ET.SubElement(roles, 'role', {'id': '1', 'name': 'Project Leader'})
        ET.SubElement(roles, 'role', {'id': '2', 'name': 'Developer'})
        ET.SubElement(roles, 'role', {'id': '3', 'name': 'Verifier'})

        resources = ET.SubElement(source, 'resources')
        ET.SubElement(resources, 'resource', {'id': '0', 'name': 'leader',
                      'function': '1'})
        ET.SubElement(resources, 'resource', {'id': '1', 'name': 'developer',
                      'function': '2'})
        ET.SubElement(resources, 'resource', {'id': '2', 'name': 'verifier',
                      'function': '3'})
        ET.SubElement(resources, 'resource', {'id': '3', 'name': 'none',
                      'function': '0'})

        tasks = ET.SubElement(source, 'tasks')
        phase = ET.SubElement(tasks, 'task', {'id': '0', 'name': 'ABC. Phase description',
                              'start': '2016-01-04', 'duration': '8', 'complete': '87'})
        parent = ET.SubElement(phase, 'task', {'id': '1', 'name': 'Parent task',
                               'start': '2016-01-04', 'duration': '3', 'complete': '87'})
        subtask = ET.SubElement(parent, 'task', {'id': '2', 'name': 'subtask task',
                               'start': '2016-01-04', 'duration': '3', 'complete': '90'})
        ET.SubElement(subtask, 'depend', {'id': '3', 'difference': '5'})
        ET.SubElement(subtask, 'custom')
        alone = ET.SubElement(tasks, 'task', {'id': '3', 'name': 'Task without phase',
                               'start': '2016-01-04', 'duration': '3', 'complete': '100'})

        inputs = 'one item // with section, alone item'
        outputs = 'one item // with //several sections, alone item'
        ET.SubElement(alone, 'customproperty',
                      {'taskproperty-id': 'tpc0', 'value': inputs})
        ET.SubElement(alone, 'customproperty',
                      {'taskproperty-id': 'tpc1', 'value': outputs})

        allocations = ET.SubElement(source, 'allocations')
        ET.SubElement(allocations, 'allocation', {
                      'task-id': '1', 'resource-id': '0', 'function': '1',
                      'responsible': 'true'})
        ET.SubElement(allocations, 'allocation', {
                      'task-id': '2', 'resource-id': '1', 'function': '3',
                      'responsible': 'true'})
        ET.SubElement(allocations, 'allocation', {
                      'task-id': '2', 'resource-id': '2', 'function': '2',
                      'responsible': 'false'})

        taskproperties = ET.SubElement(tasks, 'taskproperties')
        ET.SubElement(taskproperties, 'taskproperty',
                        {'id': 'tpc0', 'name': 'inputs'})
        ET.SubElement(taskproperties, 'taskproperty',
                        {'id': 'tpc1', 'name': 'outputs'})

        return source

    def teardown_method(self, method):
        self.patcher.stop()
        self.repo.close_source()

    def should_load_phases(self):
        self.repo.load_phases()

        assert len(self.project.phases) == 1
        phase = self.project.phases[0]
        assert phase._id == 0
        assert phase.key == 'ABC'
        assert phase.due_date == datetime.date(2016, 1, 14)
        assert phase.description == 'Phase description'

    def should_load_members(self):
        self.repo.load_members()

        assert len(self.project.members) == 4
        member = self.project.members[0]
        assert member.key == 'leader'
        assert member.roles == {'Project Leader'}
        assert member.project == self.project
        assert member._id == 0

    def should_load_calendar(self):
        self.repo.load_calendar

    def should_load_tasks(self):
        self.repo.load_members()
        self.repo.load_phases()

        self.repo.load_tasks()

        phase = self.project.phases[0]
        parent = self.project.tasks[1]
        subtask = self.project.tasks[2]
        alone = self.project.tasks[3]
        leader = self.project.members[0]
        developer = self.project.members[1]
        no_one = self.project.members[2]

        assert len(self.project.tasks) == 3
        assert len(parent.subtasks) == 1

        assert parent.subtasks[0] == subtask
        assert parent.assigned_to == leader

        assert subtask.parent == parent
        assert subtask.phase == phase
        assert subtask.assigned_to == developer
        assert subtask.relations.next_tasks[alone] == 5
        assert len(subtask.colaborators) == 1
        assert no_one == subtask.colaborators[0]

        assert alone.parent is None
        assert alone.phase is None
        assert alone.assigned_to is None

        assert len(alone.inputs) == 2
        assert len(alone.outputs) == 2
        # print(self.project.tokens._str_level(1))
        assert len(self.project.tokens.childs) == 2