Page Menu
Home
Phorge
Search
Configure Global Search
Log In
Files
F120834916
InvitationsTest.php
No One
Temporary
Actions
Download File
Edit File
Delete File
View Transforms
Subscribe
Flag For Later
Award Token
Authored By
Unknown
Size
11 KB
Referenced Files
None
Subscribers
None
InvitationsTest.php
View Options
<?php
namespace
Tests\Browser\Reseller
;
use
App\SignupInvitation
;
use
App\Utils
;
use
Illuminate\Support\Facades\Queue
;
use
Tests\Browser
;
use
Tests\Browser\Components\Dialog
;
use
Tests\Browser\Components\Toast
;
use
Tests\Browser\Pages\Dashboard
;
use
Tests\Browser\Pages\Home
;
use
Tests\Browser\Pages\Reseller\Invitations
;
use
Tests\TestCaseDusk
;
class
InvitationsTest
extends
TestCaseDusk
{
protected
function
setUp
():
void
{
parent
::
setUp
();
self
::
useResellerUrl
();
SignupInvitation
::
truncate
();
}
/**
* Test invitations page (unauthenticated)
*/
public
function
testInvitationsUnauth
():
void
{
// Test that the page requires authentication
$this
->
browse
(
static
function
(
Browser
$browser
)
{
$browser
->
visit
(
'/invitations'
)->
on
(
new
Home
());
});
}
/**
* Test Invitations creation
*/
public
function
testInvitationCreate
():
void
{
$this
->
browse
(
static
function
(
Browser
$browser
)
{
$date_regexp
=
'/^20[0-9]{2}-/'
;
$browser
->
visit
(
new
Home
())
->
submitLogon
(
'reseller@'
.
\config
(
'app.domain'
),
Utils
::
generatePassphrase
(),
true
)
->
on
(
new
Dashboard
())
->
assertSeeIn
(
'@links .link-invitations'
,
'Invitations'
)
->
click
(
'@links .link-invitations'
)
->
on
(
new
Invitations
())
->
assertElementsCount
(
'@table tbody tr'
,
0
)
->
assertMissing
(
'.more-loader'
)
->
assertSeeIn
(
'@table tfoot td'
,
"There are no invitations in the database."
)
->
assertSeeIn
(
'@create-button'
,
'Create invite(s)'
);
// Create a single invite with email address input
$browser
->
click
(
'@create-button'
)
->
with
(
new
Dialog
(
'#invite-create'
),
static
function
(
Browser
$browser
)
{
$browser
->
assertSeeIn
(
'@title'
,
'Invite for a signup'
)
->
assertFocused
(
'@body input#email'
)
->
assertValue
(
'@body input#email'
,
''
)
->
type
(
'@body input#email'
,
'test'
)
->
assertSeeIn
(
'@button-action'
,
'Send invite(s)'
)
->
click
(
'@button-action'
)
->
assertToast
(
Toast
::
TYPE_ERROR
,
"Form validation error"
)
->
waitFor
(
'@body input#email.is-invalid'
)
->
assertSeeIn
(
'@body input#email.is-invalid + .invalid-feedback'
,
"The email must be a valid email address."
)
->
type
(
'@body input#email'
,
'test@domain.tld'
)
->
click
(
'@button-action'
);
})
->
assertToast
(
Toast
::
TYPE_SUCCESS
,
"The invitation has been created."
)
->
waitUntilMissing
(
'#invite-create'
)
->
waitUntilMissing
(
'@table .app-loader'
)
->
assertElementsCount
(
'@table tbody tr'
,
1
)
->
assertMissing
(
'@table tfoot'
)
->
assertSeeIn
(
'@table tbody tr td.email'
,
'test@domain.tld'
)
->
assertText
(
'@table tbody tr td.email title'
,
'Not sent yet'
)
->
assertTextRegExp
(
'@table tbody tr td.datetime'
,
$date_regexp
)
->
assertVisible
(
'@table tbody tr td.buttons button.button-delete'
)
->
assertVisible
(
'@table tbody tr td.buttons button.button-resend:disabled'
);
sleep
(
1
);
// Create invites from a file
$browser
->
click
(
'@create-button'
)
->
with
(
new
Dialog
(
'#invite-create'
),
static
function
(
Browser
$browser
)
{
$browser
->
assertFocused
(
'@body input#email'
)
->
assertValue
(
'@body input#email'
,
''
)
->
assertMissing
(
'@body input#email.is-invalid'
)
// Submit an empty file
->
attach
(
'@body input#file'
,
__DIR__
.
'/../../data/empty.csv'
)
->
click
(
'@button-action'
)
->
assertToast
(
Toast
::
TYPE_ERROR
,
"Form validation error"
)
// ->waitFor('input#file.is-invalid')
->
assertSeeIn
(
'@body input#file.is-invalid + .invalid-feedback'
,
"Failed to find any valid email addresses in the uploaded file."
)
// Submit non-empty file
->
attach
(
'@body input#file'
,
__DIR__
.
'/../../data/email.csv'
)
->
click
(
'@button-action'
);
})
->
assertToast
(
Toast
::
TYPE_SUCCESS
,
"2 invitations has been created."
)
->
waitUntilMissing
(
'#invite-create'
)
->
waitUntilMissing
(
'@table .app-loader'
)
->
assertElementsCount
(
'@table tbody tr'
,
3
)
->
assertTextRegExp
(
'@table tbody tr:nth-child(1) td.email'
,
'/email[12]@test
\.
com$/'
)
->
assertTextRegExp
(
'@table tbody tr:nth-child(2) td.email'
,
'/email[12]@test
\.
com$/'
);
});
}
/**
* Test Invitations deletion and resending
*/
public
function
testInvitationDeleteAndResend
():
void
{
$this
->
browse
(
static
function
(
Browser
$browser
)
{
Queue
::
fake
();
$i1
=
SignupInvitation
::
create
([
'email'
=>
'test1@domain.org'
]);
$i2
=
SignupInvitation
::
create
([
'email'
=>
'test2@domain.org'
]);
SignupInvitation
::
where
(
'id'
,
$i1
->
id
)->
update
([
'status'
=>
SignupInvitation
::
STATUS_FAILED
]);
SignupInvitation
::
where
(
'id'
,
$i2
->
id
)->
update
([
'created_at'
=>
now
()->
subHours
(
2
)]);
$browser
->
visit
(
new
Invitations
())
->
assertElementsCount
(
'@table tbody tr'
,
2
);
// Test resending
$browser
->
assertSeeIn
(
'@table tbody tr:first-child td.email'
,
'test1@domain.org'
)
->
click
(
'@table tbody tr:first-child button.button-resend'
)
->
assertToast
(
Toast
::
TYPE_SUCCESS
,
"Invitation added to the sending queue successfully."
)
->
assertVisible
(
'@table tbody tr:first-child button.button-resend:disabled'
)
->
assertElementsCount
(
'@table tbody tr'
,
2
);
// Test deleting
$browser
->
assertSeeIn
(
'@table tbody tr:last-child td.email'
,
'test2@domain.org'
)
->
click
(
'@table tbody tr:last-child button.button-delete'
)
->
assertToast
(
Toast
::
TYPE_SUCCESS
,
"Invitation deleted successfully."
)
->
assertElementsCount
(
'@table tbody tr'
,
1
)
->
assertSeeIn
(
'@table tbody tr:first-child td.email'
,
'test1@domain.org'
);
});
}
/**
* Test Invitations list (paging and searching)
*/
public
function
testInvitationsList
():
void
{
$this
->
browse
(
static
function
(
Browser
$browser
)
{
Queue
::
fake
();
$i1
=
SignupInvitation
::
create
([
'email'
=>
'email1@ext.com'
]);
$i2
=
SignupInvitation
::
create
([
'email'
=>
'email2@ext.com'
]);
$i3
=
SignupInvitation
::
create
([
'email'
=>
'email3@ext.com'
]);
$i4
=
SignupInvitation
::
create
([
'email'
=>
'email4@other.com'
]);
$i5
=
SignupInvitation
::
create
([
'email'
=>
'email5@other.com'
]);
$i6
=
SignupInvitation
::
create
([
'email'
=>
'email6@other.com'
]);
$i7
=
SignupInvitation
::
create
([
'email'
=>
'email7@other.com'
]);
$i8
=
SignupInvitation
::
create
([
'email'
=>
'email8@other.com'
]);
$i9
=
SignupInvitation
::
create
([
'email'
=>
'email9@other.com'
]);
$i10
=
SignupInvitation
::
create
([
'email'
=>
'email10@other.com'
]);
$i11
=
SignupInvitation
::
create
([
'email'
=>
'email11@other.com'
]);
SignupInvitation
::
query
()->
update
([
'created_at'
=>
now
()->
subDays
(
1
)]);
SignupInvitation
::
where
(
'id'
,
$i1
->
id
)
->
update
([
'created_at'
=>
now
()->
subHours
(
2
),
'status'
=>
SignupInvitation
::
STATUS_FAILED
]);
SignupInvitation
::
where
(
'id'
,
$i2
->
id
)
->
update
([
'created_at'
=>
now
()->
subHours
(
3
),
'status'
=>
SignupInvitation
::
STATUS_SENT
]);
SignupInvitation
::
where
(
'id'
,
$i3
->
id
)
->
update
([
'created_at'
=>
now
()->
subHours
(
4
),
'status'
=>
SignupInvitation
::
STATUS_COMPLETED
]);
SignupInvitation
::
where
(
'id'
,
$i11
->
id
)->
update
([
'created_at'
=>
now
()->
subDays
(
3
)]);
// Test paging (load more) feature
$browser
->
visit
(
new
Invitations
())
// ->submitLogon('reseller@' . \config('app.domain'), \App\Utils::generatePassphrase(), true)
->
assertElementsCount
(
'@table tbody tr'
,
10
)
->
assertSeeIn
(
'.more-loader button'
,
'Load more'
)
->
with
(
'@table tbody'
,
static
function
(
$browser
)
use
(
$i1
,
$i2
,
$i3
)
{
$browser
->
assertSeeIn
(
'tr:nth-child(1) td.email'
,
$i1
->
email
)
->
assertText
(
'tr:nth-child(1) td.email svg.text-danger title'
,
'Sending failed'
)
->
assertVisible
(
'tr:nth-child(1) td.buttons button.button-delete'
)
->
assertVisible
(
'tr:nth-child(1) td.buttons button.button-resend:not(:disabled)'
)
->
assertSeeIn
(
'tr:nth-child(2) td.email'
,
$i2
->
email
)
->
assertText
(
'tr:nth-child(2) td.email svg.text-primary title'
,
'Sent'
)
->
assertVisible
(
'tr:nth-child(2) td.buttons button.button-delete'
)
->
assertVisible
(
'tr:nth-child(2) td.buttons button.button-resend:not(:disabled)'
)
->
assertSeeIn
(
'tr:nth-child(3) td.email'
,
$i3
->
email
)
->
assertText
(
'tr:nth-child(3) td.email svg.text-success title'
,
'User signed up'
)
->
assertVisible
(
'tr:nth-child(3) td.buttons button.button-delete'
)
->
assertVisible
(
'tr:nth-child(3) td.buttons button.button-resend:disabled'
)
->
assertText
(
'tr:nth-child(4) td.email svg title'
,
'Not sent yet'
)
->
assertVisible
(
'tr:nth-child(4) td.buttons button.button-delete'
)
->
assertVisible
(
'tr:nth-child(4) td.buttons button.button-resend:disabled'
);
})
->
click
(
'.more-loader button'
)
->
whenAvailable
(
'@table tbody tr:nth-child(11)'
,
static
function
(
$browser
)
use
(
$i11
)
{
$browser
->
assertSeeIn
(
'td.email'
,
$i11
->
email
);
})
->
assertMissing
(
'.more-loader button'
);
// Test searching (by domain)
$browser
->
type
(
'@search-input'
,
'ext.com'
)
->
click
(
'@search-button'
)
->
waitUntilMissing
(
'@table .app-loader'
)
->
assertElementsCount
(
'@table tbody tr'
,
3
)
->
assertMissing
(
'.more-loader button'
)
// search by full email
->
type
(
'@search-input'
,
'email7@other.com'
)
->
keys
(
'@search-input'
,
'{enter}'
)
->
waitUntilMissing
(
'@table .app-loader'
)
->
assertElementsCount
(
'@table tbody tr'
,
1
)
->
assertSeeIn
(
'@table tbody tr:nth-child(1) td.email'
,
'email7@other.com'
)
->
assertMissing
(
'.more-loader button'
)
// reset search
->
vueClear
(
'#search-form input'
)
->
keys
(
'@search-input'
,
'{enter}'
)
->
waitUntilMissing
(
'@table .app-loader'
)
->
assertElementsCount
(
'@table tbody tr'
,
10
)
->
assertVisible
(
'.more-loader button'
);
});
}
}
File Metadata
Details
Attached
Mime Type
text/x-php
Expires
Fri, Apr 24, 1:10 PM (5 d, 23 h ago)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
18857621
Default Alt Text
InvitationsTest.php (11 KB)
Attached To
Mode
rK kolab
Attached
Detach File
Event Timeline