def test_add_completed_location():
    store = ProgressStore()

    non_repeating_location = Location(section_id="s1", block_id="one")
    repeating_location = Location(
        section_id="s2",
        block_id="another-one",
        list_name="people",
        list_item_id="abc123",
    )

    store.add_completed_location(non_repeating_location)
    store.add_completed_location(repeating_location)

    assert store.get_completed_block_ids(section_id="s1") == [
        non_repeating_location.block_id
    ]
    assert store.get_completed_block_ids(section_id="s2",
                                         list_item_id="abc123") == [
                                             repeating_location.block_id
                                         ]

    assert store.is_dirty
def test_serialisation():
    store = ProgressStore()

    store.add_completed_location(Location(section_id="s1", block_id="one"))
    store.add_completed_location(Location(section_id="s1", block_id="two"))
    store.update_section_status(section_status=CompletionStatus.COMPLETED,
                                section_id="s1")

    store.add_completed_location(
        Location(
            section_id="s2",
            block_id="another-one",
            list_name="people",
            list_item_id="abc123",
        ))
    store.update_section_status(
        section_status=CompletionStatus.IN_PROGRESS,
        section_id="s2",
        list_item_id="abc123",
    )

    serialized = store.serialize()

    assert serialized == [
        Progress.from_dict({
            "section_id": "s1",
            "list_item_id": None,
            "status": CompletionStatus.COMPLETED,
            "block_ids": ["one", "two"],
        }),
        Progress.from_dict({
            "section_id": "s2",
            "list_item_id": "abc123",
            "status": CompletionStatus.IN_PROGRESS,
            "block_ids": ["another-one"],
        }),
    ]
def test_add_completed_location_new():
    completed = [
        {
            "section_id": "s1",
            "list_item_id": None,
            "status": CompletionStatus.COMPLETED,
            "block_ids": ["one"],
        },
        {
            "section_id": "s2",
            "list_item_id": "abc123",
            "status": CompletionStatus.COMPLETED,
            "block_ids": ["three", "four"],
        },
    ]
    store = ProgressStore(completed)

    non_repeating_location = Location(section_id="s1", block_id="two")
    repeating_location = Location(section_id="s2",
                                  block_id="five",
                                  list_name="people",
                                  list_item_id="abc123")

    store.add_completed_location(non_repeating_location)
    store.add_completed_location(repeating_location)

    assert store.get_section_status(
        section_id="s1") == CompletionStatus.COMPLETED
    assert (store.get_section_status(
        section_id="s2", list_item_id="abc123") == CompletionStatus.COMPLETED)

    assert len(store.get_completed_block_ids(section_id="s1")) == 2
    assert (len(
        store.get_completed_block_ids(section_id="s2",
                                      list_item_id="abc123")) == 3)

    assert store.is_dirty