Ejemplo n.º 1
0
def test_notice():
    """Test notice-related functions of the error bundler."""

    # Use the StringIO as an output buffer.
    bundle = ErrorBundle()

    bundle.notice((), '')

    # Load the JSON output as an object.
    output = json.loads(bundle.render_json())

    # Run some basic tests
    assert len(output['messages']) == 1

    print output

    has_ = False

    for message in output['messages']:
        print message

        if message['type'] == 'notice':
            has_ = True

    assert has_
    assert not bundle.failed()
    assert not bundle.failed(True)
Ejemplo n.º 2
0
def test_json_compatibility():
    """Test compatibility elements in the JSON output."""

    err = ErrorBundle()
    err.notice(err_id="m1", notice="Compat error", description="Compatibility error 1", compatibility_type="error")

    err.notice(err_id="m2", notice="Compat error", description="Compatibility error 2", compatibility_type="error")

    err.warning(err_id="m3", warning="Compat notice", description="Compatibility notice 1", compatibility_type="notice")

    err.warning(
        err_id="m4", warning="Compat warning", description="Compatibility warning 1", compatibility_type="warning"
    )

    err.warning(
        err_id="m5", warning="Compat warning", description="Compatibility warning 1", compatibility_type="warning"
    )

    err.error(err_id="foo", error="Something else", description="An error that has nothign to do with compatibility")

    results = err.render_json()
    jdata = json.loads(results)

    assert "compatibility_summary" in jdata
    nose.tools.eq_(jdata["compatibility_summary"], {"errors": 2, "warnings": 2, "notices": 1})
    reference = {"m1": "error", "m2": "error", "m3": "notice", "m4": "warning", "m5": "warning"}

    assert "messages" in jdata and len(jdata["messages"])
    for message in jdata["messages"]:
        if message["id"] in reference:
            print (message["id"], reference[message["id"]], message["compatibility_type"])
            nose.tools.eq_(reference[message["id"]], message["compatibility_type"])
Ejemplo n.º 3
0
def test_json_compatibility():
    """Test compatibility elements in the JSON output."""

    err = ErrorBundle()
    err.notice(
        err_id='m1',
        notice='Compat error',
        description='Compatibility error 1',
        compatibility_type='error')

    err.notice(
        err_id='m2',
        notice='Compat error',
        description='Compatibility error 2',
        compatibility_type='error')

    err.warning(
        err_id='m3',
        warning='Compat notice',
        description='Compatibility notice 1',
        compatibility_type='notice')

    err.warning(
        err_id='m4',
        warning='Compat warning',
        description='Compatibility warning 1',
        compatibility_type='warning')

    err.warning(
        err_id='m5',
        warning='Compat warning',
        description='Compatibility warning 1',
        compatibility_type='warning')

    err.error(
        err_id='foo',
        error='Something else',
        description='An error that has nothign to do with compatibility')

    results = err.render_json()
    jdata = json.loads(results)

    assert 'compatibility_summary' in jdata
    assert jdata['compatibility_summary'] == {
                     'errors': 2,
                     'warnings': 2,
                     'notices': 1}
    reference = {'m1': 'error',
                 'm2': 'error',
                 'm3': 'notice',
                 'm4': 'warning',
                 'm5': 'warning'}

    assert 'messages' in jdata and len(jdata['messages'])
    for message in jdata['messages']:
        if message['id'] in reference:
            print (message['id'],
                   reference[message['id']],
                   message['compatibility_type'])
            assert reference[message['id']] == message['compatibility_type']
Ejemplo n.º 4
0
def test_notice():
    """Test notice-related functions of the error bundler."""

    # Use the StringIO as an output buffer.
    bundle = ErrorBundle()

    bundle.notice((), "")

    # Load the JSON output as an object.
    output = json.loads(bundle.render_json())

    # Run some basic tests
    assert len(output["messages"]) == 1

    print output

    has_ = False

    for message in output["messages"]:
        print message

        if message["type"] == "notice":
            has_ = True

    assert has_
    assert not bundle.failed()
    assert not bundle.failed(True)
Ejemplo n.º 5
0
def test_json_compatibility():
    """Test compatibility elements in the JSON output."""

    err = ErrorBundle()
    err.notice(err_id="m1",
               notice="Compat error",
               description="Compatibility error 1",
               compatibility_type="error")

    err.notice(err_id="m2",
               notice="Compat error",
               description="Compatibility error 2",
               compatibility_type="error")

    err.warning(err_id="m3",
                warning="Compat notice",
                description="Compatibility notice 1",
                compatibility_type="notice")

    err.warning(err_id="m4",
                warning="Compat warning",
                description="Compatibility warning 1",
                compatibility_type="warning")

    err.warning(err_id="m5",
                warning="Compat warning",
                description="Compatibility warning 1",
                compatibility_type="warning")

    err.error(err_id="foo",
              error="Something else",
              description="An error that has nothign to do with compatibility")

    results = err.render_json()
    jdata = json.loads(results)

    assert "compatibility_summary" in jdata
    nose.tools.eq_(jdata["compatibility_summary"], {
        "errors": 2,
        "warnings": 2,
        "notices": 1
    })
    reference = {
        "m1": "error",
        "m2": "error",
        "m3": "notice",
        "m4": "warning",
        "m5": "warning"
    }

    assert "messages" in jdata and len(jdata["messages"])
    for message in jdata["messages"]:
        if message["id"] in reference:
            print(message["id"], reference[message["id"]],
                  message["compatibility_type"])
            nose.tools.eq_(reference[message["id"]],
                           message["compatibility_type"])
Ejemplo n.º 6
0
def test_notice_friendly():
    """Tests notice-related human-friendly text output functions of the
    error bundler."""
    
    # Use the StringIO as an output buffer.
    bundle = ErrorBundle()
    
    bundle.notice((), "foobar")
    
    # Load the JSON output as an object.
    output = bundle.print_summary(verbose=True, no_color=True)
    print output
    
    assert output.count("foobar")
Ejemplo n.º 7
0
def test_json_constructs():
    """This tests some of the internal JSON stuff so we don't break zamboni."""

    e = ErrorBundle()
    e.detected_type = 1
    e.error(('a', 'b', 'c'), 'Test')
    e.error(('a', 'b', 'foo'), 'Test')
    e.error(('a', 'foo', 'c'), 'Test')
    e.error(('a', 'foo', 'c'), 'Test')
    e.error(('b', 'foo', 'bar'), 'Test')
    e.warning((), 'Context test', context=('x', 'y', 'z'))
    e.warning((),
              'Context test',
              context=ContextGenerator('x\ny\nz\n'),
              line=2,
              column=0)
    e.notice((), 'none')
    e.notice((), 'line', line=1)
    e.notice((), 'column', column=0)
    e.notice((), 'line column', line=1, column=1)

    results = e.render_json()
    print results
    j = json.loads(results)

    assert 'detected_type' in j
    assert j['detected_type'] == 'extension'

    assert 'message_tree' in j
    tree = j['message_tree']

    assert '__errors' not in tree
    assert not tree['a']['__messages']
    assert tree['a']['__errors'] == 4
    assert not tree['a']['b']['__messages']
    assert tree['a']['b']['__errors'] == 2
    assert not tree['a']['b']['__messages']
    assert tree['a']['b']['c']['__errors'] == 1
    assert tree['a']['b']['c']['__messages']

    assert 'messages' in j
    for m in (m for m in j['messages'] if m['type'] == 'warning'):
        assert m['context'] == ['x', 'y', 'z']

    for m in (m for m in j['messages'] if m['type'] == 'notice'):
        if 'line' in m['message']:
            assert m['line'] is not None
            assert isinstance(m['line'], int)
            assert m['line'] > 0
        else:
            assert m['line'] is None

        if 'column' in m['message']:
            assert m['column'] is not None
            assert isinstance(m['column'], int)
            assert m['column'] > -1
        else:
            assert m['column'] is None
Ejemplo n.º 8
0
def test_json_constructs():
    """This tests some of the internal JSON stuff so we don't break zamboni."""

    e = ErrorBundle()
    e.detected_type = 1
    e.error(("a", "b", "c"), "Test")
    e.error(("a", "b", "foo"), "Test")
    e.error(("a", "foo", "c"), "Test")
    e.error(("a", "foo", "c"), "Test")
    e.error(("b", "foo", "bar"), "Test")
    e.warning((), "Context test", context=("x", "y", "z"))
    e.warning((),
              "Context test",
              context=ContextGenerator("x\ny\nz\n"),
              line=2,
              column=0)
    e.notice((), "none")
    e.notice((), "line", line=1)
    e.notice((), "column", column=0)
    e.notice((), "line column", line=1, column=1)

    results = e.render_json()
    print results
    j = json.loads(results)

    assert "detected_type" in j
    assert j["detected_type"] == "extension"

    assert "message_tree" in j
    tree = j["message_tree"]

    assert "__errors" not in tree
    assert not tree["a"]["__messages"]
    assert tree["a"]["__errors"] == 4
    assert not tree["a"]["b"]["__messages"]
    assert tree["a"]["b"]["__errors"] == 2
    assert not tree["a"]["b"]["__messages"]
    assert tree["a"]["b"]["c"]["__errors"] == 1
    assert tree["a"]["b"]["c"]["__messages"]

    assert "messages" in j
    for m in (m for m in j["messages"] if m["type"] == "warning"):
        assert m["context"] == ["x", "y", "z"]

    for m in (m for m in j["messages"] if m["type"] == "notice"):
        if "line" in m["message"]:
            assert m["line"] is not None
            assert isinstance(m["line"], int)
            assert m["line"] > 0
        else:
            assert m["line"] is None

        if "column" in m["message"]:
            assert m["column"] is not None
            assert isinstance(m["column"], int)
            assert m["column"] > -1
        else:
            assert m["column"] is None
Ejemplo n.º 9
0
def test_notice_friendly():
    """
    Test notice-related human-friendly text output functions of the error
    bundler.
    """

    # Use the StringIO as an output buffer.
    bundle = ErrorBundle()

    bundle.notice((), 'foobar')

    # Load the JSON output as an object.
    output = bundle.print_summary(verbose=True, no_color=True)
    print output

    assert output.count('foobar')
Ejemplo n.º 10
0
def test_json_constructs():
    """This tests some of the internal JSON stuff so we don't break zamboni."""

    e = ErrorBundle()
    e.detected_type = 1
    e.error(("a", "b", "c"), "Test")
    e.error(("a", "b", "foo"), "Test")
    e.error(("a", "foo", "c"), "Test")
    e.error(("a", "foo", "c"), "Test")
    e.error(("b", "foo", "bar"), "Test")
    e.warning((), "Context test", context=("x", "y", "z"))
    e.warning((), "Context test", context=ContextGenerator("x\ny\nz\n"), line=2, column=0)
    e.notice((), "none")
    e.notice((), "line", line=1)
    e.notice((), "column", column=0)
    e.notice((), "line column", line=1, column=1)

    results = e.render_json()
    print results
    j = json.loads(results)

    assert "detected_type" in j
    assert j["detected_type"] == "extension"

    assert "message_tree" in j
    tree = j["message_tree"]

    assert "__errors" not in tree
    assert not tree["a"]["__messages"]
    assert tree["a"]["__errors"] == 4
    assert not tree["a"]["b"]["__messages"]
    assert tree["a"]["b"]["__errors"] == 2
    assert not tree["a"]["b"]["__messages"]
    assert tree["a"]["b"]["c"]["__errors"] == 1
    assert tree["a"]["b"]["c"]["__messages"]

    assert "messages" in j
    for m in (m for m in j["messages"] if m["type"] == "warning"):
        assert m["context"] == ["x", "y", "z"]

    for m in (m for m in j["messages"] if m["type"] == "notice"):
        if "line" in m["message"]:
            assert m["line"] is not None
            assert isinstance(m["line"], int)
            assert m["line"] > 0
        else:
            assert m["line"] is None

        if "column" in m["message"]:
            assert m["column"] is not None
            assert isinstance(m["column"], int)
            assert m["column"] > -1
        else:
            assert m["column"] is None
Ejemplo n.º 11
0
def test_json():
    "Tests the JSON output capability of the error bundler."
    
    # Use the StringIO as an output buffer.
    bundle = ErrorBundle() # No color since no output
    bundle.set_type(4)
    bundle.tier = 3
    
    bundle.error((), "error", "description")
    bundle.warning((), "warning", "description")
    bundle.notice((), "notice", "description")
    
    results = json.loads(bundle.render_json())
    
    print results
    
    assert len(results["messages"]) == 3
    assert results["detected_type"] == 'langpack'
    assert not results["success"]
    assert results["ending_tier"] == 3
Ejemplo n.º 12
0
def test_json():
    """Test the JSON output capability of the error bundler."""

    # Use the StringIO as an output buffer.
    bundle = ErrorBundle()  # No color since no output
    bundle.detected_type = 4
    bundle.set_tier(4)
    bundle.set_tier(3)

    bundle.error((), 'error', 'description')
    bundle.warning((), 'warning', 'description')
    bundle.notice((), 'notice', 'description')

    results = json.loads(bundle.render_json())

    print results

    assert len(results['messages']) == 3
    assert results['detected_type'] == 'langpack'
    assert not results['success']
    assert results['ending_tier'] == 4
def test_json():
    """Test the JSON output capability of the error bundler."""

    # Use the StringIO as an output buffer.
    bundle = ErrorBundle()  # No color since no output
    bundle.detected_type = 4
    bundle.set_tier(4)
    bundle.set_tier(3)

    bundle.error((), 'error', 'description')
    bundle.warning((), 'warning', 'description')
    bundle.notice((), 'notice', 'description')

    results = json.loads(bundle.render_json())

    print results

    assert len(results['messages']) == 3
    assert results['detected_type'] == 'langpack'
    assert not results['success']
    assert results['ending_tier'] == 4
Ejemplo n.º 14
0
def test_json():
    """Test the JSON output capability of the error bundler."""

    # Use the StringIO as an output buffer.
    bundle = ErrorBundle()  # No color since no output
    bundle.detected_type = 4
    bundle.set_tier(4)
    bundle.set_tier(3)

    bundle.error((), "error", "description")
    bundle.warning((), "warning", "description")
    bundle.notice((), "notice", "description")

    results = json.loads(bundle.render_json())

    print results

    assert len(results["messages"]) == 3
    assert results["detected_type"] == 'langpack'
    assert not results["success"]
    assert results["ending_tier"] == 4
Ejemplo n.º 15
0
def test_forappversions():
    """Test that app version information is passed to the JSON."""

    app_test_data = {"guid": ["version1", "version2"]}

    e = ErrorBundle()
    e.supported_versions = {"guid": ["version1"]}
    e.error(err_id=("foo",), error="Test", for_appversions=app_test_data)
    # This one should not apply.
    e.error(err_id=("foo",), error="Test", for_appversions={"fooguid": ["bar", "baz"]})

    e.warning(err_id=("foo",), warning="Test", for_appversions=app_test_data)

    # Give one its data from the decorator
    e.version_requirements = app_test_data
    e.notice(err_id=("foo",), notice="Test")

    j = e.render_json()
    jdata = json.loads(j)
    assert len(jdata["messages"]) == 3
    for m in jdata["messages"]:
        assert m["for_appversions"] == app_test_data
Ejemplo n.º 16
0
def test_forappversions():
    """Test that app version information is passed to the JSON."""

    app_test_data = {'guid': ['version1', 'version2']}

    e = ErrorBundle()
    e.supported_versions = {'guid': ['version1']}
    e.error(err_id=('foo', ), error='Test', for_appversions=app_test_data)
    # This one should not apply.
    e.error(err_id=('foo', ), error='Test',
            for_appversions={'fooguid': ['bar', 'baz']})

    e.warning(err_id=('foo', ), warning='Test', for_appversions=app_test_data)

    # Give one its data from the decorator
    e.version_requirements = app_test_data
    e.notice(err_id=('foo', ), notice='Test')

    j = e.render_json()
    jdata = json.loads(j)
    assert len(jdata['messages']) == 3
    for m in jdata['messages']:
        assert m['for_appversions'] == app_test_data
Ejemplo n.º 17
0
def test_forappversions():
    """Test that app version information is passed to the JSON."""

    app_test_data = {"guid": ["version1", "version2"]}

    e = ErrorBundle()
    e.supported_versions = {"guid": ["version1"]}
    e.error(err_id=("foo", ), error="Test", for_appversions=app_test_data)
    # This one should not apply.
    e.error(err_id=("foo", ),
            error="Test",
            for_appversions={"fooguid": ["bar", "baz"]})

    e.warning(err_id=("foo", ), warning="Test", for_appversions=app_test_data)

    # Give one its data from the decorator
    e.version_requirements = app_test_data
    e.notice(err_id=("foo", ), notice="Test")

    j = e.render_json()
    jdata = json.loads(j)
    assert len(jdata["messages"]) == 3
    for m in jdata["messages"]:
        assert m["for_appversions"] == app_test_data
Ejemplo n.º 18
0
def test_states():
    """Test that detected type is preserved, even in subpackages."""

    # Use the StringIO as an output buffer.
    bundle = ErrorBundle()

    # Populate the bundle with some test data.
    bundle.detected_type = 4
    bundle.error((), "error")
    bundle.warning((), "warning")
    bundle.notice((), "notice")
    bundle.save_resource("test", True)

    # Push a state
    bundle.push_state("test.xpi")

    bundle.detected_type = 2
    bundle.error((), "nested error")
    bundle.warning((), "nested warning")
    bundle.notice((), "nested notice")

    # Push another state
    bundle.push_state("test2.xpi")

    bundle.detected_type = 3
    bundle.error((), "super nested error")
    bundle.warning((), "super nested warning")
    bundle.notice((), "super nested notice")

    # Test that nested compatibility messages retain various # properties.
    bundle.notice("comp", "Compat Test notice", compatibility_type="error", editors_only=True, signing_severity="high")

    bundle.pop_state()

    bundle.pop_state()

    # Load the JSON output as an object.
    output = json.loads(bundle.render_json())

    # Run some basic tests
    assert output["detected_type"] == "langpack"
    assert len(output["messages"]) == 10

    messages = [
        "error",
        "warning",
        "notice",
        "nested error",
        "nested warning",
        "nested notice",
        "super nested error",
        "super nested warning",
        "super nested notice",
        "Compat Test notice",
    ]

    for message in output["messages"]:
        assert message["message"] in messages
        messages.remove(message["message"])

        assert message["message"].endswith(message["type"])

        if message["id"] == "comp":
            assert message["compatibility_type"] == "error"
            assert message["editors_only"] == True
            assert message["signing_severity"] == "high"

    assert not messages

    assert bundle.get_resource("test")
Ejemplo n.º 19
0
def test_states():
    """Test that detected type is preserved, even in subpackages."""

    # Use the StringIO as an output buffer.
    bundle = ErrorBundle()

    # Populate the bundle with some test data.
    bundle.detected_type = 4
    bundle.error((), "error")
    bundle.warning((), "warning")
    bundle.notice((), "notice")
    bundle.save_resource("test", True)

    # Push a state
    bundle.push_state("test.xpi")

    bundle.detected_type = 2
    bundle.error((), "nested error")
    bundle.warning((), "nested warning")
    bundle.notice((), "nested notice")

    # Push another state
    bundle.push_state("test2.xpi")

    bundle.detected_type = 3
    bundle.error((), "super nested error")
    bundle.warning((), "super nested warning")
    bundle.notice((), "super nested notice")

    # Test that nested compatibility messages retain their value
    bundle.notice("comp", "Compat Test notice", compatibility_type="error")

    bundle.pop_state()

    bundle.pop_state()

    # Load the JSON output as an object.
    output = json.loads(bundle.render_json())

    # Run some basic tests
    assert output["detected_type"] == "langpack"
    assert len(output["messages"]) == 10

    print output

    messages = [
        "error", "warning", "notice", "nested error", "nested warning",
        "nested notice", "super nested error", "super nested warning",
        "super nested notice", "Compat Test notice"
    ]

    for message in output["messages"]:
        print message

        assert message["message"] in messages
        messages.remove(message["message"])

        assert message["message"].endswith(message["type"])

        if message["id"] == "comp":
            assert message["compatibility_type"] == "error"

    assert not messages

    assert bundle.get_resource("test")
Ejemplo n.º 20
0
def test_states():
    """Tests that detected type is preserved, even in subpackages."""
    
    # Use the StringIO as an output buffer.
    bundle = ErrorBundle()
    
    # Populate the bundle with some test data.
    bundle.set_type(4)
    bundle.error((), "error")
    bundle.warning((), "warning")
    bundle.notice((), "notice")
    bundle.save_resource("test", True)
    
    # Push a state
    bundle.push_state("test.xpi")
    
    bundle.set_type(2)
    bundle.error((), "nested error")
    bundle.warning((), "nested warning")
    bundle.notice((), "nested notice")
    
    # Push another state
    bundle.push_state("test2.xpi")
    
    bundle.set_type(3)
    bundle.error((), "super nested error")
    bundle.warning((), "super nested warning")
    bundle.notice((), "super nested notice")
    
    bundle.pop_state()
    
    bundle.pop_state()
    
    # Load the JSON output as an object.
    output = json.loads(bundle.render_json())
    
    # Run some basic tests
    assert output["detected_type"] == "langpack"
    assert len(output["messages"]) == 9
    
    print output
    
    messages = ["error",
                "warning",
                "notice",
                "nested error",
                "nested warning",
                "nested notice",
                "super nested error",
                "super nested warning",
                "super nested notice"]
    
    for message in output["messages"]:
        print message
        
        assert message["message"] in messages
        messages.remove(message["message"])
        
        assert message["message"].endswith(message["type"])
    
    assert not messages
    
    assert bundle.get_resource("test")
def test_json_constructs():
    """This tests some of the internal JSON stuff so we don't break zamboni."""

    e = ErrorBundle()
    e.detected_type = 1
    e.error(('a', 'b', 'c'),
            'Test')
    e.error(('a', 'b', 'foo'),
            'Test')
    e.error(('a', 'foo', 'c'),
            'Test')
    e.error(('a', 'foo', 'c'),
            'Test')
    e.error(('b', 'foo', 'bar'),
            'Test')
    e.warning((), 'Context test',
              context=('x', 'y', 'z'))
    e.warning((), 'Context test',
              context=ContextGenerator('x\ny\nz\n'),
              line=2,
              column=0)
    e.notice((), 'none')
    e.notice((), 'line',
             line=1)
    e.notice((), 'column',
             column=0)
    e.notice((), 'line column',
             line=1,
             column=1)

    results = e.render_json()
    print results
    j = json.loads(results)

    assert 'detected_type' in j
    assert j['detected_type'] == 'extension'

    assert 'message_tree' in j
    tree = j['message_tree']

    assert '__errors' not in tree
    assert not tree['a']['__messages']
    assert tree['a']['__errors'] == 4
    assert not tree['a']['b']['__messages']
    assert tree['a']['b']['__errors'] == 2
    assert not tree['a']['b']['__messages']
    assert tree['a']['b']['c']['__errors'] == 1
    assert tree['a']['b']['c']['__messages']

    assert 'messages' in j
    for m in (m for m in j['messages'] if m['type'] == 'warning'):
        assert m['context'] == ['x', 'y', 'z']

    for m in (m for m in j['messages'] if m['type'] == 'notice'):
        if 'line' in m['message']:
            assert m['line'] is not None
            assert isinstance(m['line'], int)
            assert m['line'] > 0
        else:
            assert m['line'] is None

        if 'column' in m['message']:
            assert m['column'] is not None
            assert isinstance(m['column'], int)
            assert m['column'] > -1
        else:
            assert m['column'] is None
Ejemplo n.º 22
0
def test_states():
    """Test that detected type is preserved, even in subpackages."""

    # Use the StringIO as an output buffer.
    bundle = ErrorBundle()

    # Populate the bundle with some test data.
    bundle.detected_type = 4
    bundle.error((), 'error')
    bundle.warning((), 'warning')
    bundle.notice((), 'notice')
    bundle.save_resource('test', True)

    # Push a state
    bundle.push_state('test.xpi')

    bundle.detected_type = 2
    bundle.error((), 'nested error')
    bundle.warning((), 'nested warning')
    bundle.notice((), 'nested notice')

    # Push another state
    bundle.push_state('test2.xpi')

    bundle.detected_type = 3
    bundle.error((), 'super nested error')
    bundle.warning((), 'super nested warning')
    bundle.notice((), 'super nested notice')

    # Test that nested compatibility messages retain various # properties.
    bundle.notice('comp',
                  'Compat Test notice',
                  compatibility_type='error',
                  editors_only=True,
                  signing_severity='high')

    bundle.pop_state()

    bundle.pop_state()

    # Load the JSON output as an object.
    output = json.loads(bundle.render_json())

    # Run some basic tests
    assert output['detected_type'] == 'langpack'
    assert len(output['messages']) == 10

    messages = [
        'error', 'warning', 'notice', 'nested error', 'nested warning',
        'nested notice', 'super nested error', 'super nested warning',
        'super nested notice', 'Compat Test notice'
    ]

    for message in output['messages']:
        assert message['message'] in messages
        messages.remove(message['message'])

        assert message['message'].endswith(message['type'])

        if message['id'] == 'comp':
            assert message['compatibility_type'] == 'error'
            assert message['editors_only'] == True
            assert message['signing_severity'] == 'high'

    assert not messages

    assert bundle.get_resource('test')
def test_states():
    """Test that detected type is preserved, even in subpackages."""

    # Use the StringIO as an output buffer.
    bundle = ErrorBundle()

    # Populate the bundle with some test data.
    bundle.detected_type = 4
    bundle.error((), 'error')
    bundle.warning((), 'warning')
    bundle.notice((), 'notice')
    bundle.save_resource('test', True)

    # Push a state
    bundle.push_state('test.xpi')

    bundle.detected_type = 2
    bundle.error((), 'nested error')
    bundle.warning((), 'nested warning')
    bundle.notice((), 'nested notice')

    # Push another state
    bundle.push_state('test2.xpi')

    bundle.detected_type = 3
    bundle.error((), 'super nested error')
    bundle.warning((), 'super nested warning')
    bundle.notice((), 'super nested notice')

    # Test that nested compatibility messages retain various # properties.
    bundle.notice('comp', 'Compat Test notice',
                  compatibility_type='error',
                  editors_only=True,
                  signing_severity='high')

    bundle.pop_state()

    bundle.pop_state()

    # Load the JSON output as an object.
    output = json.loads(bundle.render_json())

    # Run some basic tests
    assert output['detected_type'] == 'langpack'
    assert len(output['messages']) == 10

    messages = ['error',
                'warning',
                'notice',
                'nested error',
                'nested warning',
                'nested notice',
                'super nested error',
                'super nested warning',
                'super nested notice',
                'Compat Test notice']

    for message in output['messages']:
        assert message['message'] in messages
        messages.remove(message['message'])

        assert message['message'].endswith(message['type'])

        if message['id'] == 'comp':
            assert message['compatibility_type'] == 'error'
            assert message['editors_only'] is True
            assert message['signing_severity'] == 'high'

    assert not messages

    assert bundle.get_resource('test')