Red.git | t/ | 61-model-as-type.rakutest


use Test;
use Red;
model Bla {
    model Ble is table<bla_ble> {
        has UInt $!id   is serial;
        has Str  $.name is unique;
        has Bla  @.blas is relationship{ .ble-id };
    }

    has UInt $!id     is serial;
    has UInt $!ble-id is referencing( *.id, :model(Ble));
    has Ble  $.ble    is relationship{ .ble-id };
    has Str  $.name   is unique;
}

my $*RED-FALLBACK       = $_ with %*ENV<RED_FALLBACK>;
my $*RED-DEBUG          = $_ with %*ENV<RED_DEBUG>;
my $*RED-DEBUG-RESPONSE = $_ with %*ENV<RED_DEBUG_RESPONSE>;
my $*RED-DEBUG-AST      = $_ with %*ENV<RED_DEBUG_AST>;
my @conf                = (%*ENV<RED_DATABASE> // "SQLite").split(" ");
my $driver              = @conf.shift;
my $*RED-DB             = database $driver, |%( @conf.map: { do given .split: "=" { .[0] => val .[1] } } );

schema(Bla, Bla::Ble).drop.create;

Bla.^create: :name<bla1>, :ble{ :name<ble1> };
Bla::Ble.^create: :name<ble2>, :blas[
    { :name<bla2.1> },
    { :name<bla2.2> },
    { :name<bla2.3> },
    { :name<bla2.4> },
    { :name<bla2.5> },
];

is Bla.^all.sort(*.name).map(*.name).Seq, <
    bla1
    bla2.1
    bla2.2
    bla2.3
    bla2.4
    bla2.5
>;
is Bla::Ble.^all.sort(*.name).map(*.name).Seq, <ble1 ble2>;

is Bla.^find(:name<bla1>).ble.name, "ble1";
is Bla.^find(:name<bla2.1>).ble.name, "ble2";
is Bla.^find(:name<bla2.2>).ble.name, "ble2";
is Bla.^find(:name<bla2.3>).ble.name, "ble2";
is Bla.^find(:name<bla2.4>).ble.name, "ble2";
is Bla.^find(:name<bla2.5>).ble.name, "ble2";

is Bla::Ble.^find(:name<ble1>).blas.sort(*.name).map(*.name).Seq, <bla1>;
is Bla::Ble.^find(:name<ble2>).blas.sort(*.name).map(*.name).Seq, <
    bla2.1
    bla2.2
    bla2.3
    bla2.4
    bla2.5
>;

done-testing