DBIx-Class-Async

 view release on metacpan or  search on metacpan

t/103-clone.t  view on Meta::CPAN

$base_schema->deploy;
$base_schema->resultset('User')->create({ name => 'Original', email => 'orig@test.com' });

# 2. Create the parent Async Schema
my $schema = DBIx::Class::Async::Schema->connect($dsn, {
    schema_class => 'TestSchema',
    async_loop   => $loop,
    workers      => 1,
});

subtest 'Storage Alignment' => sub {
    my $clone = $schema->clone;

    # 1. Use the method call schema() instead of the hash key {schema}
    is($clone->storage->schema, $clone, 'Clone storage points to cloned schema');

    # 2. Verify that the storage itself is a new instance
    isnt($clone->storage, $schema->storage, 'Clone has its own storage instance');

    #done_testing;
};

subtest 'Basic Cloning Integrity' => sub {
    my $clone = $schema->clone(workers => 2);

    isa_ok($clone, 'DBIx::Class::Async::Schema');
    isnt($clone, $schema, 'Clone is a different object reference');
    is($clone->schema_class, $schema->schema_class, 'Schema class is preserved');

    # Verify worker counts are independent
    is($schema->{_async_db}->{_workers_config}->{_count}, 1, 'Original keeps 1 worker');
    is($clone->{_async_db}->{_workers_config}->{_count}, 2, 'Clone has 2 workers');
};

subtest 'Functional Independence' => sub {
    my $clone = $schema->clone(workers => 1);
    ok($clone->{_async_db} != $schema->{_async_db}, 'Internal engines are distinct');

    # 1. Fire the query
    my $future = $clone->resultset('User')->search_future({ name => 'Original' });

    # 2. Block until the worker responds
    $loop->await($future);

    # 3. CRITICAL: Extract the payload (an arrayref of objects)
    my ($data) = $future->get;
    my @results = (ref $data eq 'ARRAY') ? @$data : ($data);

    ok(scalar @results > 0, 'Clone can perform queries successfully');

    # 4. Access the row data
    if (@results) {
        is($results[0]->name, 'Original', 'Data retrieved via clone is correct');
    }

    #done_testing;
};

subtest 'Storage Alignment' => sub {

    my $clone = $schema->clone(); # Keep the clone alive in this scope
    is($clone->storage->schema, $clone, 'Clone storage points to cloned schema');
    isnt($clone->storage, $schema->storage, 'Clone has its own storage instance');
};

$schema->disconnect;

done_testing;



( run in 1.136 second using v1.01-cache-2.11-cpan-75ffa21a3d4 )