Ejemplo n.º 1
0
def test_only_column_count_returns_correct_number():
    """ Checks that the column count is correct """
    # Given
    model = TreeModel()

    # Then
    assert model.columnCount(QModelIndex()) == len(list(TreeModelCols))
Ejemplo n.º 2
0
def test_header_data_none_for_invalid_orientation():
    """ Check that the header data is correctly returned """
    # Given
    model = TreeModel()

    # Then
    assert model.headerData(0, Qt.Vertical, Qt.DisplayRole) != ""
Ejemplo n.º 3
0
def test_has_children_handles_no_project_set():
    """ When no project is set, hasChildren should return False """
    # Given
    model = TreeModel()

    # Then
    assert model.hasChildren(QModelIndex()) is False
Ejemplo n.º 4
0
def test_pending_updates_are_cleared():
    """
    If there are any previous pending changes, they are cleared before
    updates are calculated
    """

    # Given
    tree_model = TreeModel()
    tree_model.set_project(ResearchProject(""))

    individuals_model = IndividualsModel([])
    sources_model = SourcesModel([])

    context = DataContext(
        data_model=tree_model,
        individuals_model=individuals_model,
        sources_model=sources_model,
    )
    updater = LinkUpdater(context)
    updater.source_updates = ["Foo", "Bar"]
    updater.ancestor_fixes = ["Baz", "Fiz"]

    # When
    updater.calculate_updates()

    # Then
    assert updater.has_pending_updates() is False
Ejemplo n.º 5
0
def fixture_link_updater():
    """ Fixture to create an updater with uncommitted updates """
    tree_model = TreeModel()
    individuals_model = IndividualsModel([])
    sources_model = SourcesModel([])

    old_value = "Altered Ancestor"
    new_value = "Foo"

    project = ResearchProject("")
    plan_altered = ResearchPlan()
    plan_altered.ancestor = old_value
    plan_altered.ancestor_link = "I001"
    project.plans.append(plan_altered)
    tree_model.set_project(project)

    context = DataContext(
        data_model=tree_model,
        individuals_model=individuals_model,
        sources_model=sources_model,
    )

    updater = LinkUpdater(context)
    plan_index = tree_model.index(0, TreeModelCols.TEXT, QModelIndex())
    updater.ancestor_updates = [{"index": plan_index, "value": new_value}]

    return (updater, old_value, new_value, tree_model, plan_index)
Ejemplo n.º 6
0
def test_task_links_are_checked():
    """
    Check the following:
    * Unchanged links are respected
    * Broken links are identified
    * Updated links are identified
    """

    # Given
    project = ResearchProject("")
    individuals = []
    sources = []

    plan = ResearchPlan()

    source_linked = Source("S123", "Linked", "Author", "Pub", "abbr")
    sources.append(source_linked)
    task_linked = ResearchTask()
    task_linked.source = source_linked.autocomplete_name()
    task_linked.source_link = source_linked.pointer
    plan.tasks.append(task_linked)

    task_broken = ResearchTask()
    task_broken.source = "Broken Source"
    task_broken.source_link = "FooBar"
    plan.tasks.append(task_broken)

    source_altered = Source("S987", "Altered", "Author", "Pub", "abbr")
    sources.append(source_altered)
    task_altered = ResearchTask()
    task_altered.source = "Altered Source"
    task_altered.source_link = source_altered.pointer
    plan.tasks.append(task_altered)

    project.plans.append(plan)

    tree_model = TreeModel()
    tree_model.set_project(project)

    individuals_model = IndividualsModel(individuals)
    sources_model = SourcesModel(sources)

    context = DataContext(
        data_model=tree_model,
        individuals_model=individuals_model,
        sources_model=sources_model,
    )
    updater = LinkUpdater(context)

    # When
    updater.calculate_updates()

    # Then
    assert updater.has_pending_updates() is True
    assert len(updater.ancestor_updates) == 0
    assert len(updater.source_updates) == 1
Ejemplo n.º 7
0
def test_has_children_handles_parent_index():
    """ When no project is set, hasChildren should return False """
    # Given
    model = TreeModel()
    project = ResearchProject("")
    project.add_plan().add_task()
    model.set_project(project)

    # Then
    assert model.hasChildren(QModelIndex()) is True
Ejemplo n.º 8
0
def test_set_project_calls_begin_end_reset(project, qtbot, qtmodeltester):
    """ beginReset and endReset should be emitted """
    # Given
    model = TreeModel()

    # When
    with qtbot.waitSignals([model.modelAboutToBeReset, model.modelReset]):
        model.set_project(project)

    # Then
    qtmodeltester.check(model)
Ejemplo n.º 9
0
def test_set_project_clears_existing_nodes():
    """ Setting valid project should clear existing nodes """
    # Given
    model = TreeModel()
    project = ResearchProject("")

    # When
    model.set_project(project)
    model.set_project(project)

    # Then
    assert len(model.plans_node.children) == 0
Ejemplo n.º 10
0
def test_plan_links_are_checked():
    """
    Check the following:
    * Unchanged links are respected
    * Broken links are identified
    * Updated links are identified
    """

    # Given
    project = ResearchProject("")
    individuals = []
    sources = []

    indi_linked = Individual("I1234", "Link", "Indi", 1000, 2000)
    individuals.append(indi_linked)
    plan_linked = ResearchPlan()
    plan_linked.ancestor = indi_linked.autocomplete_name()
    plan_linked.ancestor_link = indi_linked.pointer
    project.plans.append(plan_linked)

    plan_broken = ResearchPlan()
    plan_broken.ancestor = "Broken Ancestor 1234/5678"
    plan_broken.ancestor_link = "FooBar"
    project.plans.append(plan_broken)

    indi_altered = Individual("I9876", "Altered", "Indi", 1000, 2000)
    individuals.append(indi_altered)
    plan_altered = ResearchPlan()
    plan_altered.ancestor = "Altered Ancestor 1000/2000"
    plan_altered.ancestor_link = indi_altered.pointer
    project.plans.append(plan_altered)

    tree_model = TreeModel()
    tree_model.set_project(project)

    individuals_model = IndividualsModel(individuals)
    sources_model = SourcesModel(sources)

    context = DataContext(
        data_model=tree_model,
        individuals_model=individuals_model,
        sources_model=sources_model,
    )
    updater = LinkUpdater(context)

    # When
    updater.calculate_updates()

    # Then
    assert updater.has_pending_updates() is True
    assert len(updater.ancestor_updates) == 1
    assert len(updater.source_updates) == 0
Ejemplo n.º 11
0
def test_setdata_returns_false_on_invalid_index():
    """ When setting data, false is returned for invalid index """
    # Given
    model = TreeModel()
    project = ResearchProject("")
    plan = ResearchPlan()
    project.plans.append(plan)

    model.set_project(project)

    # When
    retval = model.setData(QModelIndex(), "Foo")

    assert retval is False
Ejemplo n.º 12
0
def test_flags_no_flags_for_invalid_index():
    """ Check that no flags are returned for invalid index """
    # Given
    model = TreeModel()

    # project = ResearchProject("")
    # project.add_plan().add_task()

    # When
    plan_index = model.index(0, 0, model.plans_index)
    task_index = model.index(0, 0, plan_index)

    # Then
    assert model.flags(plan_index) == Qt.NoItemFlags
    assert model.flags(task_index) == Qt.NoItemFlags
Ejemplo n.º 13
0
def test_index_returns_index_for_valid_row():
    """ The start and end row removal signals should be emitted """
    # Given
    model = TreeModel()
    project = ResearchProject("")
    plan = ResearchPlan()
    project.plans.append(plan)

    model.set_project(project)

    # When
    plan_index = model.index(0, 0, model.plans_index)

    # Then
    assert plan_index.isValid() is True
Ejemplo n.º 14
0
def test_data_returns_none_for_invalid_index():
    """ When getting data, nothing is returned for invalid index """
    # Given
    model = TreeModel()
    project = ResearchProject("")
    plan = ResearchPlan()
    project.plans.append(plan)

    model.set_project(project)

    # When
    retval = model.data(QModelIndex(), Qt.DisplayRole)

    # Then
    assert retval is None
Ejemplo n.º 15
0
def test_new_model_is_empty_by_default(qtmodeltester):
    """ Empty model should not have a project set and no nodes """
    # Given
    model = TreeModel()

    # Then
    qtmodeltester.check(model)
    assert model.project is None
    assert model.plans_node is None
Ejemplo n.º 16
0
 def __init__(self,
              data_model=None,
              individuals_model=None,
              sources_model=None):
     self.data_model = TreeModel() if data_model is None else data_model
     self.individuals_model = (IndividualsModel(
         []) if individuals_model is None else individuals_model)
     self.sources_model = (SourcesModel([])
                           if sources_model is None else sources_model)
Ejemplo n.º 17
0
def test_basic_checks(qtmodeltester):
    """ Check the model for basic issues """
    # Given
    tree = TreeModel()
    model = TableModel()
    model.setSourceModel(tree)

    # Then
    qtmodeltester.check(model)
Ejemplo n.º 18
0
def test_delete_calls_signals(qtbot):
    """ The start and end row removal signals should be emitted """
    # Given
    model = TreeModel()
    project = ResearchProject("")
    plan = ResearchPlan()
    project.plans.append(plan)

    model.set_project(project)
    plan_index = model.index(0, 0, model.plans_index)

    # When
    with qtbot.waitSignals([model.rowsAboutToBeRemoved, model.rowsRemoved]):
        model.delete_node(plan_index)
Ejemplo n.º 19
0
def test_setdata_updates_link():
    """ setData() works on the link """
    # Given
    model = TreeModel()
    project = ResearchProject("")
    plan = ResearchPlan()
    project.plans.append(plan)
    project.plans[0].add_task()

    model.set_project(project)
    plan_index = model.index(0, 0, model.plans_index)
    task_index = model.index(0, TreeModelCols.LINK, plan_index)

    # When
    retval = model.setData(task_index, 1234)

    assert retval is True
    assert model.data(task_index, Qt.DisplayRole) == 1234
Ejemplo n.º 20
0
def test_flags_not_editable_for_ancestor_column():
    """ The ancestor column should not be editable """
    model = TreeModel()

    project = ResearchProject("")
    project.add_plan().add_task()
    model.set_project(project)

    # When
    plan_index = model.index(0, TreeModelCols.ANCESTOR, model.plans_index)
    task_index = model.index(0, TreeModelCols.ANCESTOR, plan_index)

    # Then
    assert model.flags(plan_index) & Qt.ItemIsEditable != Qt.ItemIsEditable
    assert model.flags(task_index) & Qt.ItemIsEditable != Qt.ItemIsEditable
Ejemplo n.º 21
0
def test_setdata_returns_false_on_invalid_column():
    """ When setting data, false is returned for invalid column """
    # Given
    model = TreeModel()
    project = ResearchProject("")
    plan = ResearchPlan()
    project.plans.append(plan)

    model.set_project(project)
    plan_index = model.index(0, model.columnCount(None) + 1, model.plans_index)

    # When
    retval = model.setData(plan_index, "Foo")

    assert retval is False
Ejemplo n.º 22
0
def test_setdata_updates_description():
    """ setData() works on the description """
    # Given
    model = TreeModel()
    project = ResearchProject("")
    plan = ResearchPlan()
    project.plans.append(plan)

    model.set_project(project)
    plan_index = model.index(0, 1, model.plans_index)

    # When
    retval = model.setData(plan_index, "Foo")

    assert retval is True
    assert model.data(plan_index, Qt.DisplayRole) == "Foo"
Ejemplo n.º 23
0
def test_add_creates_plan():
    """ Add should create a new plan in the underlying data structure """
    # Given
    model = TreeModel()
    project = ResearchProject("")

    model.set_project(project)

    # When
    model.add_node(model.plans_index)

    # Then
    assert len(project.plans) == 1
Ejemplo n.º 24
0
def test_delete_removes_task():
    """ Delete removes task from underlying data structure """
    # Given
    model = TreeModel()
    project = ResearchProject("")
    plan = ResearchPlan()
    task = ResearchTask()
    plan.tasks.append(task)
    project.plans.append(plan)

    model.set_project(project)
    plan_index = model.index(0, 0, model.plans_index)
    task_index = model.index(0, 0, plan_index)

    # When
    model.delete_node(task_index)

    # Then
    assert len(project.plans) == 1
    assert len(plan.tasks) == 0
Ejemplo n.º 25
0
def test_add_creates_task():
    """ Add should create a new task in the underlying data structure """
    # Given
    model = TreeModel()
    project = ResearchProject("")
    plan = ResearchPlan()
    project.plans.append(plan)

    model.set_project(project)
    plan_index = model.index(0, 0, model.plans_index)

    # When
    model.add_node(plan_index)

    # Then
    assert len(project.plans) == 1
    assert len(plan.tasks) == 1
Ejemplo n.º 26
0
def test_setdata_updates_result():
    """ setData() works on the result """
    # Given
    model = TreeModel()
    project = ResearchProject("")
    plan = ResearchPlan()
    project.plans.append(plan)
    project.plans[0].add_task()

    model.set_project(project)
    plan_index = model.index(0, 0, model.plans_index)
    task_index = model.index(0, 2, plan_index)

    result = ResearchResult(True)
    result.description = "Test"

    # When
    retval = model.setData(task_index, result)

    assert retval is True
    assert model.data(task_index, Qt.DisplayRole) == result
Ejemplo n.º 27
0
def test_setdata_fires_signal_on_change(qtbot):
    """ When setting data, the dataChanged signal is emitted on changes """
    # Given
    model = TreeModel()
    project = ResearchProject("")
    plan = ResearchPlan()
    project.plans.append(plan)

    model.set_project(project)
    plan_index = model.index(0, 0, model.plans_index)

    # When
    with qtbot.waitSignal(model.dataChanged):
        retval = model.setData(plan_index, "Foo")

    assert retval is True
Ejemplo n.º 28
0
def test_delete_does_nothing_on_invalid_index(qtbot):
    """ Delete removes task from underlying data structure """
    # Given
    model = TreeModel()
    project = ResearchProject("")
    project.add_plan().add_task()
    model.set_project(project)

    # When
    with qtbot.assertNotEmitted(model.rowsAboutToBeRemoved):
        with qtbot.assertNotEmitted(model.rowsRemoved):
            model.delete_node(QModelIndex())

    # Then
    assert len(project.plans) == 1
    assert len(project.plans[0].tasks) == 1
Ejemplo n.º 29
0
def test_setdata_doesnot_fire_signal_if_no_change(qtbot):
    """ When setting data, the dataChanged signal should only be emitted on actual changes """
    # Given
    model = TreeModel()
    project = ResearchProject("")
    plan = ResearchPlan()
    project.plans.append(plan)

    model.set_project(project)
    plan_index = model.index(0, 0, model.plans_index)

    # When
    with qtbot.assertNotEmitted(model.dataChanged):
        retval = model.setData(plan_index, plan.ancestor)

    assert retval is True
Ejemplo n.º 30
0
def test_data_returns_none_for_invalid_role():
    """ When getting data, invalid role returns None """
    # Given
    model = TreeModel()
    project = ResearchProject("")
    plan = ResearchPlan()
    plan.ancestor = "Foo"
    project.plans.append(plan)

    model.set_project(project)
    plan_index = model.index(0, 0, model.plans_index)

    # When
    retval = model.data(plan_index, Qt.UserRole)

    # Then
    assert retval is None