def test_str_attribute(temp_file, attribute):
    """test set_attribute, get_attribute, etc"""
    from osxmetadata import OSXMetaData
    from osxmetadata.constants import _FINDER_COMMENT_NAMES

    meta = OSXMetaData(temp_file)
    expected = 2
    meta.set_attribute(attribute, expected)
    got = meta.get_attribute(attribute)
    assert expected == got

    expected += 1
    meta.append_attribute(attribute, 1)
    assert meta.get_attribute(attribute) == expected

    meta.clear_attribute(attribute)
    assert meta.get_attribute(attribute) is None

    with pytest.raises(TypeError):
        meta.set_attribute(attribute, "")

    with pytest.raises(TypeError):
        meta.update_attribute(attribute, "foo")

    with pytest.raises(TypeError):
        meta.discard_attribute(attribute, "foo")

    with pytest.raises(TypeError):
        meta.remove_attribute(attribute, "foo")
Exemple #2
0
def test_download_date_tz_4(temp_file):
    """ test tz_aware property """
    from osxmetadata import OSXMetaData
    from osxmetadata.datetime_utils import datetime_naive_to_local
    import datetime

    meta = OSXMetaData(temp_file)
    dt = datetime.datetime.now()

    # test tz_aware
    assert not meta.tz_aware
    meta.tz_aware = True
    assert meta.tz_aware

    # test tz_aware
    dt_tz = datetime_naive_to_local(dt)
    meta.downloadeddate = dt_tz
    assert meta.downloadeddate == [dt_tz]
    assert meta.get_attribute("downloadeddate") == [dt_tz]

    # test timezone == UTC
    dld = meta.downloadeddate[0]
    tz = dld.tzinfo.tzname(dld)
    assert tz == "UTC"

    # turn tz_aware off
    meta.tz_aware = False
    assert meta.downloadeddate == [dt]
    assert meta.get_attribute("downloadeddate") == [dt]
    assert meta.downloadeddate[0].tzinfo is None
Exemple #3
0
def test_finder_comments_2(temp_file):
    """ test get/set attribute """

    from osxmetadata import OSXMetaData
    from osxmetadata.constants import kMDItemFinderComment

    attribute = kMDItemFinderComment

    meta = OSXMetaData(temp_file)
    fc = "This is my new comment"
    meta.set_attribute(attribute, fc)
    assert meta.findercomment == fc
    meta.findercomment += ", foo"
    fc += ", foo"
    assert meta.findercomment == fc

    # set finder comment to "" results in null string but not deleted
    meta.set_attribute(attribute, "")
    assert meta.get_attribute(attribute) == ""

    meta.set_attribute(attribute, "foo")
    assert meta.get_attribute(attribute) == "foo"

    # set finder comment to None deletes it
    meta.set_attribute(attribute, "")
    assert meta.get_attribute(attribute) == ""

    meta.clear_attribute(attribute)
    assert meta.get_attribute(attribute) == None

    # can we set findercomment after is was set to None?
    meta.set_attribute(attribute, "bar")
    assert meta.get_attribute(attribute) == "bar"
Exemple #4
0
def test_tags_3(temp_file):

    from osxmetadata import OSXMetaData, Tag
    from osxmetadata.constants import kMDItemUserTags

    attribute = kMDItemUserTags

    # update tags
    meta = OSXMetaData(temp_file)
    tagset = [Tag("Test"), Tag("Green")]

    meta.set_attribute(attribute, tagset)
    tags = meta.get_attribute(attribute)
    assert tags == tagset

    meta.update_attribute(attribute, [Tag("Foo")])
    tags = meta.get_attribute(attribute)
    assert tags == [Tag("Test"), Tag("Green"), Tag("Foo")]

    meta.remove_attribute(attribute, Tag("Foo"))
    tags = meta.get_attribute(attribute)
    assert tags == [Tag("Test"), Tag("Green")]

    meta.update_attribute(attribute, [Tag("Foo")])
    tags = meta.get_attribute(attribute)
    assert tags == [Tag("Test"), Tag("Green"), Tag("Foo")]

    meta.clear_attribute(attribute)
    tags = meta.get_attribute(attribute)
    assert len(tags) == 0
Exemple #5
0
def test_cli_backup_restore_2(temp_file):
    # test set during restore
    import pathlib
    from osxmetadata import OSXMetaData, ATTRIBUTES, Tag
    from osxmetadata.constants import _BACKUP_FILENAME
    from osxmetadata.__main__ import cli

    runner = CliRunner()
    result = runner.invoke(
        cli,
        [
            "--set",
            "tags",
            "Foo",
            "--set",
            "tags",
            "Bar",
            "--set",
            "comment",
            "Hello World!",
            "--list",
            temp_file,
        ],
    )
    assert result.exit_code == 0
    output = parse_cli_output(result.stdout)
    assert output["tags"] == "['Foo', 'Bar']"
    meta = OSXMetaData(temp_file)
    assert meta.get_attribute("tags") == [Tag("Foo"), Tag("Bar")]
    assert meta.get_attribute("comment") == "Hello World!"

    # test creation of backup file
    result = runner.invoke(cli, ["--backup", temp_file])
    assert result.exit_code == 0
    backup_file = pathlib.Path(pathlib.Path(temp_file).parent) / _BACKUP_FILENAME
    assert backup_file.exists()

    # clear the attributes to see if they can be restored
    meta.clear_attribute("tags")
    meta.clear_attribute("comment")
    assert meta.tags == []
    assert meta.comment == None

    result = runner.invoke(
        cli,
        [
            "--restore",
            "--append",
            "tags",
            "Flooz",
            "--set",
            "keywords",
            "FooBar",
            temp_file,
        ],
    )
    assert result.exit_code == 0
    assert meta.tags == [Tag("Foo"), Tag("Bar"), Tag("Flooz")]
    assert meta.comment == "Hello World!"
    assert meta.keywords == ["FooBar"]
def test_str_attribute(temp_file, attribute):
    """test set_attribute, get_attribute, etc"""
    from osxmetadata import OSXMetaData
    from osxmetadata.constants import _FINDER_COMMENT_NAMES

    meta = OSXMetaData(temp_file)
    expected = datetime.datetime(2021, 7, 8)
    meta.set_attribute(attribute, expected)
    got = meta.get_attribute(attribute)
    assert expected == got

    meta.clear_attribute(attribute)
    assert meta.get_attribute(attribute) == None

    # test setting empty string
    meta.set_attribute(attribute, "")
    assert meta.get_attribute(attribute) is None

    with pytest.raises(TypeError):
        meta.update_attribute(attribute, "foo")

    with pytest.raises(TypeError):
        meta.discard_attribute(attribute, "foo")

    with pytest.raises(TypeError):
        meta.remove_attribute(attribute, "foo")
Exemple #7
0
def test_str_attribute(temp_file, attribute):
    """test set_attribute, get_attribute, etc"""
    from osxmetadata import OSXMetaData
    from osxmetadata.constants import _FINDER_COMMENT_NAMES

    meta = OSXMetaData(temp_file)
    expected = True
    meta.set_attribute(attribute, expected)
    got = meta.get_attribute(attribute)
    assert expected == got

    meta.set_attribute(attribute, not expected)
    assert not meta.get_attribute(attribute)

    meta.clear_attribute(attribute)
    assert meta.get_attribute(attribute) is None

    # test setting empty string
    # setting finder comment to empty string clears it
    # but other fields get set to empty string
    # this mirrors the way finder comments work in mdls
    meta.set_attribute(attribute, "")
    assert not meta.get_attribute(attribute)

    with pytest.raises(AttributeError):
        meta.update_attribute(attribute, "foo")

    with pytest.raises(TypeError):
        meta.discard_attribute(attribute, "foo")

    with pytest.raises(TypeError):
        meta.remove_attribute(attribute, "foo")
Exemple #8
0
def test_finder_comments_2(temp_file):
    """ test get/set attribute """

    from osxmetadata import OSXMetaData
    from osxmetadata.constants import kMDItemFinderComment

    attribute = kMDItemFinderComment

    meta = OSXMetaData(temp_file)
    fc = "This is my new comment"
    meta.set_attribute(attribute, fc)
    assert meta.findercomment == fc
    meta.findercomment += ", foo"
    fc += ", foo"
    assert meta.findercomment == fc

    # set finder comment to "" deletes it as this mirrors mdls and Finder
    meta.set_attribute(attribute, "")
    assert meta.get_attribute(attribute) is None

    meta.set_attribute(attribute, "foo")
    assert meta.get_attribute(attribute) == "foo"

    # set finder comment to None deletes it
    meta.set_attribute(attribute, None)
    assert meta.get_attribute(attribute) is None

    meta.clear_attribute(attribute)
    assert meta.get_attribute(attribute) is None

    # can we set findercomment after is was set to None?
    meta.set_attribute(attribute, "bar")
    assert meta.get_attribute(attribute) == "bar"
Exemple #9
0
def test_tags_4(temp_file):
    """ Test various list methods """
    from osxmetadata import OSXMetaData, Tag
    from osxmetadata.constants import _kMDItemUserTags

    attribute = _kMDItemUserTags

    # update tags
    meta = OSXMetaData(temp_file)
    tagset = [Tag("Test"), Tag("Green"), Tag("Foo")]

    meta.tags = tagset
    assert meta.tags == tagset
    assert meta.get_attribute(attribute) == tagset

    idx = meta.tags.index(Tag("Green"))
    assert idx == 1

    count = meta.tags.count(Tag("Test"))
    assert count == 1

    count = meta.tags.count(Tag("Bar"))
    assert count == 0

    meta.tags.sort()
    assert meta.tags == [Tag("Foo"), Tag("Green"), Tag("Test")]
    assert meta.get_attribute(attribute) == [
        Tag("Foo"), Tag("Green"), Tag("Test")
    ]

    meta.tags.sort(reverse=True)
    assert meta.tags == [Tag("Test"), Tag("Green"), Tag("Foo")]
    assert meta.get_attribute(attribute) == [
        Tag("Test"), Tag("Green"), Tag("Foo")
    ]

    # sort by key
    meta.tags.sort(key=lambda tag: len(tag))
    assert meta.tags == [Tag("Foo"), Tag("Test"), Tag("Green")]
    assert meta.get_attribute(attribute) == [
        Tag("Foo"), Tag("Test"), Tag("Green")
    ]

    # todo: reverse not working
    # meta.tags.reverse()
    # assert meta.tags == [Tag("Green"), Tag("Test"), Tag("Foo")]
    # assert meta.get_attribute(attribute) == [Tag("Green"), Tag("Test"), Tag("Foo")]

    # tag_expected = Tag("Test")
    # tag_got = meta.tags.pop(1)
    # assert tag_got == tag_expected
    # assert meta.tags == [Tag("Green"), Tag("Foo")]
    # assert meta.get_attribute(attribute) == [Tag("Green"), Tag("Foo")]

    tag_expected = Tag("Test")
    tag_got = meta.tags.pop(1)
    assert tag_got == tag_expected
    assert meta.tags == [Tag("Foo"), Tag("Green")]
    assert meta.get_attribute(attribute) == [Tag("Foo"), Tag("Green")]
Exemple #10
0
def test_tag_on_directory():
    import tempfile
    from osxmetadata import OSXMetaData, Tag

    tempdir = tempfile.TemporaryDirectory(prefix="osxmetadata")

    md = OSXMetaData(tempdir.name)
    md.tags = [Tag("Red")]
    assert md.get_attribute("tags") == [Tag("Red")]

    md.tags.remove(Tag("Red"))
    assert md.get_attribute("tags") == []
def test_duedate(temp_file):
    """test functions on one of the datetime attributes"""
    from osxmetadata import OSXMetaData

    meta = OSXMetaData(temp_file)
    meta.duedate = "2021-07-08"
    assert meta.duedate == datetime.datetime(2021, 7, 8)
    assert meta.get_attribute("duedate") == datetime.datetime(2021, 7, 8)

    meta.duedate = None
    assert meta.duedate is None
    assert meta.get_attribute("duedate") is None

    meta.duedate = datetime.datetime(2021, 7, 8)
    assert meta.duedate == datetime.datetime(2021, 7, 8)
    assert meta.get_attribute("duedate") == datetime.datetime(2021, 7, 8)
Exemple #12
0
def test_cli_downloadeddate(temp_file):
    # pass ISO 8601 format with timezone, get back naive local time
    import datetime
    from osxmetadata import OSXMetaData, kMDItemDownloadedDate
    from osxmetadata.datetime_utils import (
        datetime_naive_to_utc,
        datetime_utc_to_local,
        datetime_remove_tz,
    )
    from osxmetadata.__main__ import cli

    runner = CliRunner()
    dt = "2020-02-23:00:00:00+00:00"  # UTC time
    utc_time = datetime.datetime.fromisoformat(dt)
    local_time = datetime_remove_tz(datetime_utc_to_local(utc_time))

    result = runner.invoke(cli, ["--set", "downloadeddate", dt, "--list", temp_file])
    assert result.exit_code == 0

    output = parse_cli_output(result.stdout)
    assert output["downloadeddate"] == f"['{local_time.isoformat()}']"

    meta = OSXMetaData(temp_file)
    meta.tz_aware = True
    assert meta.get_attribute(kMDItemDownloadedDate) == [utc_time]
    assert meta.downloadeddate == [utc_time]
def test_finderinfo_color_set_get_clear(temp_file):
    """Test ability to set_attribute, get_attribute, clear_attribute on finderinfo"""
    from osxmetadata import OSXMetaData, Tag
    from osxmetadata.constants import FINDER_COLOR_GREEN, FINDER_COLOR_BLUE
    from osxmetadata.findertags import get_tag_color_name

    meta = OSXMetaData(temp_file)

    assert meta.finderinfo.color == 0
    meta.finderinfo.color = FINDER_COLOR_GREEN
    assert meta.finderinfo.color == FINDER_COLOR_GREEN

    assert {"color": FINDER_COLOR_GREEN}.items() <= meta.get_attribute(
        "finderinfo"
    ).items()

    meta.set_attribute("finderinfo", {"color": FINDER_COLOR_BLUE})
    assert meta.finderinfo.color == FINDER_COLOR_BLUE

    meta.clear_attribute("finderinfo")
    assert meta.finderinfo.color == 0

    meta.finderinfo.color = FINDER_COLOR_GREEN
    meta.finderinfo.color = None
    assert meta.finderinfo.color == 0

    meta.finderinfo.color = FINDER_COLOR_GREEN
    meta.finderinfo = None
    assert meta.finderinfo.color == 0
def test_list_attribute(temp_file, attribute):
    """test set_attribute, get_attribute, etc for list items"""
    from osxmetadata import OSXMetaData

    meta = OSXMetaData(temp_file)
    expected = ["Foo"]
    meta.set_attribute(attribute, expected)
    got = meta.get_attribute(attribute)
    assert expected == got

    expected += ["Bar"]
    meta.append_attribute(attribute, ["Bar"])
    assert meta.get_attribute(attribute) == expected

    expected.remove("Bar")
    meta.remove_attribute(attribute, "Bar")
    assert meta.get_attribute(attribute) == expected

    with pytest.raises(ValueError):
        meta.remove_attribute(attribute, "Bar")

    expected += ["Flooz"]
    meta.update_attribute(attribute, ["Flooz"])
    assert meta.get_attribute(attribute) == expected

    meta.discard_attribute(attribute, "foo")
    assert meta.get_attribute(attribute) == expected

    meta.clear_attribute(attribute)
    assert meta.get_attribute(attribute) is None

    expected = ["Foo"]
    meta.set_attribute(attribute, expected)
    got = meta.get_attribute(attribute)
    assert expected == got
Exemple #15
0
def test_str_attribute_2(temp_file, attribute):
    """test getting and setting attribute by name"""
    from osxmetadata import OSXMetaData

    meta = OSXMetaData(temp_file)
    setattr(meta, attribute, True)
    test_attr = getattr(meta, attribute)
    assert test_attr
    assert meta.get_attribute(attribute)
def test_list_attribute_2(temp_file, attribute):
    """test getting and setting attribute by name"""
    from osxmetadata import OSXMetaData

    meta = OSXMetaData(temp_file)
    setattr(meta, attribute, ["Foo", "Bar"])
    test_attr = getattr(meta, attribute)
    assert test_attr == ["Foo", "Bar"]
    assert meta.get_attribute(attribute) == ["Foo", "Bar"]
Exemple #17
0
def test_download_date(temp_file):
    from osxmetadata import OSXMetaData
    import datetime

    meta = OSXMetaData(temp_file)
    dt = datetime.datetime.now()
    meta.downloadeddate = dt
    assert meta.downloadeddate == [dt]
    assert meta.get_attribute("downloadeddate") == [dt]
def test_str_attribute_2(temp_file, attribute):
    """test getting and setting attribute by name"""
    from osxmetadata import OSXMetaData

    meta = OSXMetaData(temp_file)
    setattr(meta, attribute, datetime.datetime(2021, 7, 8))
    test_attr = getattr(meta, attribute)
    assert test_attr == datetime.datetime(2021, 7, 8)
    assert meta.get_attribute(attribute) == datetime.datetime(2021, 7, 8)
def test_download_where_from(temp_file):
    from osxmetadata import OSXMetaData

    meta = OSXMetaData(temp_file)
    expected = ["http://google.com", "https://apple.com"]
    meta.wherefroms = expected
    wf = meta.wherefroms
    assert sorted(wf) == sorted(expected)
    assert sorted(meta.get_attribute("wherefroms")) == sorted(expected)
Exemple #20
0
def test_stationary(temp_file):
    """test string functions on one of the bool attributes"""
    from osxmetadata import OSXMetaData

    meta = OSXMetaData(temp_file)
    meta.stationary = True
    assert meta.stationary
    assert meta.get_attribute("stationary")

    meta.stationary = not meta.stationary
    assert not meta.stationary
    assert not meta.get_attribute("stationary")

    meta.stationary = None
    assert meta.stationary is None
    assert meta.get_attribute("stationary") is None

    meta.stationary = True
    assert meta.stationary
    assert meta.get_attribute("stationary")
def test_description(temp_file):
    """ test string functions on one of the str attributes """
    from osxmetadata import OSXMetaData

    meta = OSXMetaData(temp_file)
    meta.description = "Foo"
    assert meta.description == "Foo"
    assert meta.get_attribute("description") == "Foo"

    meta.description += " Bar"
    assert meta.description == "Foo Bar"
    assert meta.get_attribute("description") == "Foo Bar"

    meta.description = None
    assert meta.description == None
    assert meta.get_attribute("description") == None

    meta.description = "Foo"
    assert meta.description == "Foo"
    assert meta.get_attribute("description") == "Foo"
def test_rating(temp_file):
    """test int functions on one of the int attributes"""
    from osxmetadata import OSXMetaData

    meta = OSXMetaData(temp_file)
    meta.rating = 4
    assert meta.rating == 4
    assert meta.get_attribute("rating") == 4

    meta.rating += 1
    assert meta.rating == 5
    assert meta.get_attribute("rating") == 5

    meta.rating = None
    assert meta.rating is None
    assert meta.get_attribute("rating") is None

    meta.rating = 5
    assert meta.rating == 5
    assert meta.get_attribute("rating") == 5
Exemple #23
0
def test_download_date_tz_1B(temp_file):
    """ set naive time but return tz_aware """
    from osxmetadata import OSXMetaData
    from osxmetadata.datetime_utils import datetime_naive_to_local
    import datetime

    meta = OSXMetaData(temp_file, tz_aware=True)
    dt = datetime.datetime.now()
    meta.downloadeddate = dt
    dt_tz = datetime_naive_to_local(dt)
    assert meta.downloadeddate == [dt_tz]
    assert meta.get_attribute("downloadeddate") == [dt_tz]
Exemple #24
0
def test_download_date_tz_3(temp_file):
    """ set tz_aware and return naive """
    from osxmetadata import OSXMetaData
    from osxmetadata.datetime_utils import datetime_naive_to_local
    import datetime

    meta = OSXMetaData(temp_file, tz_aware=False)
    dt = datetime.datetime.now()
    dt_tz = datetime_naive_to_local(dt)
    meta.downloadeddate = dt_tz
    assert meta.downloadeddate == [dt]
    assert meta.get_attribute("downloadeddate") == [dt]
Exemple #25
0
def test_list_attributes(temp_file, attribute):
    from osxmetadata import ATTRIBUTES, OSXMetaData, Tag
    from osxmetadata.__main__ import cli
    from osxmetadata.constants import _TAGS_NAMES

    runner = CliRunner()
    result = runner.invoke(cli, [
        "--set", attribute, "Foo", "--set", attribute, "Bar", "--list",
        temp_file
    ])
    assert result.exit_code == 0
    output = parse_cli_output(result.stdout)
    attr_short_name = ATTRIBUTES[attribute].name
    assert output[attr_short_name] == "['Foo', 'Bar']"
    meta = OSXMetaData(temp_file)
    if attribute in [*_TAGS_NAMES]:
        assert meta.get_attribute(attribute) == [Tag("Foo"), Tag("Bar")]
    else:
        assert meta.get_attribute(attribute) == ["Foo", "Bar"]

    result = runner.invoke(
        cli,
        [
            "--append",
            attribute,
            "Green",
            "--remove",
            attribute,
            "Foo",
            "--list",
            temp_file,
        ],
    )
    assert result.exit_code == 0
    output = parse_cli_output(result.stdout)
    attr_short_name = ATTRIBUTES[attribute].name
    if attr_short_name == "tags":
        assert output[attr_short_name] == "['Bar', 'Green,Green']"
    else:
        assert output[attr_short_name] == "['Bar', 'Green']"
def test_stationarypad(temp_file):
    """Test stationarypad attribute"""
    from osxmetadata import OSXMetaData

    meta = OSXMetaData(temp_file)
    assert not meta.stationarypad

    meta.stationarypad = True
    assert meta.stationarypad

    meta.stationarypad = 0
    assert not meta.stationarypad

    meta.stationarypad = 1
    assert meta.stationarypad

    meta.stationarypad = False
    assert not meta.stationarypad
    assert not meta.get_attribute("stationarypad")
    
    meta.set_attribute("stationarypad", True)
    assert meta.get_attribute("stationarypad")
Exemple #27
0
def test_datetime_list_attributes(temp_file, attribute):
    from osxmetadata import OSXMetaData, ATTRIBUTES
    from osxmetadata.__main__ import cli

    dt = datetime.datetime.now()
    dt_str = dt.isoformat()

    runner = CliRunner()
    result = runner.invoke(cli, ["--set", attribute, dt_str, "--list", temp_file])
    assert result.exit_code == 0
    output = parse_cli_output(result.stdout)
    attr_short_name = ATTRIBUTES[attribute].name
    assert output[attr_short_name] == f"['{dt_str}']"
    meta = OSXMetaData(temp_file)
    assert meta.get_attribute(attribute) == [dt]
Exemple #28
0
def test_str_attributes(temp_file, attribute):
    from osxmetadata import OSXMetaData, ATTRIBUTES
    from osxmetadata.__main__ import cli

    runner = CliRunner()
    result = runner.invoke(
        cli,
        ["--set", attribute, "Foo", "--append", attribute, "Bar", "--list", temp_file],
    )
    assert result.exit_code == 0
    output = parse_cli_output(result.stdout)
    attr_short_name = ATTRIBUTES[attribute].name
    assert output[attr_short_name] == "FooBar"
    meta = OSXMetaData(temp_file)
    assert meta.get_attribute(attribute) == "FooBar"
Exemple #29
0
def test_restore(temp_file):
    from osxmetadata import OSXMetaData, Tag, kMDItemComment

    meta = OSXMetaData(temp_file)
    meta.tags = [Tag("foo"), Tag("bar")]
    meta.set_attribute(kMDItemComment, "Hello World!")
    attr_dict = meta._to_dict()
    meta.tags = []
    meta.clear_attribute(kMDItemComment)

    assert meta.tags == []
    assert meta.comment is None

    meta._restore_attributes(attr_dict)
    assert meta.tags == [Tag("foo"), Tag("bar")]
    assert meta.get_attribute(kMDItemComment) == "Hello World!"
def test_finderinfo_stationarypad_and_color(temp_file):
    """Test ability to modify color and stationary pad independently"""
    from osxmetadata import OSXMetaData, Tag
    from osxmetadata.constants import (
        FINDER_COLOR_GREEN,
        FINDER_COLOR_BLUE,
        FINDER_COLOR_NONE,
    )

    meta = OSXMetaData(temp_file)

    assert meta.finderinfo.stationarypad == 0
    assert meta.finderinfo.color == FINDER_COLOR_NONE

    meta.finderinfo.stationarypad = True
    assert meta.finderinfo.stationarypad
    assert meta.finderinfo.color == FINDER_COLOR_NONE

    meta.finderinfo.color = FINDER_COLOR_GREEN
    assert meta.finderinfo.color == FINDER_COLOR_GREEN
    assert meta.finderinfo.stationarypad

    meta.finderinfo.stationarypad = False
    assert not meta.finderinfo.stationarypad
    assert meta.finderinfo.color == FINDER_COLOR_GREEN

    assert {
        "color": FINDER_COLOR_GREEN,
        "stationarypad": False,
    }.items() <= meta.get_attribute("finderinfo").items()

    meta.set_attribute("finderinfo", {"stationarypad": True})
    assert meta.finderinfo.stationarypad
    assert meta.finderinfo.color == FINDER_COLOR_GREEN

    meta.set_attribute("finderinfo", {"color": FINDER_COLOR_BLUE})
    assert meta.finderinfo.color == FINDER_COLOR_BLUE
    assert meta.finderinfo.stationarypad

    meta.finderinfo = {"color": FINDER_COLOR_GREEN}
    assert meta.finderinfo.color == FINDER_COLOR_GREEN
    assert meta.finderinfo.stationarypad

    meta.finderinfo = {"stationarypad": False}
    assert meta.finderinfo.color == FINDER_COLOR_GREEN
    assert not meta.finderinfo.stationarypad