The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
# -*- mode: cperl -*-

# A ``setup'' block indicates tests that must pass for any of the
# remaining tests to continue.

setup {
    BTDT::Test->log_in;
    expect_url(qr{/todo});
    follow_link 'Groups';
    expect_url(qr{/groups});
    expect_content('alpha');

    # These are custom local methods; not Test::WWW::Whatever ones.
    make_and_verify_group($mech, name => 'my folks', desc => 'stuff');
    make_and_verify_group($mech, name => 'blue pants', desc => 'some description');
    make_and_verify_group_trimming($mech, name => '   leading and trailing spaces   ', desc => '  more spaces here  ');

    make_and_verify_group($mech, name => 'other folks');
}

# Each ``test'' block is its own test. If anything fails, we abort the
# current test block, and continue with the next one.

test {
    follow_link 'Groups';
    follow_link 'New Group';
    submit_action 'newgroup', { name => 'my folks' };

    expect_url { not => qr{groups/\d+/members} };
    expect_url qr{/groups/create};
    find_input { value => "my folks" };
    expect_content qr{Sorry, but someone else beat you to that name};
};

test {
    follow_link 'my folks';
    follow_link 'Members';

    expect_url qr{/groups/\d+/members};
    expect_content 'Manage group members';
    expect_content 'my folks';
    expect_content qr{Good Test *organizer}
};

test {
    follow_link 'my folks';
    follow_link 'My tasks';
    follow_link 'Braindump';
    expect_content 'See more syntax for braindump';

    fill_action 'quickcreate', { text => 'Buy new computer [personal money]' };
    click { button => 'Create' };

    expect { content => 'Buy new computer' };
    expect_content_not 'See more syntax for braindump';

    follow_link 'my folks' => 'My tasks' => 'Braindump';
    submit_action 'quickcreate',
      { text => 'Buy new computer [personal money]' },
      { button => 'Create' };

    click 'Edit';

    submit_action find_action('BTDT::Action::UpdateTask'),
        { owner_id => 'otheruser@example.com' };
}

test {
    new_session {
        log_in 'otheruser@example.com', 'something';
        click 'unaccepted';
        page { content => 'Pay off Mafia' };
        click 'Pay off Mafia';

        # Manual submit_action
        find_element { name => qr{J:A-(?:\d+)?accept} };
        submit_form { 'J:A:F-accepted-accept' => 1 };

        page { content       => 'Task accepted',
               content_lacks => 'denied' };

    };
};

# Various ways of specifying tests should only run under certain
# platforms

with ('javascript') => test {
    
};

test {
    browser 'iexplore';
};

test {
    browser 'WWW::Mechanize';
};

test {
    need_feature 'XMLHTTPRequest';
};


run_all;


# A syntax idea from jesse:

flow "Check to see if the user can login" => test {
    get '/';
    element '//body' matches /You're not logged in/;

    follow link 'Login';

    my $login_form = element id 'login-form'

    fill $login_form  =>  { 
        email => 'jesse@fsck.com',
        password => 'I hate you'
    }

    click button 'Login!';

}