The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!/usr/bin/env perl

use strict;
use warnings;

use Mango;
use MangoX::Queue;

use Test::More;

my $mango = Mango->new($ENV{MANGO_URI} // 'mongodb://localhost:27017');
my $collection = $mango->db('test')->collection('mangox_queue_test');
eval { $collection->drop };
$collection->create;

my $queue = MangoX::Queue->new(collection => $collection);

# Note - no easy/sensible way to test blocking watch
# But we'll check it at least returns
my $job = enqueue $queue status => 'Complete', 'test';
watch $queue $job, 'Complete';
ok(1, 'Blocking watch returned');

# Single watch watching a single status

$job = enqueue $queue 'test';

watch $queue $job, 'Complete' => sub {
	ok(1, 'Job status is complete');
	Mojo::IOLoop->stop;
};

Mojo::IOLoop->timer(1 => sub {
	$job->{status} = 'Complete';
	update $queue $job;
});

Mojo::IOLoop->start unless Mojo::IOLoop->is_running;

# Single watch watching multiple statuses

$job = enqueue $queue 'test';
watch $queue $job, ['Complete','Failed'] => sub {
	ok(1, 'Job status is complete or failed');
	$job->{status} = 'Pending';
	update $queue $job;
	watch $queue $job, ['Complete','Failed'] => sub {
		ok(1, 'Job status is complete or failed');
		Mojo::IOLoop->stop;
	};
	Mojo::IOLoop->timer(1 => sub {
		$job->{status} = 'Failed';
		update $queue $job;
	});
};

Mojo::IOLoop->timer(1 => sub {
	$job->{status} = 'Complete';
	update $queue $job;
});

Mojo::IOLoop->start unless Mojo::IOLoop->is_running;

# Separate complete/failed watchs

$job = enqueue $queue 'test';

watch $queue $job, 'Complete' => sub {
	ok(1, 'Job status is complete');
	Mojo::IOLoop->timer(1 => sub {
		$job->{status} = 'Failed';
		update $queue $job;
	});
};
watch $queue $job, 'Failed' => sub {
	ok(1, 'Job status is failed');
	Mojo::IOLoop->stop;
};

Mojo::IOLoop->timer(1 => sub {
	$job->{status} = 'Complete';
	update $queue $job;
});

Mojo::IOLoop->start unless Mojo::IOLoop->is_running;


done_testing;