def test_final_class_with_predicate_field(opts, input, renderer): input.classes = [ schema.Class("Object", properties=[ schema.PredicateProperty("foo"), ]), ] assert generate(opts, renderer) == dbscheme.Scheme( src=schema_file, includes=[], declarations=[ dbscheme.Table( name="objects", columns=[ dbscheme.Column('id', '@object', binding=True), ] ), dbscheme.Table( name="object_foo", keyset=dbscheme.KeySet(["id"]), columns=[ dbscheme.Column('id', '@object'), ] ), ], )
def test_final_class_with_repeated_field(opts, input, renderer, property_cls): input.classes = [ schema.Class("Object", properties=[ property_cls("foo", "bar"), ]), ] assert generate(opts, renderer) == dbscheme.Scheme( src=schema_file, includes=[], declarations=[ dbscheme.Table( name="objects", columns=[ dbscheme.Column('id', '@object', binding=True), ] ), dbscheme.Table( name="object_foos", keyset=dbscheme.KeySet(["id", "index"]), columns=[ dbscheme.Column('id', '@object'), dbscheme.Column('index', 'int'), dbscheme.Column('foo', 'bar'), ] ), ], )
def test_final_class_with_more_fields(opts, input, renderer): input.classes = [ schema.Class("Object", properties=[ schema.SingleProperty("one", "x"), schema.SingleProperty("two", "y"), schema.OptionalProperty("three", "z"), schema.RepeatedProperty("four", "u"), schema.RepeatedOptionalProperty("five", "v"), schema.PredicateProperty("six"), ]), ] assert generate(opts, renderer) == dbscheme.Scheme( src=schema_file, includes=[], declarations=[ dbscheme.Table( name="objects", columns=[ dbscheme.Column('id', '@object', binding=True), dbscheme.Column('one', 'x'), dbscheme.Column('two', 'y'), ] ), dbscheme.Table( name="object_threes", keyset=dbscheme.KeySet(["id"]), columns=[ dbscheme.Column('id', '@object'), dbscheme.Column('three', 'z'), ] ), dbscheme.Table( name="object_fours", keyset=dbscheme.KeySet(["id", "index"]), columns=[ dbscheme.Column('id', '@object'), dbscheme.Column('index', 'int'), dbscheme.Column('four', 'u'), ] ), dbscheme.Table( name="object_fives", keyset=dbscheme.KeySet(["id", "index"]), columns=[ dbscheme.Column('id', '@object'), dbscheme.Column('index', 'int'), dbscheme.Column('five', 'v'), ] ), dbscheme.Table( name="object_six", keyset=dbscheme.KeySet(["id"]), columns=[ dbscheme.Column('id', '@object'), ] ), ], )
def test_class_with_derived_and_repeated_property(opts, input, renderer): input.classes = [ schema.Class( name="Base", derived={"Left", "Right"}, properties=[ schema.RepeatedProperty("rep", "Prop"), ]), ] assert generate(opts, renderer) == dbscheme.Scheme( src=schema_file, includes=[], declarations=[ dbscheme.Union( lhs="@base", rhs=["@left", "@right"], ), dbscheme.Table( name="base_reps", keyset=dbscheme.KeySet(["id", "index"]), columns=[ dbscheme.Column('id', '@base'), dbscheme.Column('index', 'int'), dbscheme.Column('rep', '@prop'), ] ) ], )
def test_one_table_overridden_underscore_named_field(generate_traps): assert generate_traps([ dbscheme.Table(name="foos", columns=[dbscheme.Column("whatever_", "bar")]), ]) == [ cpp.Trap("foos", name="Foos", fields=[cpp.Field("whatever", "bar")]), ]
def test_load_table_with_keyset(load): assert load(""" #keyset[x, y,z] test_foos(); """) == [ dbscheme.Table(name="test_foos", columns=[], keyset=dbscheme.KeySet(["x", "y", "z"])) ]
def test_load_table_with_column(load, column, expected): assert load(f""" foos( {column} ); """) == [ dbscheme.Table(name="foos", columns=[deepcopy(expected)]) ]
def test_table_and_union(load): assert load(""" foos(); @foo = @bar | @baz | @bla;""") == [ dbscheme.Table(name="foos", columns=[]), dbscheme.Union(lhs="@foo", rhs=["@bar", "@baz", "@bla"]), ]
def test_one_table_with_id(generate_traps): assert generate_traps([ dbscheme.Table(name="foos", columns=[ dbscheme.Column("bla", "int", binding=True)]), ]) == [ cpp.Trap("foos", name="Foos", fields=[cpp.Field( "bla", "int")], id=cpp.Field("bla", "int")), ]
def test_load_table_with_multiple_columns(load): columns = ",\n".join(c for c, _ in expected_columns) expected = [deepcopy(e) for _, e in expected_columns] assert load(f""" foos( {columns} ); """) == [ dbscheme.Table(name="foos", columns=expected) ]
def test_comments_ignored(load): assert load(""" // fake_table(); foos(/* x */unique /*y*/int/* z */ id/* */: /* * */ @bar/*, int ignored: int ref*/); @foo = @bar | @baz | @bla; // | @xxx""") == [ dbscheme.Table(name="foos", columns=[dbscheme.Column(schema_name="id", type="@bar", binding=True)]), dbscheme.Union(lhs="@foo", rhs=["@bar", "@baz", "@bla"]), ]
def test_one_table_with_two_binding_first_is_id(generate_traps): assert generate_traps([ dbscheme.Table(name="foos", columns=[ dbscheme.Column("x", "a", binding=True), dbscheme.Column("y", "b", binding=True), ]), ]) == [ cpp.Trap("foos", name="Foos", fields=[ cpp.Field("x", "a"), cpp.Field("y", "b"), ], id=cpp.Field("x", "a")), ]
def test_empty_final_class(opts, input, renderer): input.classes = [ schema.Class("Object"), ] assert generate(opts, renderer) == dbscheme.Scheme( src=schema_file, includes=[], declarations=[ dbscheme.Table(name="objects", columns=[ dbscheme.Column('id', '@object', binding=True), ]) ], )
def test_final_class_with_single_class_field(opts, input, renderer): input.classes = [ schema.Class("Object", properties=[ schema.SingleProperty("foo", "Bar"), ]), ] assert generate(opts, renderer) == dbscheme.Scheme( src=schema_file, includes=[], declarations=[ dbscheme.Table(name="objects", columns=[ dbscheme.Column('id', '@object', binding=True), dbscheme.Column('foo', '@bar'), ]) ], )
def test_table_has_first_column_marked(): columns = [dbscheme.Column("a", "x"), dbscheme.Column("b", "y", binding=True), dbscheme.Column("c", "z")] expected = deepcopy(columns) table = dbscheme.Table("foo", columns) expected[0].first = True assert table.columns == expected
def test_load_multiple_table_with_columns(load): tables = [f"table{i}({col});" for i, (col, _) in enumerate(expected_columns)] expected = [dbscheme.Table(name=f"table{i}", columns=[deepcopy(e)]) for i, (_, e) in enumerate(expected_columns)] assert load("\n".join(tables)) == expected
def test_one_table(generate_traps): assert generate_traps([ dbscheme.Table(name="foos", columns=[dbscheme.Column("bla", "int")]), ]) == [ cpp.Trap("foos", name="Foos", fields=[cpp.Field("bla", "int")]), ]
def test_one_empty_table_rejected(generate_traps): with pytest.raises(AssertionError): generate_traps([ dbscheme.Table(name="foos", columns=[]), ])
def test_one_table_no_tags(generate_tags): assert generate_tags([ dbscheme.Table(name="foos", columns=[dbscheme.Column("bla", "int")]), ]) == []
def test_one_table_overridden_unsigned_field(generate_traps, name): assert generate_traps([ dbscheme.Table(name="foos", columns=[dbscheme.Column(name, "bar")]), ]) == [ cpp.Trap("foos", name="Foos", fields=[cpp.Field(name, "unsigned")]), ]
def test_one_table_special_types(generate_traps, column, field): assert generate_traps([ dbscheme.Table(name="foos", columns=[column]), ]) == [ cpp.Trap("foos", name="Foos", fields=[field]), ]
def test_load_one_empty_table(load): assert load(""" test_foos(); """) == [ dbscheme.Table(name="test_foos", columns=[]) ]