diff --git a/src/tests/Browser/Pages/Signup.php b/src/tests/Browser/Pages/Signup.php new file mode 100644 index 00000000..42a5d1be --- /dev/null +++ b/src/tests/Browser/Pages/Signup.php @@ -0,0 +1,48 @@ +assertPathIs('/signup') + ->assertPresent('@step1'); + } + + /** + * Get the element shortcuts for the page. + * + * @return array + */ + public function elements(): array + { + return [ + '@app' => '#app', + '@step1' => '#step1', + '@step2' => '#step2', + '@step3' => '#step3', + ]; + } +} diff --git a/src/tests/Browser/SignupTest.php b/src/tests/Browser/SignupTest.php new file mode 100644 index 00000000..17ab813c --- /dev/null +++ b/src/tests/Browser/SignupTest.php @@ -0,0 +1,136 @@ +browse(function (Browser $browser) { + $browser->visit(new Signup); + + $browser->assertVisible('@step1'); + + // Submit empty form + // Both Step 1 inputs are required, so after pressing Submit + // we expect focus to be moved to the first input + $browser->with('@step1', function ($step) { + $step->click('[type=submit]'); + $step->assertFocused('#signup_name'); + }); + + // Submit invalid email + // We expect email input to have is-invalid class added, with .invalid-feedback element + $browser->with('@step1', function ($step) use ($browser) { + $step->type('#signup_name', 'Test User'); + $step->type('#signup_email', '@test'); + $step->click('[type=submit]'); + + $step->waitFor('#signup_email.is-invalid'); + $step->waitFor('#signup_email + .invalid-feedback'); + $browser->waitFor('.toast-error'); + }); + + // Submit valid data + // We expect error state on email input to be removed, and Step 2 form visible + $browser->with('@step1', function ($step) { + $step->type('#signup_name', 'Test User'); + $step->type('#signup_email', 'BrowserSignupTestUser1@kolab.org'); + $step->click('[type=submit]'); + + $step->assertMissing('#signup_email.is-invalid'); + $step->assertMissing('#signup_email + .invalid-feedback'); + }); + + $browser->waitFor('@step2'); + $browser->assertMissing('@step1'); + }); + } + + /** + * Test 2nd Step of the signup process + * + * @depends testSignupStep1 + * @return void + */ + public function testSignupStep2() + { + $this->browse(function (Browser $browser) { + $browser->assertVisible('@step2'); + + // Here we expect one text input, Back and Continue buttons + $browser->with('@step2', function ($step) { + $step->assertVisible('#signup_code'); + $step->assertVisible('[type=button]'); + $step->assertVisible('[type=submit]'); + }); + + $browser->click('@step2 [type=button]'); + $browser->waitFor('@step1'); + $browser->assertMissing('@step2'); + + // Submit valid Step 1 data (again) + $browser->with('@step1', function ($step) { + $step->type('#signup_name', 'Test User'); + $step->type('#signup_email', 'BrowserSignupTestUser1@kolab.org'); + $step->click('[type=submit]'); + }); + + $browser->waitFor('@step2'); + $browser->assertMissing('@step1'); + + // Submit invalid code + // We expect code input to have is-invalid class added, with .invalid-feedback element + $browser->with('@step2', function ($step) use ($browser) { + $step->type('#signup_code', 'XXXXX'); + $step->click('[type=submit]'); + + $step->waitFor('#signup_code.is-invalid'); + $step->waitFor('#signup_code + .invalid-feedback'); + $browser->waitFor('.toast-error'); + }); + + // Submit valid code + // We expect error state on code input to be removed, and Step 3 form visible + $browser->with('@step1', function ($step) { + // TODO: check existence of the signup code in ajax response + // Get the short_code from database + + $step->type('#signup_code', 'YYYYYY'); + $step->click('[type=submit]'); + + $step->assertMissing('#signup_code.is-invalid'); + $step->assertMissing('#signup_code + .invalid-feedback'); + }); + + $browser->waitFor('@step3'); + $browser->assertMissing('@step2'); + }); + } + + /** + * Test 3rd Step of the signup process + * + * @depends testSignupStep2 + * @return void + */ + public function testSignupStep3() + { + $this->browse(function (Browser $browser) { + $browser->assertVisible('@step3'); + }); + } +}