def test_discover_all_activities():
    mod = "fixtures.fakeext"
    activities = discover_activities(mod, "probe")
    assert len(activities) == 8

    activities = iter(activities)

    activity = next(activities)
    assert activity["name"] == "many_args"
    assert activity["type"] == "probe"
    assert activity["mod"] == mod
    assert activity["doc"] == "Many arguments."
    assert activity["arguments"] == [
        {"name": "message", "type": "string"},
        {"name": "colour", "default": "blue", "type": "string"},
    ]

    activity = next(activities)
    assert activity["name"] == "many_args_with_rich_types"
    assert activity["type"] == "probe"
    assert activity["mod"] == mod
    assert activity["doc"] == "Many arguments with rich types."
    assert activity["arguments"] == [
        {"name": "message", "type": "string"},
        {"name": "recipients", "type": "list"},
        {"name": "colour", "default": "blue", "type": "string"},
        {"name": "count", "default": 1, "type": "integer"},
        {"name": "logit", "default": False, "type": "boolean"},
        {"name": "other", "default": None, "type": "object"},
    ]

    activity = next(activities)
    assert activity["name"] == "no_args"
    assert activity["type"] == "probe"
    assert activity["mod"] == mod
    assert activity["doc"] == "No arguments."
    assert activity["arguments"] == []

    activity = next(activities)
    assert activity["name"] == "no_args_docstring"
    assert activity["type"] == "probe"
    assert activity["mod"] == mod
    assert activity["doc"] is None
    assert activity["arguments"] == []

    activity = next(activities)
    assert activity["name"] == "one_arg"
    assert activity["type"] == "probe"
    assert activity["mod"] == mod
    assert activity["doc"] == "One typed argument."
    assert activity["arguments"] == [{"name": "message", "type": "string"}]

    activity = next(activities)
    assert activity["name"] == "one_arg_with_default"
    assert activity["type"] == "probe"
    assert activity["mod"] == mod
    assert activity["doc"] == "One typed argument with a default value."
    assert activity["arguments"] == [
        {"name": "message", "default": "hello", "type": "string"}
    ]

    activity = next(activities)
    assert activity["name"] == "one_untyped_arg"
    assert activity["type"] == "probe"
    assert activity["mod"] == mod
    assert activity["doc"] == "One untyped argument."
    assert activity["arguments"] == [{"name": "message"}]

    activity = next(activities)
    assert activity["name"] == "one_untyped_arg_with_default"
    assert activity["type"] == "probe"
    assert activity["mod"] == mod
    assert activity["doc"] == "One untyped argument with a default value."
    assert activity["arguments"] == [{"name": "message", "default": "hello"}]
def test_fail_discovery_when_module_cannot_be_loaded():
    with pytest.raises(DiscoveryFailed) as exc:
        discover_activities("fixtures.burp", "probe")
    assert "could not import extension module" in str(exc.value)
def test_do_not_fail_when_extension_mod_has_not_all():
    activities = discover_activities("fixtures.keepempty", "probe")
    assert len(activities) == 0