The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
use strict;
use warnings;
use Test::More;
use Smolder::TestScript;
use Smolder::TestData qw(
  base_url
  is_smolder_running
  create_developer
  delete_developers
  create_project
  delete_projects
  create_smoke_report
  delete_smoke_reports
  create_preference
  delete_preferences
);
use Smolder::Mech;
use Smolder::DB::ProjectDeveloper;
use Smolder::Conf;
use File::Spec::Functions qw(catfile);

if (is_smolder_running) {
    plan(tests => 21);
} else {
    plan(skip_all => 'Smolder not running');
}

my $mech     = Smolder::Mech->new();
my $url      = base_url() . '/projects';
my $pw       = 's3cr3t';
my $dev      = create_developer(password => $pw);
my $proj1_id = create_project(public => 0)->id();

# add this $dev to $proj1
my $proj1_dev = Smolder::DB::ProjectDeveloper->create(
    {
        developer  => $dev,
        project    => $proj1_id,
        admin      => 1,
        preference => create_preference(),
    }
);

END {
    delete_developers();
    delete_projects();
    delete_preferences();
}

# 1
use_ok('Smolder::Control::Projects');

# 2..6
# login as a developer
$mech->get("$url/details/$proj1_id");
$mech->content_contains("Unauthorized");
$mech->content_lacks('Welcome');
$mech->login(username => $dev->username, password => $pw);
ok($mech->success);
$mech->get_ok($url);
$mech->content_contains('My Projects');

# 7..21
# admin_settings, process_admin_settings
{
    my $proj1    = _get_proj($proj1_id);
    my $url      = "/app/projects/admin_settings";
    my %settings = (
        default_arch     => 'AMD64',
        default_platform => 'Linux FC4',
        allow_anon       => 0,
    );
    $proj1->default_platform('Foo');
    $proj1->default_arch('Bar');
    $proj1->allow_anon(1);
    $proj1->update();

    # is form pre-filled
    $mech->get_ok("$url/$proj1");
    $mech->content_contains('Settings');
    $mech->content_contains('checked="checked" value="1"');
    $mech->content_contains('value="Foo"');
    $mech->content_contains('value="Bar"');

    # invalid form
    ok($mech->form_name('admin_settings_form'));
    $mech->set_fields(
        default_arch     => ('x' x 300),
        default_platform => ('x' x 300),
    );
    $mech->submit();
    ok($mech->success);
    $mech->content_contains('Default Platform must be under 255 characters');
    $mech->content_contains('Default Architecture must be under 255 characters.');

    # valid form
    ok($mech->form_name('admin_settings_form'));
    $mech->set_fields(%settings);
    $mech->submit();
    ok($mech->success);
    $mech->contains_message('successfully updated');

    my $proj_id = $proj1->id;
    $proj1 = undef;
    $proj1 = Smolder::DB::Project->retrieve($proj_id);
    foreach (keys %settings) {
        is($proj1->$_, $settings{$_});
    }
}

sub _get_proj {
    my (@ids) = @_;
    my @projs;
    foreach my $id (@ids) {
        push(@projs, Smolder::DB::Project->retrieve($id));
    }
    if (wantarray) {
        return @projs;
    } else {
        return $projs[0];
    }
}