Red.git | t/ | 84-polymorphic2.rakutest


use v6;
use Test;
use Red;

use lib $?FILE.IO.parent(1).add('lib');

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

model Buyer  { ... }
model Seller { ... }

model Login is table<logged_user> {
    has         $.id        is serial;
    has         $.source    is column;
    has UInt    $.source-id is referencing(*.id, :model<Buyer>);
    has Instant $.created   is column = now;
    has Buyer   $.buyer     is relationship{ $^b.id == $^a.source-id && $^a.source eq "buyer"  }
    has Seller  $.seller    is relationship{ $^b.id == $^a.source-id && $^a.source eq "seller" }
}

model Buyer {
    has UInt  $.id     is serial;
    has Str   $.name   is column;
    has Login @.logins is relationship{ $^a.id == $^b.source-id && $^b.source eq "buyer" }
}

model Seller {
    has UInt  $.id     is serial;
    has Str   $.name   is column;
    has Login @.logins is relationship{ $^a.id == $^b.source-id && $^b.source eq "seller" }
}

red-defaults "SQLite";
schema(Buyer, Seller, Login).drop.create;

my $comprador = Buyer.^create:  :name<Comprador>;
my $vendedor  = Seller.^create: :name<Vendedor>;

$comprador.logins.create;
$vendedor.logins.create;

is $comprador.logins.map(*.id), <1>;
is $vendedor.logins .map(*.id), <2>;

is
    Login.^all.Seq.map({
        "Login: { .id }; Buyer: { .name with .buyer }; Seller: { .name with .seller }"
    }).join("\n"),
    chomp q:to/END/;
Login: 1; Buyer: Comprador; Seller: 
Login: 2; Buyer: ; Seller: Vendedor
END

done-testing