Red.git | t/ | 12-roles.rakutest


use Test;
use Red;
use Red::Column;

my $*RED-DB             = database "Mock";
my $*RED-DEBUG          = $_ with %*ENV<RED_DEBUG>;
my $*RED-DEBUG-RESPONSE = $_ with %*ENV<RED_DEBUG_RESPONSE>;
my $*RED-COMMENT-SQL    = $_ with %*ENV<RED_COMMENT_SQL>;
$*RED-DB.die-on-unexpected;

role Bla { has Str $.a is column }

model Ble does Bla {}

$*RED-DB.when: :once, :return[], qq:to/EOSQL/;
    CREATE TABLE "ble" (
        a text NOT NULL
    )
EOSQL

Ble.^create-table;

model Bli does Bla { has Str $.b is column }

$*RED-DB.when: :once, :return[], qq:to/EOSQL/;
    CREATE TABLE "bli" (
        a text NOT NULL,
        b text NOT NULL
    )
EOSQL

Bli.^create-table;

$*RED-DB.when: :once, :return[{:1a}], 'insert into "ble" ( a ) values ( ? )';
$*RED-DB.when: :once, :return[], 'commit';
Ble.^create: :a<1>;

role SerialId {
    has UInt $!id is serial;
}

model Blu  { ... }

model Blo does SerialId {
    has UInt $!blu-id is referencing( *.id, :model<Blu> );
    has Blu  $.blu    is relationship( *.blu-id, :no-prefetch );
}

model Blu does SerialId {
    has Blo @.blo is relationship{ .blu-id };
}

$*RED-DB.when: :once, :return[], qq:to/EOSQL/;
    create table "blo" (
        blu_id integer null references blu (id),
        id integer not null primary key autoincrement
    )
EOSQL

$*RED-DB.when: :once, :return[], qq:to/EOSQL/;
    create table "blu" (
        id integer not null primary key autoincrement
    )
EOSQL

Blo.^create-table;
Blu.^create-table;

$*RED-DB.when: :once, :return[{:1id}],            q[insert into "blu" default values];
$*RED-DB.when: :once, :return[{:1id, :1blu-id},], q[insert into "blo"( blu_id )values( ? )];
$*RED-DB.when: :twice, :return[], 'commit';

my $blu = Blu.^create;
my $blo = $blu.blo.create;

$*RED-DB.when: :return[{:1id}], 'select "blu".id from "blu" where "blu".id = ? limit 1';

isa-ok $blu, Blu;
isa-ok $blo, Blo;

is-deeply $blo.blu, $blu;

role Bar[Bool :$opt-in = False] {
   has Int $.b is column;
}

role Baz {
   has Rat $.c is column;
}

model Foo does Bar[:opt-in] does Baz {
    has Int $.id is serial;
    has Str $.a is column;
}

$*RED-DB.when: :once, :return[], q:to/EOSQL/;
    create table "foo"(
        id integer not null primary key autoincrement,
        a text not null,
        b integer not null,
        c real not null
    )
EOSQL
lives-ok { Foo.^create-table }

$*RED-DB.verify;
my $*RED-INTERNAL = True;

isa-ok Ble.a, Red::Column;
isa-ok Bli.a, Red::Column;
isa-ok Bli.b, Red::Column;

done-testing