Beispiel #1
0
def test_tolerant_mode_doesnt_allow_breaking_changes(capsys):
    SCHEMA_FILE = 'tests/data/simple_schema.gql'
    BREAKING_CHANGES_SCHEMA = 'tests/data/simple_schema_breaking_changes.gql'
    tolerant_args = parse_args(
        ['-o', SCHEMA_FILE, '-n', BREAKING_CHANGES_SCHEMA, '--tolerant'])
    default_args = parse_args([
        '-o',
        SCHEMA_FILE,
        '-n',
        BREAKING_CHANGES_SCHEMA,
    ])
    exit_code = main(tolerant_args)
    assert exit_code == 1

    exit_code = main(default_args)
    assert exit_code == 0
Beispiel #2
0
def test_schema_rules_mode(capsys):
    SCHEMA_FILE = 'tests/data/simple_schema_rules_validation.gql'
    ANOTHER_SCHEMA_FILE = 'tests/data/simple_schema_rules_validation_new.gql'
    RULES = [
        'add-type-without-description',
        'remove-type-description',
        'add-field-without-description',
        'remove-field-description',
        'add-enum-value-without-description',
        'remove-enum-value-description',
    ]
    args = parse_args([
        '-o', SCHEMA_FILE, '--new-schema', ANOTHER_SCHEMA_FILE,
        '--validation-rules', *RULES
    ])
    exit_code = main(args)
    #  As we run the comparison in validation mode and there is a restricted change, the exit code is 1
    assert exit_code == 1

    stdout = capsys.readouterr()

    assert "⛔ Type `NewTypeWithoutDesc` was added without a description for NewTypeWithoutDesc " \
           "(rule: `add-type-without-description`)" in stdout.out
    assert "⛔ Type `NewEnumWithoutDesc` was added without a description for NewEnumWithoutDesc " \
           "(rule: `add-type-without-description`)" in stdout.out
    assert "⛔ Description for type `Field` was removed " \
           "(rule: `remove-type-description`)" in stdout.out
    assert "⛔ `Field.calculus` description was removed " \
           "(rule: `remove-field-description`)" in stdout.out
    assert "⛔ Field `c` was added to object type `Query` without a description for " \
           "Query.c (rule: `add-field-without-description`)" in stdout.out
    assert "⛔ Enum value `VALUE_3` was added to `Enum` enum without a description " \
           "(rule: `add-enum-value-without-description`)" in stdout.out
    assert "⛔ Description for enum value `VALUE_2` was removed " \
           "(rule: `remove-enum-value-description`)" in stdout.out
Beispiel #3
0
def test_schema_strict_mode_with_breaking_changes_gives_error_exit_code(
        capsys):
    SCHEMA_FILE = 'tests/data/simple_schema.gql'
    ANOTHER_SCHEMA_FILE = 'tests/data/simple_schema_breaking_changes.gql'
    args = parse_args(
        ['-o', SCHEMA_FILE, '--new-schema', ANOTHER_SCHEMA_FILE, '--strict'])
    exit_code = main(args)
    assert exit_code == 1

    stdout = capsys.readouterr()
    assert '❌ Field `a` was removed from object type `Query`\n' in stdout.out
    assert len(stdout.out.split('\n')) == 2
Beispiel #4
0
def test_schema_strict_mode(capsys):
    SCHEMA_FILE = 'tests/data/simple_schema.gql'
    ANOTHER_SCHEMA_FILE = 'tests/data/simple_schema_dangerous_changes.gql'
    args = parse_args(
        ['-o', SCHEMA_FILE, '--new-schema', ANOTHER_SCHEMA_FILE, '--strict'])
    exit_code = main(args)
    #  As we run the comparison in strict mode and there is a dangerous change, the exit code is 1
    assert exit_code == 1

    stdout = capsys.readouterr()
    assert "✔️ Field `c` was added to object type `Query`" in stdout.out
    assert "⚠️ Default value for argument `x` on field `Field.calculus` changed from `0` to `100`" in stdout.out
Beispiel #5
0
def test_schema_tolerant_mode(capsys):
    SCHEMA_FILE = 'tests/data/simple_schema.gql'
    ANOTHER_SCHEMA_FILE = 'tests/data/simple_schema_dangerous_changes.gql'
    args = parse_args(
        ['-o', SCHEMA_FILE, '--new-schema', ANOTHER_SCHEMA_FILE, '--tolerant'])
    exit_code = main(args)
    #  In tolerant mode, dangerous changes don't cause an error exit code
    assert exit_code == 0

    stdout = capsys.readouterr()
    assert "✔️ Field `c` was added to object type `Query`" in stdout.out
    assert "⚠️ Default value for argument `x` on field `Field.calculus` changed from `0` to `100`" in stdout.out
    assert len(stdout.out.split('\n')) == 3
Beispiel #6
0
def test_no_diff(capsys):
    SCHEMA_FILE = 'tests/data/simple_schema.gql'
    args = parse_args([
        '-o',
        SCHEMA_FILE,
        '-n',
        SCHEMA_FILE,
    ])
    exit_code = main(args)
    stdout = capsys.readouterr()
    assert exit_code == 0
    assert stdout.out == '🎉 Both schemas are equal!\n'
    assert stdout.err == ''
Beispiel #7
0
def test_cli_with_allow_list_does_not_show_allowed_changes(capsys):
    SCHEMA_FILE = 'tests/data/simple_schema.gql'
    ANOTHER_SCHEMA_FILE = 'tests/data/simple_schema_breaking_changes.gql'
    ALLOW_LIST = 'tests/data/allowlist.json'
    args = parse_args([
        '--old-schema', SCHEMA_FILE, '--new-schema', ANOTHER_SCHEMA_FILE, '-a',
        ALLOW_LIST
    ])
    exit_code = main(args)
    assert exit_code == 0

    stdout = capsys.readouterr().out
    # The only difference between both schemas was allowed, so there are no differences.
    assert stdout == '🎉 Both schemas are equal!\n'
Beispiel #8
0
def test_schema_default_mode(capsys):
    SCHEMA_FILE = 'tests/data/simple_schema.gql'
    ANOTHER_SCHEMA_FILE = 'tests/data/simple_schema_dangerous_changes.gql'
    args = parse_args([
        '--old-schema',
        SCHEMA_FILE,
        '--new-schema',
        ANOTHER_SCHEMA_FILE,
    ])
    exit_code = main(args)
    assert exit_code == 0

    stdout = capsys.readouterr()
    assert "✔️ Field `c` was added to object type `Query`" in stdout.out
    assert "⚠️ Default value for argument `x` on field `Field.calculus` changed from `0` to `100`" in stdout.out
Beispiel #9
0
def test_cli_exits_normally_by_default_when_strict_or_tolerant_mode_is_specified(
        capsys):
    SCHEMA_FILE = 'tests/data/simple_schema.gql'
    BREAKING_CHANGES_SCHEMA = 'tests/data/simple_schema_breaking_changes.gql'
    args = parse_args([
        '--old-schema',
        SCHEMA_FILE,
        '-n',
        BREAKING_CHANGES_SCHEMA,
    ])
    exit_code = main(args)
    assert exit_code == 0

    stdout = capsys.readouterr()
    assert '❌ Field `a` was removed from object type `Query`\n' in stdout.out
    assert len(stdout.out.split('\n')) == 2
Beispiel #10
0
def test_schema_default_mode_json_output(capsys):
    SCHEMA_FILE = 'tests/data/simple_schema.gql'
    ANOTHER_SCHEMA_FILE = 'tests/data/simple_schema_dangerous_changes.gql'
    args = parse_args([
        '--old-schema', SCHEMA_FILE, '--new-schema', ANOTHER_SCHEMA_FILE,
        '--as-json'
    ])
    exit_code = main(args)
    assert exit_code == 0

    stdout = capsys.readouterr().out
    result = json.loads(stdout)
    assert sorted(result, key=itemgetter('path')) == sorted([{
        'criticality': {
            'level': 'NON_BREAKING',
            'reason': "This change won't break any preexisting query"
        },
        'is_safe_change':
        True,
        'message':
        'Field `c` was added to object type `Query`',
        'path':
        'Query.c',
        'checksum':
        '1e3b776bda2dd8b11804e7341bb8b2d1',
    }, {
        'criticality': {
            'level':
            'DANGEROUS',
            'reason':
            'Changing the default value for an argument '
            'may change the runtime behaviour of a field if it was never provided.'
        },
        'is_safe_change':
        False,
        'message':
        'Default value for argument `x` on field `Field.calculus` changed from `0` to `100`',
        'path':
        'Field.calculus',
        'checksum':
        'a43d73d21c69cbd72334c06904439f50',
    }],
                                                            key=itemgetter(
                                                                'path'))