mirror of
https://github.com/solidtime-io/solidtime.git
synced 2026-08-14 11:12:16 +01:00
Migrated endpoints from user to member; Renamed membership to member
This commit is contained in:
@@ -4,7 +4,7 @@ declare(strict_types=1);
|
||||
|
||||
namespace Tests\Unit\Endpoint\Api\V1;
|
||||
|
||||
use App\Models\Membership;
|
||||
use App\Models\Member;
|
||||
use App\Models\Organization;
|
||||
use App\Models\User;
|
||||
use Illuminate\Foundation\Testing\RefreshDatabase;
|
||||
@@ -17,7 +17,7 @@ class ApiEndpointTestAbstract extends TestCase
|
||||
|
||||
/**
|
||||
* @param array<string> $permissions
|
||||
* @return object{user: User, organization: Organization, member: Membership}
|
||||
* @return object{user: User, organization: Organization, member: Member}
|
||||
*/
|
||||
protected function createUserWithPermission(array $permissions, bool $isOwner = false): object
|
||||
{
|
||||
@@ -29,14 +29,14 @@ class ApiEndpointTestAbstract extends TestCase
|
||||
} else {
|
||||
$organization = Organization::factory()->create();
|
||||
}
|
||||
$membership = Membership::factory()->forUser($user)->forOrganization($organization)->create([
|
||||
$member = Member::factory()->forUser($user)->forOrganization($organization)->create([
|
||||
'role' => 'custom-test',
|
||||
]);
|
||||
|
||||
return (object) [
|
||||
'user' => $user,
|
||||
'organization' => $organization,
|
||||
'member' => $membership,
|
||||
'member' => $member,
|
||||
];
|
||||
}
|
||||
}
|
||||
|
||||
@@ -4,6 +4,7 @@ declare(strict_types=1);
|
||||
|
||||
namespace Tests\Unit\Endpoint\Api\V1;
|
||||
|
||||
use App\Enums\Role;
|
||||
use App\Models\OrganizationInvitation;
|
||||
use Illuminate\Support\Facades\Mail;
|
||||
use Laravel\Jetstream\Mail\TeamInvitation;
|
||||
@@ -50,7 +51,7 @@ class InvitationEndpointTest extends ApiEndpointTestAbstract
|
||||
// Act
|
||||
$response = $this->postJson(route('api.v1.invitations.store', $data->organization->getKey()), [
|
||||
'email' => 'test@mail.test',
|
||||
'role' => 'employee',
|
||||
'role' => Role::Employee->value,
|
||||
]);
|
||||
|
||||
// Assert
|
||||
@@ -68,7 +69,7 @@ class InvitationEndpointTest extends ApiEndpointTestAbstract
|
||||
// Act
|
||||
$response = $this->postJson(route('api.v1.invitations.store', $data->organization->getKey()), [
|
||||
'email' => 'test@asdf.at',
|
||||
'role' => 'employee',
|
||||
'role' => Role::Employee->value,
|
||||
]);
|
||||
|
||||
// Assert
|
||||
@@ -76,7 +77,7 @@ class InvitationEndpointTest extends ApiEndpointTestAbstract
|
||||
$invitation = OrganizationInvitation::first();
|
||||
$this->assertNotNull($invitation);
|
||||
$this->assertEquals('test@asdf.at', $invitation->email);
|
||||
$this->assertEquals('employee', $invitation->role);
|
||||
$this->assertEquals(Role::Employee->value, $invitation->role);
|
||||
}
|
||||
|
||||
public function test_resend_fails_if_user_has_no_permission_to_resend_the_invitation(): void
|
||||
|
||||
@@ -4,7 +4,8 @@ declare(strict_types=1);
|
||||
|
||||
namespace Tests\Unit\Endpoint\Api\V1;
|
||||
|
||||
use App\Models\Membership;
|
||||
use App\Enums\Role;
|
||||
use App\Models\Member;
|
||||
use App\Models\Organization;
|
||||
use App\Models\Project;
|
||||
use App\Models\ProjectMember;
|
||||
@@ -53,7 +54,7 @@ class MemberEndpointTest extends ApiEndpointTestAbstract
|
||||
// Act
|
||||
$response = $this->putJson(route('api.v1.members.update', [$data->organization->getKey(), $data->member->getKey()]), [
|
||||
'billable_rate' => 10001,
|
||||
'role' => 'employee',
|
||||
'role' => Role::Employee->value,
|
||||
]);
|
||||
|
||||
// Assert
|
||||
@@ -74,7 +75,7 @@ class MemberEndpointTest extends ApiEndpointTestAbstract
|
||||
// Act
|
||||
$response = $this->putJson(route('api.v1.members.update', [$data->organization->getKey(), $otherData->member->getKey()]), [
|
||||
'billable_rate' => 10001,
|
||||
'role' => 'employee',
|
||||
'role' => Role::Employee->value,
|
||||
]);
|
||||
|
||||
// Assert
|
||||
@@ -92,7 +93,7 @@ class MemberEndpointTest extends ApiEndpointTestAbstract
|
||||
// Act
|
||||
$response = $this->putJson(route('api.v1.members.update', [$data->organization->id, $data->member]), [
|
||||
'billable_rate' => 10001,
|
||||
'role' => 'employee',
|
||||
'role' => Role::Employee->value,
|
||||
]);
|
||||
|
||||
// Assert
|
||||
@@ -100,7 +101,7 @@ class MemberEndpointTest extends ApiEndpointTestAbstract
|
||||
$member = $data->member;
|
||||
$member->refresh();
|
||||
$this->assertSame(10001, $member->billable_rate);
|
||||
$this->assertSame('employee', $member->role);
|
||||
$this->assertSame(Role::Employee->value, $member->role);
|
||||
}
|
||||
|
||||
public function test_invite_placeholder_succeeds_if_data_is_valid(): void
|
||||
@@ -112,7 +113,7 @@ class MemberEndpointTest extends ApiEndpointTestAbstract
|
||||
$user = User::factory()->create([
|
||||
'is_placeholder' => true,
|
||||
]);
|
||||
$member = Membership::factory()->forUser($user)->forOrganization($data->organization)->create();
|
||||
$member = Member::factory()->forUser($user)->forOrganization($data->organization)->create();
|
||||
Passport::actingAs($data->user);
|
||||
|
||||
// Act
|
||||
@@ -164,7 +165,7 @@ class MemberEndpointTest extends ApiEndpointTestAbstract
|
||||
$data = $this->createUserWithPermission([
|
||||
'members:delete',
|
||||
]);
|
||||
TimeEntry::factory()->forUser($data->user)->forOrganization($data->organization)->create();
|
||||
TimeEntry::factory()->forMember($data->member)->forOrganization($data->organization)->create();
|
||||
Passport::actingAs($data->user);
|
||||
|
||||
// Act
|
||||
@@ -173,7 +174,7 @@ class MemberEndpointTest extends ApiEndpointTestAbstract
|
||||
// Assert
|
||||
$response->assertStatus(400);
|
||||
$response->assertJsonPath('message', 'The member is still used by a time entry and can not be deleted.');
|
||||
$this->assertDatabaseHas(Membership::class, [
|
||||
$this->assertDatabaseHas(Member::class, [
|
||||
'id' => $data->member->getKey(),
|
||||
]);
|
||||
}
|
||||
@@ -185,7 +186,7 @@ class MemberEndpointTest extends ApiEndpointTestAbstract
|
||||
'members:delete',
|
||||
]);
|
||||
$project = Project::factory()->forOrganization($data->organization)->create();
|
||||
ProjectMember::factory()->forProject($project)->forUser($data->user)->create();
|
||||
ProjectMember::factory()->forProject($project)->forMember($data->member)->create();
|
||||
Passport::actingAs($data->user);
|
||||
|
||||
// Act
|
||||
@@ -194,7 +195,7 @@ class MemberEndpointTest extends ApiEndpointTestAbstract
|
||||
// Assert
|
||||
$response->assertStatus(400);
|
||||
$response->assertJsonPath('message', 'The member is still used by a project member and can not be deleted.');
|
||||
$this->assertDatabaseHas(Membership::class, [
|
||||
$this->assertDatabaseHas(Member::class, [
|
||||
'id' => $data->member->getKey(),
|
||||
]);
|
||||
}
|
||||
@@ -212,7 +213,7 @@ class MemberEndpointTest extends ApiEndpointTestAbstract
|
||||
|
||||
// Assert
|
||||
$response->assertStatus(204);
|
||||
$this->assertDatabaseMissing(Membership::class, [
|
||||
$this->assertDatabaseMissing(Member::class, [
|
||||
'id' => $data->member->getKey(),
|
||||
]);
|
||||
}
|
||||
@@ -225,7 +226,7 @@ class MemberEndpointTest extends ApiEndpointTestAbstract
|
||||
$user = User::factory()->create([
|
||||
'is_placeholder' => true,
|
||||
]);
|
||||
$member = Membership::factory()->forUser($user)->forOrganization($data->organization)->create();
|
||||
$member = Member::factory()->forUser($user)->forOrganization($data->organization)->create();
|
||||
Passport::actingAs($data->user);
|
||||
|
||||
// Act
|
||||
@@ -249,7 +250,7 @@ class MemberEndpointTest extends ApiEndpointTestAbstract
|
||||
$user = User::factory()->create([
|
||||
'is_placeholder' => true,
|
||||
]);
|
||||
$member = Membership::factory()->forUser($user)->forOrganization($otherOrganization)->create();
|
||||
$member = Member::factory()->forUser($user)->forOrganization($otherOrganization)->create();
|
||||
Passport::actingAs($data->user);
|
||||
|
||||
// Act
|
||||
|
||||
@@ -55,7 +55,7 @@ class ProjectEndpointTest extends ApiEndpointTestAbstract
|
||||
]);
|
||||
$privateProjects = Project::factory()->forOrganization($data->organization)->isPrivate()->createMany(2);
|
||||
$publicProjects = Project::factory()->forOrganization($data->organization)->isPublic()->createMany(2);
|
||||
$privateProjectsWithMembership = Project::factory()->forOrganization($data->organization)->addMember($data->user)->isPrivate()->createMany(2);
|
||||
$privateProjectsWithMembership = Project::factory()->forOrganization($data->organization)->addMember($data->member)->isPrivate()->createMany(2);
|
||||
Passport::actingAs($data->user);
|
||||
|
||||
// Act
|
||||
|
||||
@@ -4,6 +4,7 @@ declare(strict_types=1);
|
||||
|
||||
namespace Tests\Unit\Endpoint\Api\V1;
|
||||
|
||||
use App\Models\Member;
|
||||
use App\Models\Project;
|
||||
use App\Models\ProjectMember;
|
||||
use App\Models\User;
|
||||
@@ -81,13 +82,14 @@ class ProjectMemberEndpointTest extends ApiEndpointTestAbstract
|
||||
]);
|
||||
$project = Project::factory()->forOrganization($data->organization)->create();
|
||||
$projectMemberFake = ProjectMember::factory()->make();
|
||||
$user = User::factory()->attachToOrganization($data->organization)->create();
|
||||
$user = User::factory()->create();
|
||||
$member = Member::factory()->forOrganization($data->organization)->forUser($user)->create();
|
||||
Passport::actingAs($data->user);
|
||||
|
||||
// Act
|
||||
$response = $this->postJson(route('api.v1.project-members.store', [$data->organization->getKey(), $project->getKey()]), [
|
||||
'billable_rate' => $projectMemberFake->billable_rate,
|
||||
'user_id' => $user->getKey(),
|
||||
'member_id' => $member->getKey(),
|
||||
]);
|
||||
|
||||
// Assert
|
||||
@@ -105,13 +107,14 @@ class ProjectMemberEndpointTest extends ApiEndpointTestAbstract
|
||||
]);
|
||||
$project = Project::factory()->forOrganization($otherData->organization)->create();
|
||||
$projectMemberFake = ProjectMember::factory()->make();
|
||||
$user = User::factory()->attachToOrganization($data->organization)->create();
|
||||
$user = User::factory()->create();
|
||||
$member = Member::factory()->forOrganization($data->organization)->forUser($user)->create();
|
||||
Passport::actingAs($data->user);
|
||||
|
||||
// Act
|
||||
$response = $this->postJson(route('api.v1.project-members.store', [$data->organization->getKey(), $project->getKey()]), [
|
||||
'billable_rate' => $projectMemberFake->billable_rate,
|
||||
'user_id' => $user->getKey(),
|
||||
'member_id' => $member->getKey(),
|
||||
]);
|
||||
|
||||
// Assert
|
||||
@@ -129,17 +132,18 @@ class ProjectMemberEndpointTest extends ApiEndpointTestAbstract
|
||||
]);
|
||||
$project = Project::factory()->forOrganization($data->organization)->create();
|
||||
$projectMemberFake = ProjectMember::factory()->make();
|
||||
$user = User::factory()->attachToOrganization($otherData->organization)->create();
|
||||
$user = User::factory()->create();
|
||||
$member = Member::factory()->forOrganization($otherData->organization)->forUser($user)->create();
|
||||
Passport::actingAs($data->user);
|
||||
|
||||
// Act
|
||||
$response = $this->postJson(route('api.v1.project-members.store', [$data->organization->getKey(), $project->getKey()]), [
|
||||
'billable_rate' => $projectMemberFake->billable_rate,
|
||||
'user_id' => $user->getKey(),
|
||||
'member_id' => $member->getKey(),
|
||||
]);
|
||||
|
||||
// Assert
|
||||
$response->assertInvalid(['user_id']);
|
||||
$response->assertInvalid(['member_id']);
|
||||
}
|
||||
|
||||
public function test_store_endpoint_fails_if_user_is_a_placeholder(): void
|
||||
@@ -150,13 +154,14 @@ class ProjectMemberEndpointTest extends ApiEndpointTestAbstract
|
||||
]);
|
||||
$project = Project::factory()->forOrganization($data->organization)->create();
|
||||
$projectMemberFake = ProjectMember::factory()->make();
|
||||
$user = User::factory()->attachToOrganization($data->organization)->placeholder()->create();
|
||||
$user = User::factory()->placeholder()->create();
|
||||
$member = Member::factory()->forOrganization($data->organization)->forUser($user)->create();
|
||||
Passport::actingAs($data->user);
|
||||
|
||||
// Act
|
||||
$response = $this->postJson(route('api.v1.project-members.store', [$data->organization->getKey(), $project->getKey()]), [
|
||||
'billable_rate' => $projectMemberFake->billable_rate,
|
||||
'user_id' => $user->getKey(),
|
||||
'member_id' => $member->getKey(),
|
||||
]);
|
||||
|
||||
// Assert
|
||||
@@ -168,7 +173,7 @@ class ProjectMemberEndpointTest extends ApiEndpointTestAbstract
|
||||
]);
|
||||
$this->assertDatabaseMissing(ProjectMember::class, [
|
||||
'billable_rate' => $projectMemberFake->billable_rate,
|
||||
'user_id' => $user->getKey(),
|
||||
'member_id' => $member->getKey(),
|
||||
'project_id' => $project->getKey(),
|
||||
]);
|
||||
}
|
||||
@@ -181,14 +186,14 @@ class ProjectMemberEndpointTest extends ApiEndpointTestAbstract
|
||||
]);
|
||||
$project = Project::factory()->forOrganization($data->organization)->create();
|
||||
$projectMemberFake = ProjectMember::factory()->make();
|
||||
$user = User::factory()->attachToOrganization($data->organization)->create();
|
||||
ProjectMember::factory()->forProject($project)->forUser($user)->create();
|
||||
$member = Member::factory()->forOrganization($data->organization)->create();
|
||||
ProjectMember::factory()->forProject($project)->forMember($member)->create();
|
||||
Passport::actingAs($data->user);
|
||||
|
||||
// Act
|
||||
$response = $this->postJson(route('api.v1.project-members.store', [$data->organization->getKey(), $project->getKey()]), [
|
||||
'billable_rate' => $projectMemberFake->billable_rate,
|
||||
'user_id' => $user->getKey(),
|
||||
'member_id' => $member->getKey(),
|
||||
]);
|
||||
|
||||
// Assert
|
||||
@@ -200,7 +205,7 @@ class ProjectMemberEndpointTest extends ApiEndpointTestAbstract
|
||||
]);
|
||||
$this->assertDatabaseMissing(ProjectMember::class, [
|
||||
'billable_rate' => $projectMemberFake->billable_rate,
|
||||
'user_id' => $user->getKey(),
|
||||
'member_id' => $member->getKey(),
|
||||
'project_id' => $project->getKey(),
|
||||
]);
|
||||
}
|
||||
@@ -213,20 +218,21 @@ class ProjectMemberEndpointTest extends ApiEndpointTestAbstract
|
||||
]);
|
||||
$project = Project::factory()->forOrganization($data->organization)->create();
|
||||
$projectMemberFake = ProjectMember::factory()->make();
|
||||
$user = User::factory()->attachToOrganization($data->organization)->create();
|
||||
$user = User::factory()->create();
|
||||
$member = Member::factory()->forOrganization($data->organization)->forUser($user)->create();
|
||||
Passport::actingAs($data->user);
|
||||
|
||||
// Act
|
||||
$response = $this->postJson(route('api.v1.project-members.store', [$data->organization->getKey(), $project->getKey()]), [
|
||||
'billable_rate' => $projectMemberFake->billable_rate,
|
||||
'user_id' => $user->getKey(),
|
||||
'member_id' => $member->getKey(),
|
||||
]);
|
||||
|
||||
// Assert
|
||||
$response->assertStatus(201);
|
||||
$this->assertDatabaseHas(ProjectMember::class, [
|
||||
'billable_rate' => $projectMemberFake->billable_rate,
|
||||
'user_id' => $user->getKey(),
|
||||
'member_id' => $member->getKey(),
|
||||
'project_id' => $project->getKey(),
|
||||
]);
|
||||
}
|
||||
@@ -294,7 +300,7 @@ class ProjectMemberEndpointTest extends ApiEndpointTestAbstract
|
||||
$this->assertDatabaseHas(ProjectMember::class, [
|
||||
'id' => $projectMember->getKey(),
|
||||
'billable_rate' => $projectMemberFake->billable_rate,
|
||||
'user_id' => $projectMember->user_id,
|
||||
'member_id' => $projectMember->member_id,
|
||||
]);
|
||||
}
|
||||
|
||||
|
||||
@@ -207,7 +207,7 @@ class TagEndpointTest extends ApiEndpointTestAbstract
|
||||
'tags:delete',
|
||||
]);
|
||||
$tag = Tag::factory()->forOrganization($data->organization)->create();
|
||||
TimeEntry::factory()->forUser($data->user)->forOrganization($data->organization)->create([
|
||||
TimeEntry::factory()->forMember($data->member)->forOrganization($data->organization)->create([
|
||||
'tags' => [$tag->getKey()],
|
||||
]);
|
||||
Passport::actingAs($data->user);
|
||||
|
||||
@@ -86,7 +86,7 @@ class TaskEndpointTest extends ApiEndpointTestAbstract
|
||||
$projectPublic = Project::factory()->isPublic()->create();
|
||||
Task::factory()->forOrganization($data->organization)->forProject($projectPublic)->createMany(2);
|
||||
$projectAsMember = Project::factory()->isPrivate()->create();
|
||||
ProjectMember::factory()->forProject($projectAsMember)->forUser($data->user)->create();
|
||||
ProjectMember::factory()->forProject($projectAsMember)->forMember($data->member)->create();
|
||||
Task::factory()->forOrganization($data->organization)->forProject($projectAsMember)->createMany(2);
|
||||
Passport::actingAs($data->user);
|
||||
|
||||
@@ -177,7 +177,7 @@ class TaskEndpointTest extends ApiEndpointTestAbstract
|
||||
'tasks:view',
|
||||
]);
|
||||
$project = Project::factory()->forOrganization($data->organization)->create();
|
||||
ProjectMember::factory()->forProject($project)->forUser($data->user)->create();
|
||||
ProjectMember::factory()->forProject($project)->forMember($data->member)->create();
|
||||
Task::factory()->forOrganization($data->organization)->createMany(4);
|
||||
Task::factory()->forOrganization($data->organization)->forProject($project)->createMany(2);
|
||||
Passport::actingAs($data->user);
|
||||
@@ -311,7 +311,7 @@ class TaskEndpointTest extends ApiEndpointTestAbstract
|
||||
'tasks:delete',
|
||||
]);
|
||||
$task = Task::factory()->forOrganization($data->organization)->create();
|
||||
TimeEntry::factory()->forUser($data->user)->forTask($task)->forOrganization($data->organization)->create();
|
||||
TimeEntry::factory()->forMember($data->member)->forTask($task)->forOrganization($data->organization)->create();
|
||||
Passport::actingAs($data->user);
|
||||
|
||||
// Act
|
||||
|
||||
@@ -4,6 +4,8 @@ declare(strict_types=1);
|
||||
|
||||
namespace Tests\Unit\Endpoint\Api\V1;
|
||||
|
||||
use App\Enums\Role;
|
||||
use App\Models\Member;
|
||||
use App\Models\Project;
|
||||
use App\Models\TimeEntry;
|
||||
use App\Models\User;
|
||||
@@ -51,11 +53,14 @@ class TimeEntryEndpointTest extends ApiEndpointTestAbstract
|
||||
$data = $this->createUserWithPermission([
|
||||
'time-entries:view:own',
|
||||
]);
|
||||
$timeEntry = TimeEntry::factory()->forOrganization($data->organization)->forUser($data->user)->create();
|
||||
$timeEntry = TimeEntry::factory()->forOrganization($data->organization)->forMember($data->member)->create();
|
||||
Passport::actingAs($data->user);
|
||||
|
||||
// Act
|
||||
$response = $this->getJson(route('api.v1.time-entries.index', [$data->organization->getKey(), 'user_id' => $data->user->getKey()]));
|
||||
$response = $this->getJson(route('api.v1.time-entries.index', [
|
||||
$data->organization->getKey(),
|
||||
'member_id' => $data->member->getKey(),
|
||||
]));
|
||||
|
||||
// Assert
|
||||
$response->assertStatus(200);
|
||||
@@ -68,15 +73,20 @@ class TimeEntryEndpointTest extends ApiEndpointTestAbstract
|
||||
$data = $this->createUserWithPermission([
|
||||
'time-entries:view:all',
|
||||
]);
|
||||
$user = User::factory()->withPersonalOrganization()->create();
|
||||
$otherData = $this->createUserWithPermission([
|
||||
'time-entries:view:all',
|
||||
]);
|
||||
Passport::actingAs($data->user);
|
||||
|
||||
// Act
|
||||
$response = $this->getJson(route('api.v1.time-entries.index', [$data->organization->getKey(), 'user_id' => $user->getKey()]));
|
||||
$response = $this->getJson(route('api.v1.time-entries.index', [
|
||||
$data->organization->getKey(),
|
||||
'member_id' => $otherData->member->getKey(),
|
||||
]));
|
||||
|
||||
// Assert
|
||||
$response->assertStatus(422);
|
||||
$response->assertJsonValidationErrorFor('user_id');
|
||||
$response->assertJsonValidationErrorFor('member_id');
|
||||
}
|
||||
|
||||
public function test_index_endpoint_returns_time_entries_for_other_user_in_organization(): void
|
||||
@@ -86,10 +96,8 @@ class TimeEntryEndpointTest extends ApiEndpointTestAbstract
|
||||
'time-entries:view:all',
|
||||
]);
|
||||
$user = User::factory()->create();
|
||||
$data->organization->users()->attach($user, [
|
||||
'role' => 'employee',
|
||||
]);
|
||||
$timeEntry = TimeEntry::factory()->forOrganization($data->organization)->forUser($user)->create();
|
||||
$member = Member::factory()->forOrganization($data->organization)->forUser($user)->role(Role::Employee)->create();
|
||||
$timeEntry = TimeEntry::factory()->forOrganization($data->organization)->forMember($member)->create();
|
||||
Passport::actingAs($data->user);
|
||||
|
||||
// Act
|
||||
@@ -107,16 +115,14 @@ class TimeEntryEndpointTest extends ApiEndpointTestAbstract
|
||||
'time-entries:view:all',
|
||||
]);
|
||||
$user = User::factory()->create();
|
||||
$data->organization->users()->attach($user, [
|
||||
'role' => 'employee',
|
||||
]);
|
||||
$timeEntry1 = TimeEntry::factory()->forOrganization($data->organization)->forUser($data->user)->create([
|
||||
$member = Member::factory()->forOrganization($data->organization)->forUser($user)->role(Role::Employee)->create();
|
||||
$timeEntry1 = TimeEntry::factory()->forOrganization($data->organization)->forMember($data->member)->create([
|
||||
'start' => Carbon::now()->subDay(),
|
||||
]);
|
||||
$timeEntry2 = TimeEntry::factory()->forOrganization($data->organization)->forUser($user)->create([
|
||||
$timeEntry2 = TimeEntry::factory()->forOrganization($data->organization)->forMember($member)->create([
|
||||
'start' => Carbon::now()->subDays(2),
|
||||
]);
|
||||
$timeEntry3 = TimeEntry::factory()->forOrganization($data->organization)->forUser($data->user)->create([
|
||||
$timeEntry3 = TimeEntry::factory()->forOrganization($data->organization)->forMember($data->member)->create([
|
||||
'start' => Carbon::now()->subDays(3),
|
||||
]);
|
||||
Passport::actingAs($data->user);
|
||||
@@ -137,15 +143,15 @@ class TimeEntryEndpointTest extends ApiEndpointTestAbstract
|
||||
$data = $this->createUserWithPermission([
|
||||
'time-entries:view:own',
|
||||
]);
|
||||
$activeTimeEntry = TimeEntry::factory()->forOrganization($data->organization)->forUser($data->user)->active()->create();
|
||||
$nonActiveTimeEntries = TimeEntry::factory()->forOrganization($data->organization)->forUser($data->user)->createMany(3);
|
||||
$activeTimeEntry = TimeEntry::factory()->forOrganization($data->organization)->forMember($data->member)->active()->create();
|
||||
$nonActiveTimeEntries = TimeEntry::factory()->forOrganization($data->organization)->forMember($data->member)->createMany(3);
|
||||
Passport::actingAs($data->user);
|
||||
|
||||
// Act
|
||||
$response = $this->getJson(route('api.v1.time-entries.index', [
|
||||
$data->organization->getKey(),
|
||||
'active' => 'true',
|
||||
'user_id' => $data->user->getKey(),
|
||||
'member_id' => $data->member->getKey(),
|
||||
]));
|
||||
|
||||
// Assert
|
||||
@@ -160,15 +166,15 @@ class TimeEntryEndpointTest extends ApiEndpointTestAbstract
|
||||
$data = $this->createUserWithPermission([
|
||||
'time-entries:view:own',
|
||||
]);
|
||||
$activeTimeEntry = TimeEntry::factory()->forOrganization($data->organization)->forUser($data->user)->active()->createMany(3);
|
||||
$nonActiveTimeEntries = TimeEntry::factory()->forOrganization($data->organization)->forUser($data->user)->create();
|
||||
$activeTimeEntry = TimeEntry::factory()->forOrganization($data->organization)->forMember($data->member)->active()->createMany(3);
|
||||
$nonActiveTimeEntries = TimeEntry::factory()->forOrganization($data->organization)->forMember($data->member)->create();
|
||||
Passport::actingAs($data->user);
|
||||
|
||||
// Act
|
||||
$response = $this->getJson(route('api.v1.time-entries.index', [
|
||||
$data->organization->getKey(),
|
||||
'active' => 'false',
|
||||
'user_id' => $data->user->getKey(),
|
||||
'member_id' => $data->member->getKey(),
|
||||
]));
|
||||
|
||||
// Assert
|
||||
@@ -184,7 +190,7 @@ class TimeEntryEndpointTest extends ApiEndpointTestAbstract
|
||||
$data = $this->createUserWithPermission([
|
||||
'time-entries:view:own',
|
||||
]);
|
||||
$timeEntries = TimeEntry::factory()->forOrganization($data->organization)->forUser($data->user)->createMany(3);
|
||||
$timeEntries = TimeEntry::factory()->forOrganization($data->organization)->forMember($data->member)->createMany(3);
|
||||
Passport::actingAs($data->user);
|
||||
|
||||
// Act
|
||||
@@ -192,7 +198,7 @@ class TimeEntryEndpointTest extends ApiEndpointTestAbstract
|
||||
$data->organization->getKey(),
|
||||
'only_full_dates' => 'true',
|
||||
'limit' => 5,
|
||||
'user_id' => $data->user->getKey(),
|
||||
'member_id' => $data->member->getKey(),
|
||||
]));
|
||||
|
||||
// Assert
|
||||
@@ -206,10 +212,10 @@ class TimeEntryEndpointTest extends ApiEndpointTestAbstract
|
||||
$data = $this->createUserWithPermission([
|
||||
'time-entries:view:own',
|
||||
]);
|
||||
$timeEntriesDay1 = TimeEntry::factory()->forOrganization($data->organization)->forUser($data->user)
|
||||
$timeEntriesDay1 = TimeEntry::factory()->forOrganization($data->organization)->forMember($data->member)
|
||||
->startBetween(Carbon::now($data->user->timezone)->subDay()->startOfDay(), Carbon::now($data->user->timezone)->subDay()->endOfDay())
|
||||
->createMany(3);
|
||||
$timeEntriesDay2 = TimeEntry::factory()->forOrganization($data->organization)->forUser($data->user)
|
||||
$timeEntriesDay2 = TimeEntry::factory()->forOrganization($data->organization)->forMember($data->member)
|
||||
->startBetween(Carbon::now($data->user->timezone)->subDays(2)->startOfDay(), Carbon::now($data->user->timezone)->subDays(2)->endOfDay())
|
||||
->createMany(3);
|
||||
Passport::actingAs($data->user);
|
||||
@@ -219,7 +225,7 @@ class TimeEntryEndpointTest extends ApiEndpointTestAbstract
|
||||
$data->organization->getKey(),
|
||||
'only_full_dates' => 'true',
|
||||
'limit' => 5,
|
||||
'user_id' => $data->user->getKey(),
|
||||
'member_id' => $data->member->getKey(),
|
||||
]));
|
||||
|
||||
// Assert
|
||||
@@ -241,7 +247,7 @@ class TimeEntryEndpointTest extends ApiEndpointTestAbstract
|
||||
*/
|
||||
|
||||
// Note: This entry is yesterday in user timezone and yesterday in UTC
|
||||
$timeEntriesDay1InUserTimeZone = TimeEntry::factory()->forOrganization($data->organization)->forUser($data->user)
|
||||
$timeEntriesDay1InUserTimeZone = TimeEntry::factory()->forOrganization($data->organization)->forMember($data->member)
|
||||
->state([
|
||||
'start' => Carbon::now($data->user->timezone)->subDay()->startOfDay()->utc(),
|
||||
])
|
||||
@@ -249,7 +255,7 @@ class TimeEntryEndpointTest extends ApiEndpointTestAbstract
|
||||
//dump($timeEntriesDay1InUserTimeZone->first()->refresh()->start->toImmutable()->timezone('UTC')->toDateString());
|
||||
//dump($timeEntriesDay1InUserTimeZone->first()->refresh()->start->toImmutable()->timezone($data->user->timezone)->toDateString());
|
||||
// Note: This entry is yesterday in UTC timezone, but two days ago in user timezone
|
||||
$timeEntriesDay1InUTC = TimeEntry::factory()->forOrganization($data->organization)->forUser($data->user)
|
||||
$timeEntriesDay1InUTC = TimeEntry::factory()->forOrganization($data->organization)->forMember($data->member)
|
||||
->state([
|
||||
'start' => Carbon::now('UTC')->subDay()->startOfDay()->utc(),
|
||||
])
|
||||
@@ -257,7 +263,7 @@ class TimeEntryEndpointTest extends ApiEndpointTestAbstract
|
||||
//dump($timeEntriesDay1InUTC->first()->refresh()->start->toImmutable()->timezone('UTC')->toDateString());
|
||||
//dump($timeEntriesDay1InUTC->first()->refresh()->start->toImmutable()->timezone($data->user->timezone)->toDateString());
|
||||
// Note: This entry is two days ago in user timezone
|
||||
$timeEntriesDay2InUserTimeZone = TimeEntry::factory()->forOrganization($data->organization)->forUser($data->user)
|
||||
$timeEntriesDay2InUserTimeZone = TimeEntry::factory()->forOrganization($data->organization)->forMember($data->member)
|
||||
->state([
|
||||
'start' => Carbon::now($data->user->timezone)->subDays(2)->startOfDay()->utc(),
|
||||
])
|
||||
@@ -270,7 +276,7 @@ class TimeEntryEndpointTest extends ApiEndpointTestAbstract
|
||||
$data->organization->getKey(),
|
||||
'only_full_dates' => 'true',
|
||||
'limit' => 5,
|
||||
'user_id' => $data->user->getKey(),
|
||||
'member_id' => $data->member->getKey(),
|
||||
]));
|
||||
|
||||
// Assert
|
||||
@@ -284,7 +290,7 @@ class TimeEntryEndpointTest extends ApiEndpointTestAbstract
|
||||
$data = $this->createUserWithPermission([
|
||||
'time-entries:view:own',
|
||||
]);
|
||||
$timeEntriesDay1 = TimeEntry::factory()->forOrganization($data->organization)->forUser($data->user)
|
||||
$timeEntriesDay1 = TimeEntry::factory()->forOrganization($data->organization)->forMember($data->member)
|
||||
->startBetween(Carbon::now()->subDay()->startOfDay(), Carbon::now()->subDay()->endOfDay())
|
||||
->createMany(7);
|
||||
Passport::actingAs($data->user);
|
||||
@@ -294,7 +300,7 @@ class TimeEntryEndpointTest extends ApiEndpointTestAbstract
|
||||
$data->organization->getKey(),
|
||||
'only_full_dates' => 'true',
|
||||
'limit' => 5,
|
||||
'user_id' => $data->user->getKey(),
|
||||
'member_id' => $data->member->getKey(),
|
||||
]));
|
||||
|
||||
// Assert
|
||||
@@ -311,19 +317,19 @@ class TimeEntryEndpointTest extends ApiEndpointTestAbstract
|
||||
$data = $this->createUserWithPermission([
|
||||
'time-entries:view:own',
|
||||
]);
|
||||
$timeEntriesAfter = TimeEntry::factory()->forOrganization($data->organization)->forUser($data->user)
|
||||
$timeEntriesAfter = TimeEntry::factory()->forOrganization($data->organization)->forMember($data->member)
|
||||
->startBetween(
|
||||
Carbon::now()->timezone($data->user->timezone)->subDay()->startOfDay()->utc(),
|
||||
Carbon::now()->timezone($data->user->timezone)->utc()
|
||||
)
|
||||
->createMany(3);
|
||||
$timeEntriesBefore = TimeEntry::factory()->forOrganization($data->organization)->forUser($data->user)
|
||||
$timeEntriesBefore = TimeEntry::factory()->forOrganization($data->organization)->forMember($data->member)
|
||||
->startBetween(
|
||||
Carbon::now()->timezone($data->user->timezone)->subDays(2)->startOfDay()->utc(),
|
||||
Carbon::now()->timezone($data->user->timezone)->subDays(2)->endOfDay()->utc()
|
||||
)
|
||||
->createMany(3);
|
||||
$timeEntriesDirectlyBeforeLimit = TimeEntry::factory()->forOrganization($data->organization)->forUser($data->user)
|
||||
$timeEntriesDirectlyBeforeLimit = TimeEntry::factory()->forOrganization($data->organization)->forMember($data->member)
|
||||
->create([
|
||||
'start' => Carbon::now()->timezone($data->user->timezone)->subDays(2)->endOfDay()->utc(),
|
||||
]);
|
||||
@@ -333,7 +339,7 @@ class TimeEntryEndpointTest extends ApiEndpointTestAbstract
|
||||
$response = $this->getJson(route('api.v1.time-entries.index', [
|
||||
$data->organization->getKey(),
|
||||
'before' => Carbon::now()->timezone($data->user->timezone)->subDay()->startOfDay()->toIso8601ZuluString(),
|
||||
'user_id' => $data->user->getKey(),
|
||||
'member_id' => $data->member->getKey(),
|
||||
]));
|
||||
|
||||
// Assert
|
||||
@@ -354,13 +360,13 @@ class TimeEntryEndpointTest extends ApiEndpointTestAbstract
|
||||
$data = $this->createUserWithPermission([
|
||||
'time-entries:view:own',
|
||||
]);
|
||||
$timeEntriesAfter = TimeEntry::factory()->forOrganization($data->organization)->forUser($data->user)
|
||||
$timeEntriesAfter = TimeEntry::factory()->forOrganization($data->organization)->forMember($data->member)
|
||||
->startBetween(Carbon::now($data->user->timezone)->startOfDay()->utc(), Carbon::now($data->user->timezone)->utc())
|
||||
->createMany(3);
|
||||
$timeEntriesBefore = TimeEntry::factory()->forOrganization($data->organization)->forUser($data->user)
|
||||
$timeEntriesBefore = TimeEntry::factory()->forOrganization($data->organization)->forMember($data->member)
|
||||
->startBetween(Carbon::now($data->user->timezone)->subDay()->startOfDay()->utc(), Carbon::now($data->user->timezone)->subDay()->endOfDay()->utc())
|
||||
->createMany(3);
|
||||
$timeEntriesDirectlyAfterLimit = TimeEntry::factory()->forOrganization($data->organization)->forUser($data->user)
|
||||
$timeEntriesDirectlyAfterLimit = TimeEntry::factory()->forOrganization($data->organization)->forMember($data->member)
|
||||
->create([
|
||||
'start' => Carbon::now($data->user->timezone)->startOfDay()->utc(),
|
||||
]);
|
||||
@@ -370,7 +376,7 @@ class TimeEntryEndpointTest extends ApiEndpointTestAbstract
|
||||
$response = $this->getJson(route('api.v1.time-entries.index', [
|
||||
$data->organization->getKey(),
|
||||
'after' => Carbon::now($data->user->timezone)->subDay()->endOfDay()->toIso8601ZuluString(), // yesterday
|
||||
'user_id' => $data->user->getKey(),
|
||||
'member_id' => $data->member->getKey(),
|
||||
]));
|
||||
|
||||
// Assert
|
||||
@@ -405,10 +411,10 @@ class TimeEntryEndpointTest extends ApiEndpointTestAbstract
|
||||
$data = $this->createUserWithPermission([
|
||||
'time-entries:view:all',
|
||||
]);
|
||||
$timeEntries = TimeEntry::factory()->forOrganization($data->organization)->forUser($data->user)->createMany(3);
|
||||
$timeEntries = TimeEntry::factory()->forOrganization($data->organization)->forMember($data->member)->createMany(3);
|
||||
$project = Project::factory()->forOrganization($data->organization)->create();
|
||||
$timeEntries = TimeEntry::factory()->forOrganization($data->organization)->forUser($data->user)->forProject($project)->createMany(3);
|
||||
$timeEntries = TimeEntry::factory()->forOrganization($data->organization)->forUser($data->user)->state([
|
||||
$timeEntries = TimeEntry::factory()->forOrganization($data->organization)->forMember($data->member)->forProject($project)->createMany(3);
|
||||
$timeEntries = TimeEntry::factory()->forOrganization($data->organization)->forMember($data->member)->state([
|
||||
'start' => $timeEntries->get(0)->start,
|
||||
])->createMany(3);
|
||||
Passport::actingAs($data->user);
|
||||
@@ -416,8 +422,8 @@ class TimeEntryEndpointTest extends ApiEndpointTestAbstract
|
||||
// Act
|
||||
$response = $this->getJson(route('api.v1.time-entries.aggregate', [
|
||||
$data->organization->getKey(),
|
||||
'group_1' => 'day',
|
||||
'group_2' => 'project',
|
||||
'group' => 'day',
|
||||
'sub_group' => 'project',
|
||||
]));
|
||||
|
||||
// Assert
|
||||
@@ -430,10 +436,10 @@ class TimeEntryEndpointTest extends ApiEndpointTestAbstract
|
||||
$data = $this->createUserWithPermission([
|
||||
'time-entries:view:all',
|
||||
]);
|
||||
$timeEntries = TimeEntry::factory()->forOrganization($data->organization)->forUser($data->user)->createMany(3);
|
||||
$timeEntries = TimeEntry::factory()->forOrganization($data->organization)->forMember($data->member)->createMany(3);
|
||||
$project = Project::factory()->forOrganization($data->organization)->create();
|
||||
$timeEntries = TimeEntry::factory()->forOrganization($data->organization)->forUser($data->user)->forProject($project)->createMany(3);
|
||||
$timeEntries = TimeEntry::factory()->forOrganization($data->organization)->forUser($data->user)->state([
|
||||
$timeEntries = TimeEntry::factory()->forOrganization($data->organization)->forMember($data->member)->forProject($project)->createMany(3);
|
||||
$timeEntries = TimeEntry::factory()->forOrganization($data->organization)->forMember($data->member)->state([
|
||||
'start' => $timeEntries->get(0)->start,
|
||||
])->createMany(3);
|
||||
Passport::actingAs($data->user);
|
||||
@@ -441,7 +447,7 @@ class TimeEntryEndpointTest extends ApiEndpointTestAbstract
|
||||
// Act
|
||||
$response = $this->getJson(route('api.v1.time-entries.aggregate', [
|
||||
$data->organization->getKey(),
|
||||
'group_1' => 'week',
|
||||
'group' => 'week',
|
||||
]));
|
||||
|
||||
// Assert
|
||||
@@ -454,10 +460,10 @@ class TimeEntryEndpointTest extends ApiEndpointTestAbstract
|
||||
$data = $this->createUserWithPermission([
|
||||
'time-entries:view:all',
|
||||
]);
|
||||
$timeEntries = TimeEntry::factory()->forOrganization($data->organization)->forUser($data->user)->createMany(3);
|
||||
$timeEntries = TimeEntry::factory()->forOrganization($data->organization)->forMember($data->member)->createMany(3);
|
||||
$project = Project::factory()->forOrganization($data->organization)->create();
|
||||
$timeEntries = TimeEntry::factory()->forOrganization($data->organization)->forUser($data->user)->forProject($project)->createMany(3);
|
||||
$timeEntries = TimeEntry::factory()->forOrganization($data->organization)->forUser($data->user)->state([
|
||||
$timeEntries = TimeEntry::factory()->forOrganization($data->organization)->forMember($data->member)->forProject($project)->createMany(3);
|
||||
$timeEntries = TimeEntry::factory()->forOrganization($data->organization)->forMember($data->member)->state([
|
||||
'start' => $timeEntries->get(0)->start,
|
||||
])->createMany(3);
|
||||
Passport::actingAs($data->user);
|
||||
@@ -486,7 +492,7 @@ class TimeEntryEndpointTest extends ApiEndpointTestAbstract
|
||||
'start' => $timeEntryFake->start->toIso8601ZuluString(),
|
||||
'end' => $timeEntryFake->end->toIso8601ZuluString(),
|
||||
'tags' => $timeEntryFake->tags,
|
||||
'user_id' => $data->user->getKey(),
|
||||
'member_id' => $data->member->getKey(),
|
||||
'task_id' => $timeEntryFake->task_id,
|
||||
]);
|
||||
|
||||
@@ -500,7 +506,7 @@ class TimeEntryEndpointTest extends ApiEndpointTestAbstract
|
||||
$data = $this->createUserWithPermission([
|
||||
'time-entries:create:own',
|
||||
]);
|
||||
$activeTimeEntry = TimeEntry::factory()->forOrganization($data->organization)->forUser($data->user)->active()->create();
|
||||
$activeTimeEntry = TimeEntry::factory()->forOrganization($data->organization)->forMember($data->member)->active()->create();
|
||||
$timeEntryFake = TimeEntry::factory()->forOrganization($data->organization)->withTask($data->organization)->withTags($data->organization)->make();
|
||||
Passport::actingAs($data->user);
|
||||
|
||||
@@ -511,7 +517,7 @@ class TimeEntryEndpointTest extends ApiEndpointTestAbstract
|
||||
'start' => $timeEntryFake->start->toIso8601ZuluString(),
|
||||
'end' => null,
|
||||
'tags' => $timeEntryFake->tags,
|
||||
'user_id' => $data->user->getKey(),
|
||||
'member_id' => $data->member->getKey(),
|
||||
'project_id' => $timeEntryFake->project_id,
|
||||
'task_id' => $timeEntryFake->task_id,
|
||||
]);
|
||||
@@ -538,7 +544,7 @@ class TimeEntryEndpointTest extends ApiEndpointTestAbstract
|
||||
'start' => $timeEntryFake->start->toIso8601ZuluString(),
|
||||
'end' => $timeEntryFake->end->toIso8601ZuluString(),
|
||||
'tags' => $timeEntryFake->tags,
|
||||
'user_id' => $data->user->getKey(),
|
||||
'member_id' => $data->member->getKey(),
|
||||
'project_id' => $timeEntryFake->project_id,
|
||||
'task_id' => $timeEntryFake2->task_id,
|
||||
]);
|
||||
@@ -567,7 +573,7 @@ class TimeEntryEndpointTest extends ApiEndpointTestAbstract
|
||||
'start' => $timeEntryFake->start->toIso8601ZuluString(),
|
||||
'end' => $timeEntryFake->end->toIso8601ZuluString(),
|
||||
'tags' => $timeEntryFake->tags,
|
||||
'user_id' => $data->user->getKey(),
|
||||
'member_id' => $data->member->getKey(),
|
||||
'task_id' => $timeEntryFake2->task_id,
|
||||
]);
|
||||
|
||||
@@ -595,7 +601,7 @@ class TimeEntryEndpointTest extends ApiEndpointTestAbstract
|
||||
'start' => $timeEntryFake->start->toIso8601ZuluString(),
|
||||
'end' => $timeEntryFake->end->toIso8601ZuluString(),
|
||||
'tags' => $timeEntryFake->tags,
|
||||
'user_id' => $data->user->getKey(),
|
||||
'member_id' => $data->member->getKey(),
|
||||
'project_id' => $timeEntryFake->project_id,
|
||||
'task_id' => $timeEntryFake->task_id,
|
||||
]);
|
||||
@@ -604,7 +610,7 @@ class TimeEntryEndpointTest extends ApiEndpointTestAbstract
|
||||
$response->assertStatus(201);
|
||||
$this->assertDatabaseHas(TimeEntry::class, [
|
||||
'id' => $response->json('data.id'),
|
||||
'user_id' => $data->user->getKey(),
|
||||
'member_id' => $data->member->getKey(),
|
||||
'task_id' => $timeEntryFake->task_id,
|
||||
]);
|
||||
}
|
||||
@@ -622,14 +628,14 @@ class TimeEntryEndpointTest extends ApiEndpointTestAbstract
|
||||
$response = $this->postJson(route('api.v1.time-entries.store', [$data->organization->getKey()]), [
|
||||
'billable' => $timeEntryFake->billable,
|
||||
'start' => $timeEntryFake->start->toIso8601ZuluString(),
|
||||
'user_id' => $data->user->getKey(),
|
||||
'member_id' => $data->member->getKey(),
|
||||
]);
|
||||
|
||||
// Assert
|
||||
$response->assertStatus(201);
|
||||
$this->assertDatabaseHas(TimeEntry::class, [
|
||||
'id' => $response->json('data.id'),
|
||||
'user_id' => $data->user->getKey(),
|
||||
'member_id' => $data->member->getKey(),
|
||||
'task_id' => null,
|
||||
]);
|
||||
}
|
||||
@@ -641,9 +647,7 @@ class TimeEntryEndpointTest extends ApiEndpointTestAbstract
|
||||
'time-entries:create:own',
|
||||
]);
|
||||
$otherUser = User::factory()->create();
|
||||
$data->organization->users()->attach($otherUser, [
|
||||
'role' => 'employee',
|
||||
]);
|
||||
$otherMember = Member::factory()->forOrganization($data->organization)->forUser($otherUser)->role(Role::Employee)->create();
|
||||
$timeEntryFake = TimeEntry::factory()->forOrganization($data->organization)->make();
|
||||
Passport::actingAs($data->user);
|
||||
|
||||
@@ -654,7 +658,7 @@ class TimeEntryEndpointTest extends ApiEndpointTestAbstract
|
||||
'start' => $timeEntryFake->start->toIso8601ZuluString(),
|
||||
'end' => $timeEntryFake->end->toIso8601ZuluString(),
|
||||
'tags' => $timeEntryFake->tags,
|
||||
'user_id' => $otherUser->getKey(),
|
||||
'member_id' => $otherMember->getKey(),
|
||||
'project_id' => $timeEntryFake->project_id,
|
||||
'task_id' => $timeEntryFake->task_id,
|
||||
]);
|
||||
@@ -670,9 +674,7 @@ class TimeEntryEndpointTest extends ApiEndpointTestAbstract
|
||||
'time-entries:create:all',
|
||||
]);
|
||||
$otherUser = User::factory()->create();
|
||||
$data->organization->users()->attach($otherUser, [
|
||||
'role' => 'employee',
|
||||
]);
|
||||
$otherMember = Member::factory()->forOrganization($data->organization)->forUser($otherUser)->role(Role::Employee)->create();
|
||||
$timeEntryFake = TimeEntry::factory()->forOrganization($data->organization)->make();
|
||||
Passport::actingAs($data->user);
|
||||
|
||||
@@ -683,7 +685,7 @@ class TimeEntryEndpointTest extends ApiEndpointTestAbstract
|
||||
'start' => $timeEntryFake->start->toIso8601ZuluString(),
|
||||
'end' => $timeEntryFake->end->toIso8601ZuluString(),
|
||||
'tags' => $timeEntryFake->tags,
|
||||
'user_id' => $otherUser->getKey(),
|
||||
'member_id' => $otherMember->getKey(),
|
||||
'task_id' => $timeEntryFake->task_id,
|
||||
]);
|
||||
|
||||
@@ -692,6 +694,7 @@ class TimeEntryEndpointTest extends ApiEndpointTestAbstract
|
||||
$this->assertDatabaseHas(TimeEntry::class, [
|
||||
'id' => $response->json('data.id'),
|
||||
'user_id' => $otherUser->getKey(),
|
||||
'member_id' => $otherMember->getKey(),
|
||||
'task_id' => $timeEntryFake->task_id,
|
||||
]);
|
||||
}
|
||||
@@ -701,7 +704,7 @@ class TimeEntryEndpointTest extends ApiEndpointTestAbstract
|
||||
// Arrange
|
||||
$data = $this->createUserWithPermission([
|
||||
]);
|
||||
$timeEntry = TimeEntry::factory()->forOrganization($data->organization)->forUser($data->user)->create();
|
||||
$timeEntry = TimeEntry::factory()->forOrganization($data->organization)->forMember($data->member)->create();
|
||||
$timeEntryFake = TimeEntry::factory()->forOrganization($data->organization)->make();
|
||||
Passport::actingAs($data->user);
|
||||
|
||||
@@ -712,7 +715,7 @@ class TimeEntryEndpointTest extends ApiEndpointTestAbstract
|
||||
'start' => $timeEntryFake->start->toIso8601ZuluString(),
|
||||
'end' => $timeEntryFake->end->toIso8601ZuluString(),
|
||||
'tags' => $timeEntryFake->tags,
|
||||
'user_id' => $data->user->getKey(),
|
||||
'member_id' => $data->member->getKey(),
|
||||
'task_id' => $timeEntryFake->task_id,
|
||||
]);
|
||||
|
||||
@@ -729,7 +732,7 @@ class TimeEntryEndpointTest extends ApiEndpointTestAbstract
|
||||
$otherUser = $this->createUserWithPermission([
|
||||
'time-entries:update:own',
|
||||
]);
|
||||
$timeEntry = TimeEntry::factory()->forOrganization($otherUser->organization)->forUser($otherUser->user)->create();
|
||||
$timeEntry = TimeEntry::factory()->forOrganization($otherUser->organization)->forMember($otherUser->member)->create();
|
||||
$timeEntryFake = TimeEntry::factory()->forOrganization($data->organization)->make();
|
||||
Passport::actingAs($data->user);
|
||||
|
||||
@@ -739,7 +742,6 @@ class TimeEntryEndpointTest extends ApiEndpointTestAbstract
|
||||
'start' => $timeEntryFake->start->toIso8601ZuluString(),
|
||||
'end' => $timeEntryFake->end->toIso8601ZuluString(),
|
||||
'tags' => $timeEntryFake->tags,
|
||||
'user_id' => $data->user->getKey(),
|
||||
'task_id' => $timeEntryFake->task_id,
|
||||
]);
|
||||
|
||||
@@ -754,10 +756,8 @@ class TimeEntryEndpointTest extends ApiEndpointTestAbstract
|
||||
'time-entries:update:own',
|
||||
]);
|
||||
$user = User::factory()->create();
|
||||
$data->organization->users()->attach($user, [
|
||||
'role' => 'employee',
|
||||
]);
|
||||
$timeEntry = TimeEntry::factory()->forOrganization($data->organization)->forUser($user)->create();
|
||||
$member = Member::factory()->forOrganization($data->organization)->forUser($user)->role(Role::Employee)->create();
|
||||
$timeEntry = TimeEntry::factory()->forOrganization($data->organization)->forMember($member)->create();
|
||||
$timeEntryFake = TimeEntry::factory()->forOrganization($data->organization)->make();
|
||||
Passport::actingAs($data->user);
|
||||
|
||||
@@ -767,7 +767,6 @@ class TimeEntryEndpointTest extends ApiEndpointTestAbstract
|
||||
'start' => $timeEntryFake->start->toIso8601ZuluString(),
|
||||
'end' => $timeEntryFake->end->toIso8601ZuluString(),
|
||||
'tags' => $timeEntryFake->tags,
|
||||
'user_id' => $user->getKey(),
|
||||
'task_id' => $timeEntryFake->task_id,
|
||||
]);
|
||||
|
||||
@@ -781,7 +780,7 @@ class TimeEntryEndpointTest extends ApiEndpointTestAbstract
|
||||
$data = $this->createUserWithPermission([
|
||||
'time-entries:update:own',
|
||||
]);
|
||||
$timeEntry = TimeEntry::factory()->forOrganization($data->organization)->forUser($data->user)->create();
|
||||
$timeEntry = TimeEntry::factory()->forOrganization($data->organization)->forMember($data->member)->create();
|
||||
$timeEntryFake = TimeEntry::factory()->forOrganization($data->organization)->withTask($data->organization)->make();
|
||||
$timeEntryFake2 = TimeEntry::factory()->forOrganization($data->organization)->withTask($data->organization)->make();
|
||||
Passport::actingAs($data->user);
|
||||
@@ -793,7 +792,6 @@ class TimeEntryEndpointTest extends ApiEndpointTestAbstract
|
||||
'start' => $timeEntryFake->start->toIso8601ZuluString(),
|
||||
'end' => $timeEntryFake->end->toIso8601ZuluString(),
|
||||
'tags' => $timeEntryFake->tags,
|
||||
'user_id' => $data->user->getKey(),
|
||||
'project_id' => $timeEntryFake->project_id,
|
||||
'task_id' => $timeEntryFake2->task_id,
|
||||
]);
|
||||
@@ -811,7 +809,7 @@ class TimeEntryEndpointTest extends ApiEndpointTestAbstract
|
||||
$data = $this->createUserWithPermission([
|
||||
'time-entries:update:own',
|
||||
]);
|
||||
$timeEntry = TimeEntry::factory()->forOrganization($data->organization)->forUser($data->user)->create();
|
||||
$timeEntry = TimeEntry::factory()->forOrganization($data->organization)->forMember($data->member)->create();
|
||||
$timeEntryFake = TimeEntry::factory()->forOrganization($data->organization)->withTask($data->organization)->make();
|
||||
$timeEntryFake2 = TimeEntry::factory()->forOrganization($data->organization)->withTask($data->organization)->make();
|
||||
Passport::actingAs($data->user);
|
||||
@@ -823,7 +821,6 @@ class TimeEntryEndpointTest extends ApiEndpointTestAbstract
|
||||
'start' => $timeEntryFake->start->toIso8601ZuluString(),
|
||||
'end' => $timeEntryFake->end->toIso8601ZuluString(),
|
||||
'tags' => $timeEntryFake->tags,
|
||||
'user_id' => $data->user->getKey(),
|
||||
'task_id' => $timeEntryFake2->task_id,
|
||||
]);
|
||||
|
||||
@@ -841,7 +838,7 @@ class TimeEntryEndpointTest extends ApiEndpointTestAbstract
|
||||
$data = $this->createUserWithPermission([
|
||||
'time-entries:update:own',
|
||||
]);
|
||||
$timeEntry = TimeEntry::factory()->forOrganization($data->organization)->forUser($data->user)->create();
|
||||
$timeEntry = TimeEntry::factory()->forOrganization($data->organization)->forMember($data->member)->create();
|
||||
$timeEntryFake = TimeEntry::factory()->withTags($data->organization)->forOrganization($data->organization)->make();
|
||||
Passport::actingAs($data->user);
|
||||
|
||||
@@ -851,14 +848,14 @@ class TimeEntryEndpointTest extends ApiEndpointTestAbstract
|
||||
'start' => $timeEntryFake->start->toIso8601ZuluString(),
|
||||
'end' => $timeEntryFake->end->toIso8601ZuluString(),
|
||||
'tags' => $timeEntryFake->tags,
|
||||
'user_id' => $data->user->getKey(),
|
||||
'member_id' => $data->member->getKey(),
|
||||
]);
|
||||
|
||||
// Assert
|
||||
$response->assertStatus(200);
|
||||
$this->assertDatabaseHas(TimeEntry::class, [
|
||||
'id' => $timeEntry->getKey(),
|
||||
'user_id' => $data->user->getKey(),
|
||||
'member_id' => $data->member->getKey(),
|
||||
'task_id' => $timeEntryFake->task_id,
|
||||
]);
|
||||
}
|
||||
@@ -870,10 +867,8 @@ class TimeEntryEndpointTest extends ApiEndpointTestAbstract
|
||||
'time-entries:update:all',
|
||||
]);
|
||||
$user = User::factory()->create();
|
||||
$data->organization->users()->attach($user, [
|
||||
'role' => 'employee',
|
||||
]);
|
||||
$timeEntry = TimeEntry::factory()->forOrganization($data->organization)->forUser($user)->create();
|
||||
$member = Member::factory()->forOrganization($data->organization)->forUser($user)->role(Role::Employee)->create();
|
||||
$timeEntry = TimeEntry::factory()->forOrganization($data->organization)->forMember($member)->create();
|
||||
$timeEntryFake = TimeEntry::factory()->forOrganization($data->organization)->make();
|
||||
Passport::actingAs($data->user);
|
||||
|
||||
@@ -883,7 +878,7 @@ class TimeEntryEndpointTest extends ApiEndpointTestAbstract
|
||||
'start' => $timeEntryFake->start->toIso8601ZuluString(),
|
||||
'end' => $timeEntryFake->end->toIso8601ZuluString(),
|
||||
'tags' => $timeEntryFake->tags,
|
||||
'user_id' => $user->getKey(),
|
||||
'member_id' => $member->getKey(),
|
||||
'task_id' => $timeEntryFake->task_id,
|
||||
]);
|
||||
|
||||
@@ -891,7 +886,7 @@ class TimeEntryEndpointTest extends ApiEndpointTestAbstract
|
||||
$response->assertStatus(200);
|
||||
$this->assertDatabaseHas(TimeEntry::class, [
|
||||
'id' => $timeEntry->getKey(),
|
||||
'user_id' => $user->getKey(),
|
||||
'member_id' => $member->getKey(),
|
||||
'task_id' => $timeEntryFake->task_id,
|
||||
]);
|
||||
}
|
||||
@@ -905,7 +900,7 @@ class TimeEntryEndpointTest extends ApiEndpointTestAbstract
|
||||
$otherUser = $this->createUserWithPermission([
|
||||
'time-entries:delete:all',
|
||||
]);
|
||||
$timeEntry = TimeEntry::factory()->forOrganization($otherUser->organization)->forUser($otherUser->user)->create();
|
||||
$timeEntry = TimeEntry::factory()->forOrganization($otherUser->organization)->forMember($otherUser->member)->create();
|
||||
Passport::actingAs($data->user);
|
||||
|
||||
// Act
|
||||
@@ -935,7 +930,7 @@ class TimeEntryEndpointTest extends ApiEndpointTestAbstract
|
||||
// Arrange
|
||||
$data = $this->createUserWithPermission([
|
||||
]);
|
||||
$timeEntry = TimeEntry::factory()->forOrganization($data->organization)->forUser($data->user)->create();
|
||||
$timeEntry = TimeEntry::factory()->forOrganization($data->organization)->forMember($data->member)->create();
|
||||
Passport::actingAs($data->user);
|
||||
|
||||
// Act
|
||||
@@ -952,10 +947,8 @@ class TimeEntryEndpointTest extends ApiEndpointTestAbstract
|
||||
'time-entries:delete:own',
|
||||
]);
|
||||
$user = User::factory()->create();
|
||||
$data->organization->users()->attach($user, [
|
||||
'role' => 'employee',
|
||||
]);
|
||||
$timeEntry = TimeEntry::factory()->forOrganization($data->organization)->forUser($user)->create();
|
||||
$member = Member::factory()->forOrganization($data->organization)->forUser($user)->role(Role::Employee)->create();
|
||||
$timeEntry = TimeEntry::factory()->forOrganization($data->organization)->forMember($member)->create();
|
||||
Passport::actingAs($data->user);
|
||||
|
||||
// Act
|
||||
@@ -971,7 +964,7 @@ class TimeEntryEndpointTest extends ApiEndpointTestAbstract
|
||||
$data = $this->createUserWithPermission([
|
||||
'time-entries:delete:own',
|
||||
]);
|
||||
$timeEntry = TimeEntry::factory()->forOrganization($data->organization)->forUser($data->user)->create();
|
||||
$timeEntry = TimeEntry::factory()->forOrganization($data->organization)->forMember($data->member)->create();
|
||||
Passport::actingAs($data->user);
|
||||
|
||||
// Act
|
||||
@@ -992,10 +985,8 @@ class TimeEntryEndpointTest extends ApiEndpointTestAbstract
|
||||
'time-entries:delete:all',
|
||||
]);
|
||||
$user = User::factory()->create();
|
||||
$data->organization->users()->attach($user, [
|
||||
'role' => 'employee',
|
||||
]);
|
||||
$timeEntry = TimeEntry::factory()->forOrganization($data->organization)->forUser($user)->create();
|
||||
$member = Member::factory()->forOrganization($data->organization)->forUser($user)->role(Role::Employee)->create();
|
||||
$timeEntry = TimeEntry::factory()->forOrganization($data->organization)->forMember($member)->create();
|
||||
Passport::actingAs($data->user);
|
||||
|
||||
// Act
|
||||
|
||||
@@ -27,8 +27,8 @@ class UserTimeEntryEndpointTest extends ApiEndpointTestAbstract
|
||||
// Arrange
|
||||
$data = $this->createUserWithPermission([
|
||||
]);
|
||||
$activeTimeEntry = TimeEntry::factory()->forUser($data->user)->active()->create();
|
||||
$inactiveTimeEntry = TimeEntry::factory()->forUser($data->user)->create();
|
||||
$activeTimeEntry = TimeEntry::factory()->forMember($data->member)->active()->create();
|
||||
$inactiveTimeEntry = TimeEntry::factory()->forMember($data->member)->create();
|
||||
Passport::actingAs($data->user);
|
||||
|
||||
// Act
|
||||
@@ -43,7 +43,7 @@ class UserTimeEntryEndpointTest extends ApiEndpointTestAbstract
|
||||
// Arrange
|
||||
$data = $this->createUserWithPermission([
|
||||
]);
|
||||
$inactiveTimeEntry = TimeEntry::factory()->forUser($data->user)->create();
|
||||
$inactiveTimeEntry = TimeEntry::factory()->forMember($data->member)->create();
|
||||
Passport::actingAs($data->user);
|
||||
|
||||
// Act
|
||||
|
||||
@@ -4,10 +4,10 @@ declare(strict_types=1);
|
||||
|
||||
namespace Tests\Unit\Model;
|
||||
|
||||
use App\Models\Member;
|
||||
use App\Models\Organization;
|
||||
use App\Models\Project;
|
||||
use App\Models\ProjectMember;
|
||||
use App\Models\User;
|
||||
|
||||
class ProjectMemberModelTest extends ModelTestAbstract
|
||||
{
|
||||
@@ -15,8 +15,8 @@ class ProjectMemberModelTest extends ModelTestAbstract
|
||||
{
|
||||
// Arrange
|
||||
$project = Project::factory()->create();
|
||||
$user = User::factory()->create();
|
||||
$projectMember = ProjectMember::factory()->forProject($project)->forUser($user)->create();
|
||||
$member = Member::factory()->create();
|
||||
$projectMember = ProjectMember::factory()->forProject($project)->forMember($member)->create();
|
||||
|
||||
// Act
|
||||
$projectMember->refresh();
|
||||
@@ -27,19 +27,19 @@ class ProjectMemberModelTest extends ModelTestAbstract
|
||||
$this->assertTrue($projectRel->is($project));
|
||||
}
|
||||
|
||||
public function test_it_belongs_to_a_user(): void
|
||||
public function test_it_belongs_to_a_member(): void
|
||||
{
|
||||
// Arrange
|
||||
$user = User::factory()->create();
|
||||
$projectMember = ProjectMember::factory()->forUser($user)->create();
|
||||
$member = Member::factory()->create();
|
||||
$projectMember = ProjectMember::factory()->forMember($member)->create();
|
||||
|
||||
// Act
|
||||
$projectMember->refresh();
|
||||
$userRel = $projectMember->user;
|
||||
$memberRel = $projectMember->member;
|
||||
|
||||
// Assert
|
||||
$this->assertNotNull($userRel);
|
||||
$this->assertTrue($userRel->is($user));
|
||||
$this->assertNotNull($memberRel);
|
||||
$this->assertTrue($memberRel->is($member));
|
||||
}
|
||||
|
||||
public function test_scope_where_belongs_to_organization_filters_project_members_to_only_retrieve_project_members_that_belong_to_a_project_of_the_organization(): void
|
||||
|
||||
@@ -5,11 +5,11 @@ declare(strict_types=1);
|
||||
namespace Tests\Unit\Model;
|
||||
|
||||
use App\Models\Client;
|
||||
use App\Models\Member;
|
||||
use App\Models\Organization;
|
||||
use App\Models\Project;
|
||||
use App\Models\ProjectMember;
|
||||
use App\Models\Task;
|
||||
use App\Models\User;
|
||||
|
||||
class ProjectModelTest extends ModelTestAbstract
|
||||
{
|
||||
@@ -91,14 +91,14 @@ class ProjectModelTest extends ModelTestAbstract
|
||||
public function test_scope_visible_by_user_filters_so_that_only_public_projects_or_projects_where_the_user_is_member_are_shown(): void
|
||||
{
|
||||
// Arrange
|
||||
$user = User::factory()->create();
|
||||
$member = Member::factory()->create();
|
||||
$projectPrivate = Project::factory()->isPrivate()->create();
|
||||
$projectPublic = Project::factory()->isPublic()->create();
|
||||
$projectPrivateButMember = Project::factory()->isPrivate()->create();
|
||||
ProjectMember::factory()->forProject($projectPrivateButMember)->forUser($user)->create();
|
||||
ProjectMember::factory()->forProject($projectPrivateButMember)->forMember($member)->create();
|
||||
|
||||
// Act
|
||||
$projectsVisible = Project::query()->visibleByUser($user)->get();
|
||||
$projectsVisible = Project::query()->visibleByUser($member->user)->get();
|
||||
$allProjects = Project::query()->get();
|
||||
|
||||
// Assert
|
||||
|
||||
@@ -4,12 +4,12 @@ declare(strict_types=1);
|
||||
|
||||
namespace Tests\Unit\Model;
|
||||
|
||||
use App\Models\Member;
|
||||
use App\Models\Organization;
|
||||
use App\Models\Project;
|
||||
use App\Models\ProjectMember;
|
||||
use App\Models\Task;
|
||||
use App\Models\TimeEntry;
|
||||
use App\Models\User;
|
||||
|
||||
class TaskModelTest extends ModelTestAbstract
|
||||
{
|
||||
@@ -62,17 +62,17 @@ class TaskModelTest extends ModelTestAbstract
|
||||
public function test_scope_visible_by_user_filters_so_that_only_tasks_of_public_projects_or_projects_where_the_user_is_member_are_shown(): void
|
||||
{
|
||||
// Arrange
|
||||
$user = User::factory()->create();
|
||||
$member = Member::factory()->create();
|
||||
$projectPrivate = Project::factory()->isPrivate()->create();
|
||||
$projectPublic = Project::factory()->isPublic()->create();
|
||||
$projectPrivateButMember = Project::factory()->isPrivate()->create();
|
||||
ProjectMember::factory()->forProject($projectPrivateButMember)->forUser($user)->create();
|
||||
ProjectMember::factory()->forProject($projectPrivateButMember)->forMember($member)->create();
|
||||
$taskPrivate = Task::factory()->forProject($projectPrivate)->create();
|
||||
$taskPublic = Task::factory()->forProject($projectPublic)->create();
|
||||
$taskPrivateButMember = Task::factory()->forProject($projectPrivateButMember)->create();
|
||||
|
||||
// Act
|
||||
$tasksVisible = Task::query()->visibleByUser($user)->get();
|
||||
$tasksVisible = Task::query()->visibleByUser($member->user)->get();
|
||||
$allTasks = Task::query()->get();
|
||||
|
||||
// Assert
|
||||
|
||||
@@ -4,6 +4,8 @@ declare(strict_types=1);
|
||||
|
||||
namespace Tests\Unit\Model;
|
||||
|
||||
use App\Enums\Role;
|
||||
use App\Models\Member;
|
||||
use App\Models\Organization;
|
||||
use App\Models\ProjectMember;
|
||||
use App\Models\TimeEntry;
|
||||
@@ -57,12 +59,12 @@ class UserModelTest extends ModelTestAbstract
|
||||
$organization = Organization::factory()->withOwner($owner)->create();
|
||||
$user = User::factory()->create();
|
||||
$user->organizations()->attach($organization, [
|
||||
'role' => 'employee',
|
||||
'role' => Role::Employee->value,
|
||||
]);
|
||||
$otherOrganization = Organization::factory()->create();
|
||||
$otherUser = User::factory()->create();
|
||||
$otherUser->organizations()->attach($otherOrganization, [
|
||||
'role' => 'employee',
|
||||
'role' => Role::Employee->value,
|
||||
]);
|
||||
|
||||
// Act
|
||||
@@ -98,8 +100,10 @@ class UserModelTest extends ModelTestAbstract
|
||||
// Arrange
|
||||
$user = User::factory()->create();
|
||||
$otherUser = User::factory()->create();
|
||||
$projectMembers = ProjectMember::factory()->forUser($user)->createMany(3);
|
||||
$otherProjectMembers = ProjectMember::factory()->forUser($otherUser)->createMany(3);
|
||||
$member = Member::factory()->forUser($user)->create();
|
||||
$otherMember = Member::factory()->forUser($otherUser)->create();
|
||||
$projectMembers = ProjectMember::factory()->forMember($member)->createMany(3);
|
||||
$otherProjectMembers = ProjectMember::factory()->forMember($otherMember)->createMany(3);
|
||||
|
||||
// Act
|
||||
$user->refresh();
|
||||
|
||||
@@ -4,6 +4,7 @@ declare(strict_types=1);
|
||||
|
||||
namespace Tests\Unit\Service;
|
||||
|
||||
use App\Models\Member;
|
||||
use App\Models\Organization;
|
||||
use App\Models\Project;
|
||||
use App\Models\ProjectMember;
|
||||
@@ -31,16 +32,17 @@ class BillableRateServiceTest extends TestCase
|
||||
$organization = Organization::factory()->create([
|
||||
'billable_rate' => 1001,
|
||||
]);
|
||||
$user = User::factory()->attachToOrganization($organization, [
|
||||
$user = User::factory()->create();
|
||||
$member = Member::factory()->forOrganization($organization)->forUser($user)->create([
|
||||
'billable_rate' => 2002,
|
||||
])->create();
|
||||
]);
|
||||
$project = Project::factory()->forOrganization($organization)->create([
|
||||
'billable_rate' => 3003,
|
||||
]);
|
||||
$projectMember = ProjectMember::factory()->forUser($user)->forProject($project)->create([
|
||||
$projectMember = ProjectMember::factory()->forMember($member)->forProject($project)->create([
|
||||
'billable_rate' => 4004,
|
||||
]);
|
||||
$timeEntry = TimeEntry::factory()->forProject($project)->forUser($user)->forOrganization($organization)->create([
|
||||
$timeEntry = TimeEntry::factory()->forProject($project)->forMember($member)->forOrganization($organization)->create([
|
||||
'billable' => false,
|
||||
]);
|
||||
|
||||
@@ -57,16 +59,17 @@ class BillableRateServiceTest extends TestCase
|
||||
$organization = Organization::factory()->create([
|
||||
'billable_rate' => 1001,
|
||||
]);
|
||||
$user = User::factory()->attachToOrganization($organization, [
|
||||
$user = User::factory()->create();
|
||||
$member = Member::factory()->forOrganization($organization)->forUser($user)->create([
|
||||
'billable_rate' => 2002,
|
||||
])->create();
|
||||
]);
|
||||
$project = Project::factory()->forOrganization($organization)->create([
|
||||
'billable_rate' => 3003,
|
||||
]);
|
||||
$projectMember = ProjectMember::factory()->forUser($user)->forProject($project)->create([
|
||||
$projectMember = ProjectMember::factory()->forMember($member)->forProject($project)->create([
|
||||
'billable_rate' => 4004,
|
||||
]);
|
||||
$timeEntry = TimeEntry::factory()->forProject($project)->forUser($user)->forOrganization($organization)->create([
|
||||
$timeEntry = TimeEntry::factory()->forProject($project)->forMember($member)->forOrganization($organization)->create([
|
||||
'billable' => true,
|
||||
]);
|
||||
|
||||
@@ -83,16 +86,17 @@ class BillableRateServiceTest extends TestCase
|
||||
$organization = Organization::factory()->create([
|
||||
'billable_rate' => 1001,
|
||||
]);
|
||||
$user = User::factory()->attachToOrganization($organization, [
|
||||
$user = User::factory()->create();
|
||||
$member = Member::factory()->forOrganization($organization)->forUser($user)->create([
|
||||
'billable_rate' => 2002,
|
||||
])->create();
|
||||
]);
|
||||
$project = Project::factory()->forOrganization($organization)->create([
|
||||
'billable_rate' => 3003,
|
||||
]);
|
||||
$projectMember = ProjectMember::factory()->forUser($user)->forProject($project)->create([
|
||||
$projectMember = ProjectMember::factory()->forMember($member)->forProject($project)->create([
|
||||
'billable_rate' => null,
|
||||
]);
|
||||
$timeEntry = TimeEntry::factory()->forProject($project)->forUser($user)->forOrganization($organization)->create([
|
||||
$timeEntry = TimeEntry::factory()->forProject($project)->forMember($member)->forOrganization($organization)->create([
|
||||
'billable' => true,
|
||||
]);
|
||||
|
||||
@@ -109,13 +113,14 @@ class BillableRateServiceTest extends TestCase
|
||||
$organization = Organization::factory()->create([
|
||||
'billable_rate' => 1001,
|
||||
]);
|
||||
$user = User::factory()->attachToOrganization($organization, [
|
||||
$user = User::factory()->create();
|
||||
$member = Member::factory()->forOrganization($organization)->forUser($user)->create([
|
||||
'billable_rate' => 2002,
|
||||
])->create();
|
||||
]);
|
||||
$project = Project::factory()->forOrganization($organization)->create([
|
||||
'billable_rate' => 3003,
|
||||
]);
|
||||
$timeEntry = TimeEntry::factory()->forProject($project)->forUser($user)->forOrganization($organization)->create([
|
||||
$timeEntry = TimeEntry::factory()->forProject($project)->forMember($member)->forOrganization($organization)->create([
|
||||
'billable' => true,
|
||||
]);
|
||||
|
||||
@@ -132,16 +137,17 @@ class BillableRateServiceTest extends TestCase
|
||||
$organization = Organization::factory()->create([
|
||||
'billable_rate' => 1001,
|
||||
]);
|
||||
$user = User::factory()->attachToOrganization($organization, [
|
||||
$user = User::factory()->create();
|
||||
$member = Member::factory()->forOrganization($organization)->forUser($user)->create([
|
||||
'billable_rate' => 2002,
|
||||
])->create();
|
||||
]);
|
||||
$project = Project::factory()->forOrganization($organization)->create([
|
||||
'billable_rate' => null,
|
||||
]);
|
||||
$projectMember = ProjectMember::factory()->forUser($user)->forProject($project)->create([
|
||||
$projectMember = ProjectMember::factory()->forMember($member)->forProject($project)->create([
|
||||
'billable_rate' => null,
|
||||
]);
|
||||
$timeEntry = TimeEntry::factory()->forProject($project)->forUser($user)->forOrganization($organization)->create([
|
||||
$timeEntry = TimeEntry::factory()->forProject($project)->forMember($member)->forOrganization($organization)->create([
|
||||
'billable' => true,
|
||||
]);
|
||||
|
||||
@@ -158,10 +164,11 @@ class BillableRateServiceTest extends TestCase
|
||||
$organization = Organization::factory()->create([
|
||||
'billable_rate' => 1001,
|
||||
]);
|
||||
$user = User::factory()->attachToOrganization($organization, [
|
||||
$user = User::factory()->create();
|
||||
$member = Member::factory()->forOrganization($organization)->forUser($user)->create([
|
||||
'billable_rate' => 2002,
|
||||
])->create();
|
||||
$timeEntry = TimeEntry::factory()->forUser($user)->forOrganization($organization)->create([
|
||||
]);
|
||||
$timeEntry = TimeEntry::factory()->forMember($member)->forOrganization($organization)->create([
|
||||
'billable' => true,
|
||||
]);
|
||||
|
||||
@@ -178,16 +185,17 @@ class BillableRateServiceTest extends TestCase
|
||||
$organization = Organization::factory()->create([
|
||||
'billable_rate' => 1001,
|
||||
]);
|
||||
$user = User::factory()->attachToOrganization($organization, [
|
||||
$user = User::factory()->create();
|
||||
$member = Member::factory()->forOrganization($organization)->forUser($user)->create([
|
||||
'billable_rate' => null,
|
||||
])->create();
|
||||
]);
|
||||
$project = Project::factory()->forOrganization($organization)->create([
|
||||
'billable_rate' => null,
|
||||
]);
|
||||
$projectMember = ProjectMember::factory()->forUser($user)->forProject($project)->create([
|
||||
$projectMember = ProjectMember::factory()->forMember($member)->forProject($project)->create([
|
||||
'billable_rate' => null,
|
||||
]);
|
||||
$timeEntry = TimeEntry::factory()->forProject($project)->forUser($user)->forOrganization($organization)->create([
|
||||
$timeEntry = TimeEntry::factory()->forProject($project)->forMember($member)->forOrganization($organization)->create([
|
||||
'billable' => true,
|
||||
]);
|
||||
|
||||
@@ -205,7 +213,10 @@ class BillableRateServiceTest extends TestCase
|
||||
'billable_rate' => 1001,
|
||||
]);
|
||||
$user = User::factory()->create();
|
||||
$timeEntry = TimeEntry::factory()->forUser($user)->forOrganization($organization)->create([
|
||||
$member = Member::factory()->forOrganization($organization)->forUser($user)->create([
|
||||
'billable_rate' => null,
|
||||
]);
|
||||
$timeEntry = TimeEntry::factory()->forMember($member)->forOrganization($organization)->create([
|
||||
'billable' => true,
|
||||
]);
|
||||
|
||||
@@ -222,16 +233,17 @@ class BillableRateServiceTest extends TestCase
|
||||
$organization = Organization::factory()->create([
|
||||
'billable_rate' => null,
|
||||
]);
|
||||
$user = User::factory()->attachToOrganization($organization, [
|
||||
$user = User::factory()->create();
|
||||
$member = Member::factory()->forOrganization($organization)->forUser($user)->create([
|
||||
'billable_rate' => null,
|
||||
])->create();
|
||||
]);
|
||||
$project = Project::factory()->forOrganization($organization)->create([
|
||||
'billable_rate' => null,
|
||||
]);
|
||||
$projectMember = ProjectMember::factory()->forUser($user)->forProject($project)->create([
|
||||
$projectMember = ProjectMember::factory()->forMember($member)->forProject($project)->create([
|
||||
'billable_rate' => null,
|
||||
]);
|
||||
$timeEntry = TimeEntry::factory()->forProject($project)->forUser($user)->forOrganization($organization)->create([
|
||||
$timeEntry = TimeEntry::factory()->forProject($project)->forMember($member)->forOrganization($organization)->create([
|
||||
'billable' => true,
|
||||
]);
|
||||
|
||||
|
||||
@@ -6,6 +6,7 @@ namespace Tests\Unit\Service;
|
||||
|
||||
use App\Enums\Role;
|
||||
use App\Enums\Weekday;
|
||||
use App\Models\Member;
|
||||
use App\Models\Organization;
|
||||
use App\Models\Project;
|
||||
use App\Models\Task;
|
||||
@@ -37,13 +38,13 @@ class DashboardServiceTest extends TestCase
|
||||
$user = User::factory()->create([
|
||||
'timezone' => 'Europe/Vienna',
|
||||
]);
|
||||
$user->organizations()->attach($organization);
|
||||
$timeEntry1 = TimeEntry::factory()->forUser($user)->forOrganization($organization)->create([
|
||||
$member = Member::factory()->forUser($user)->forOrganization($organization)->create();
|
||||
$timeEntry1 = TimeEntry::factory()->forMember($member)->forOrganization($organization)->create([
|
||||
// Note: The start time shifts in timezone Europe/Vienna to the next day
|
||||
'start' => Carbon::create(2023, 12, 30, 23, 0, 0, 'UTC'),
|
||||
'end' => Carbon::create(2023, 12, 30, 23, 0, 40, 'UTC'),
|
||||
]);
|
||||
$timeEntry2 = TimeEntry::factory()->forUser($user)->forOrganization($organization)->create([
|
||||
$timeEntry2 = TimeEntry::factory()->forMember($member)->forOrganization($organization)->create([
|
||||
// Note: The start time NOT shifts in timezone Europe/Vienna to the next day
|
||||
'start' => Carbon::create(2023, 12, 30, 22, 59, 59, 'UTC'),
|
||||
'end' => Carbon::create(2023, 12, 30, 23, 0, 39, 'UTC'),
|
||||
@@ -87,15 +88,15 @@ class DashboardServiceTest extends TestCase
|
||||
'timezone' => 'Europe/Vienna',
|
||||
'week_start' => Weekday::Sunday,
|
||||
]);
|
||||
$user->organizations()->attach($organization);
|
||||
$member = Member::factory()->forUser($user)->forOrganization($organization)->create();
|
||||
// Note: This is a Sunday
|
||||
$timeEntry1 = TimeEntry::factory()->forUser($user)->forOrganization($organization)->create([
|
||||
$timeEntry1 = TimeEntry::factory()->forMember($member)->forOrganization($organization)->create([
|
||||
// Note: The start time shifts in timezone Europe/Vienna to the next day
|
||||
'start' => Carbon::create(2023, 12, 30, 23, 0, 0, 'UTC'),
|
||||
'end' => Carbon::create(2023, 12, 30, 23, 0, 40, 'UTC'),
|
||||
]);
|
||||
// Note: This is a Saturday
|
||||
$timeEntry2 = TimeEntry::factory()->forUser($user)->forOrganization($organization)->create([
|
||||
$timeEntry2 = TimeEntry::factory()->forMember($member)->forOrganization($organization)->create([
|
||||
// Note: The start time NOT shifts in timezone Europe/Vienna to the next day
|
||||
'start' => Carbon::create(2023, 12, 30, 22, 59, 59, 'UTC'),
|
||||
'end' => Carbon::create(2023, 12, 30, 23, 0, 39, 'UTC'),
|
||||
@@ -147,15 +148,15 @@ class DashboardServiceTest extends TestCase
|
||||
'timezone' => 'Europe/Vienna',
|
||||
'week_start' => Weekday::Sunday,
|
||||
]);
|
||||
$user->organizations()->attach($organization);
|
||||
$member = Member::factory()->forUser($user)->forOrganization($organization)->create();
|
||||
// Note: This is a Sunday
|
||||
$timeEntry1 = TimeEntry::factory()->forUser($user)->forOrganization($organization)->create([
|
||||
$timeEntry1 = TimeEntry::factory()->forMember($member)->forOrganization($organization)->create([
|
||||
// Note: The start time shifts in timezone Europe/Vienna to the next day
|
||||
'start' => Carbon::create(2023, 12, 30, 23, 0, 0, 'UTC'),
|
||||
'end' => Carbon::create(2023, 12, 30, 23, 0, 40, 'UTC'),
|
||||
]);
|
||||
// Note: This is a Saturday
|
||||
$timeEntry2 = TimeEntry::factory()->forUser($user)->forOrganization($organization)->create([
|
||||
$timeEntry2 = TimeEntry::factory()->forMember($member)->forOrganization($organization)->create([
|
||||
// Note: The start time NOT shifts in timezone Europe/Vienna to the next day
|
||||
'start' => Carbon::create(2023, 12, 30, 22, 59, 59, 'UTC'),
|
||||
'end' => Carbon::create(2023, 12, 30, 23, 0, 39, 'UTC'),
|
||||
@@ -178,23 +179,23 @@ class DashboardServiceTest extends TestCase
|
||||
'timezone' => 'Europe/Vienna',
|
||||
'week_start' => Weekday::Sunday,
|
||||
]);
|
||||
$user->organizations()->attach($organization);
|
||||
$member = Member::factory()->forUser($user)->forOrganization($organization)->create();
|
||||
// Note: This is a Sunday
|
||||
$timeEntry1 = TimeEntry::factory()->forUser($user)->forOrganization($organization)->create([
|
||||
$timeEntry1 = TimeEntry::factory()->forMember($member)->forOrganization($organization)->create([
|
||||
// Note: The start time shifts in timezone Europe/Vienna to the next day
|
||||
'billable' => true,
|
||||
'start' => Carbon::create(2023, 12, 30, 23, 0, 0, 'UTC'),
|
||||
'end' => Carbon::create(2023, 12, 30, 23, 0, 40, 'UTC'),
|
||||
]);
|
||||
// Note: This is a Sunday (non-billable)
|
||||
$timeEntry1 = TimeEntry::factory()->forUser($user)->forOrganization($organization)->create([
|
||||
$timeEntry1 = TimeEntry::factory()->forMember($member)->forOrganization($organization)->create([
|
||||
// Note: The start time shifts in timezone Europe/Vienna to the next day
|
||||
'billable' => false,
|
||||
'start' => Carbon::create(2023, 12, 30, 23, 0, 40, 'UTC'),
|
||||
'end' => Carbon::create(2023, 12, 30, 23, 0, 59, 'UTC'),
|
||||
]);
|
||||
// Note: This is a Saturday
|
||||
$timeEntry2 = TimeEntry::factory()->forUser($user)->forOrganization($organization)->create([
|
||||
$timeEntry2 = TimeEntry::factory()->forMember($member)->forOrganization($organization)->create([
|
||||
// Note: The start time NOT shifts in timezone Europe/Vienna to the next day
|
||||
'billable' => true,
|
||||
'start' => Carbon::create(2023, 12, 30, 22, 59, 59, 'UTC'),
|
||||
@@ -221,9 +222,9 @@ class DashboardServiceTest extends TestCase
|
||||
'timezone' => 'Europe/Vienna',
|
||||
'week_start' => Weekday::Sunday,
|
||||
]);
|
||||
$user->organizations()->attach($organization);
|
||||
$member = Member::factory()->forUser($user)->forOrganization($organization)->create();
|
||||
// Note: This is a Sunday
|
||||
$timeEntry1 = TimeEntry::factory()->forUser($user)->forOrganization($organization)->create([
|
||||
$timeEntry1 = TimeEntry::factory()->forMember($member)->forOrganization($organization)->create([
|
||||
// Note: The start time shifts in timezone Europe/Vienna to the next day
|
||||
'billable' => true,
|
||||
'billable_rate' => 50 * 100,
|
||||
@@ -231,14 +232,14 @@ class DashboardServiceTest extends TestCase
|
||||
'end' => Carbon::create(2023, 12, 31, 0, 0, 0, 'UTC'),
|
||||
]);
|
||||
// Note: This is a Sunday (non-billable)
|
||||
$timeEntry2 = TimeEntry::factory()->forUser($user)->forOrganization($organization)->create([
|
||||
$timeEntry2 = TimeEntry::factory()->forMember($member)->forOrganization($organization)->create([
|
||||
// Note: The start time shifts in timezone Europe/Vienna to the next day
|
||||
'billable' => false,
|
||||
'start' => Carbon::create(2023, 12, 30, 23, 0, 40, 'UTC'),
|
||||
'end' => Carbon::create(2023, 12, 30, 23, 0, 59, 'UTC'),
|
||||
]);
|
||||
// Note: This is a Saturday
|
||||
$timeEntry3 = TimeEntry::factory()->forUser($user)->forOrganization($organization)->create([
|
||||
$timeEntry3 = TimeEntry::factory()->forMember($member)->forOrganization($organization)->create([
|
||||
// Note: The start time NOT shifts in timezone Europe/Vienna to the next day
|
||||
'billable' => true,
|
||||
'billable_rate' => 100 * 100,
|
||||
@@ -267,42 +268,40 @@ class DashboardServiceTest extends TestCase
|
||||
'week_start' => Weekday::Sunday,
|
||||
]);
|
||||
$organization = Organization::factory()->withOwner($user)->create();
|
||||
$organization->users()->attach($user, [
|
||||
'role' => Role::Owner->value,
|
||||
]);
|
||||
$member = Member::factory()->forUser($user)->forOrganization($organization)->role(Role::Owner)->create();
|
||||
$project1 = Project::factory()->forOrganization($organization)->create();
|
||||
$project2 = Project::factory()->forOrganization($organization)->create();
|
||||
$timeEntry1Project1 = TimeEntry::factory()->forUser($user)->forOrganization($organization)->forProject($project1)->create([
|
||||
$timeEntry1Project1 = TimeEntry::factory()->forMember($member)->forOrganization($organization)->forProject($project1)->create([
|
||||
// Note: At the start of the week
|
||||
'start' => $now->startOfWeek(Weekday::Sunday->carbonWeekDay())->utc(),
|
||||
'end' => $now->startOfWeek(Weekday::Sunday->carbonWeekDay())->addSeconds(40)->utc(),
|
||||
]);
|
||||
$timeEntry2Project1 = TimeEntry::factory()->forUser($user)->forOrganization($organization)->forProject($project1)->create([
|
||||
$timeEntry2Project1 = TimeEntry::factory()->forMember($member)->forOrganization($organization)->forProject($project1)->create([
|
||||
// Note: At the end of the week
|
||||
'start' => $now->endOfWeek(Weekday::Sunday->carbonWeekDay())->utc(),
|
||||
'end' => $now->endOfWeek(Weekday::Sunday->carbonWeekDay())->addSeconds(40)->utc(),
|
||||
]);
|
||||
$timeEntry1Project2 = TimeEntry::factory()->forUser($user)->forOrganization($organization)->forProject($project2)->create([
|
||||
$timeEntry1Project2 = TimeEntry::factory()->forMember($member)->forOrganization($organization)->forProject($project2)->create([
|
||||
// Note: At the start of the week
|
||||
'start' => $now->startOfWeek(Weekday::Sunday->carbonWeekDay())->utc(),
|
||||
'end' => $now->startOfWeek(Weekday::Sunday->carbonWeekDay())->addSeconds(40)->utc(),
|
||||
]);
|
||||
$timeEntry2Project2 = TimeEntry::factory()->forUser($user)->forOrganization($organization)->forProject($project2)->create([
|
||||
$timeEntry2Project2 = TimeEntry::factory()->forMember($member)->forOrganization($organization)->forProject($project2)->create([
|
||||
// Note: At the end of the week
|
||||
'start' => $now->endOfWeek(Weekday::Sunday->carbonWeekDay())->utc(),
|
||||
'end' => $now->endOfWeek(Weekday::Sunday->carbonWeekDay())->addSeconds(40)->utc(),
|
||||
]);
|
||||
$timeEntry1WithoutProject = TimeEntry::factory()->forUser($user)->forOrganization($organization)->create([
|
||||
$timeEntry1WithoutProject = TimeEntry::factory()->forMember($member)->forOrganization($organization)->create([
|
||||
// Note: At the start of the week
|
||||
'start' => $now->startOfWeek(Weekday::Sunday->carbonWeekDay())->utc(),
|
||||
'end' => $now->startOfWeek(Weekday::Sunday->carbonWeekDay())->addSeconds(40)->utc(),
|
||||
]);
|
||||
$timeEntry2WithoutProject = TimeEntry::factory()->forUser($user)->forOrganization($organization)->create([
|
||||
$timeEntry2WithoutProject = TimeEntry::factory()->forMember($member)->forOrganization($organization)->create([
|
||||
// Note: At the end of the week
|
||||
'start' => $now->endOfWeek(Weekday::Sunday->carbonWeekDay())->utc(),
|
||||
'end' => $now->endOfWeek(Weekday::Sunday->carbonWeekDay())->addSeconds(40)->utc(),
|
||||
]);
|
||||
$timeEntry1WithoutProjectOutsideOfWeek = TimeEntry::factory()->forUser($user)->forOrganization($organization)->create([
|
||||
$timeEntry1WithoutProjectOutsideOfWeek = TimeEntry::factory()->forMember($member)->forOrganization($organization)->create([
|
||||
// Note: Outside of week
|
||||
'start' => $now->startOfWeek(Weekday::Sunday->carbonWeekDay())->subSecond()->utc(),
|
||||
'end' => $now->startOfWeek(Weekday::Sunday->carbonWeekDay())->addSeconds(39)->utc(),
|
||||
@@ -312,7 +311,7 @@ class DashboardServiceTest extends TestCase
|
||||
$result = $this->dashboardService->weeklyProjectOverview($user, $organization);
|
||||
|
||||
// Assert
|
||||
$this->assertSame([
|
||||
$this->assertEqualsCanonicalizing([
|
||||
[
|
||||
'value' => 80,
|
||||
'id' => $project1->getKey(),
|
||||
@@ -345,18 +344,18 @@ class DashboardServiceTest extends TestCase
|
||||
'timezone' => 'Europe/Vienna',
|
||||
'week_start' => Weekday::Sunday,
|
||||
]);
|
||||
$user->organizations()->attach($organization);
|
||||
$timeEntry1WithoutProject = TimeEntry::factory()->forUser($user)->forOrganization($organization)->create([
|
||||
$member = Member::factory()->forUser($user)->forOrganization($organization)->create();
|
||||
$timeEntry1WithoutProject = TimeEntry::factory()->forMember($member)->forOrganization($organization)->create([
|
||||
// Note: At the start of the week
|
||||
'start' => $now->startOfWeek(Weekday::Sunday->carbonWeekDay())->utc(),
|
||||
'end' => $now->startOfWeek(Weekday::Sunday->carbonWeekDay())->addSeconds(40)->utc(),
|
||||
]);
|
||||
$timeEntry2WithoutProject = TimeEntry::factory()->forUser($user)->forOrganization($organization)->create([
|
||||
$timeEntry2WithoutProject = TimeEntry::factory()->forMember($member)->forOrganization($organization)->create([
|
||||
// Note: At the end of the week
|
||||
'start' => $now->endOfWeek(Weekday::Sunday->carbonWeekDay())->utc(),
|
||||
'end' => $now->endOfWeek(Weekday::Sunday->carbonWeekDay())->addSeconds(40)->utc(),
|
||||
]);
|
||||
$timeEntry1WithoutProjectOutsideOfWeek = TimeEntry::factory()->forUser($user)->forOrganization($organization)->create([
|
||||
$timeEntry1WithoutProjectOutsideOfWeek = TimeEntry::factory()->forMember($member)->forOrganization($organization)->create([
|
||||
// Note: Outside of week
|
||||
'start' => $now->startOfWeek(Weekday::Sunday->carbonWeekDay())->subSecond()->utc(),
|
||||
'end' => $now->startOfWeek(Weekday::Sunday->carbonWeekDay())->addSeconds(39)->utc(),
|
||||
@@ -386,7 +385,7 @@ class DashboardServiceTest extends TestCase
|
||||
'timezone' => 'Europe/Vienna',
|
||||
'week_start' => Weekday::Sunday,
|
||||
]);
|
||||
$user->organizations()->attach($organization);
|
||||
$member = Member::factory()->forUser($user)->forOrganization($organization)->create();
|
||||
|
||||
// Act
|
||||
$result = $this->dashboardService->weeklyProjectOverview($user, $organization);
|
||||
@@ -406,31 +405,31 @@ class DashboardServiceTest extends TestCase
|
||||
{
|
||||
// Arrange
|
||||
$organization = Organization::factory()->create();
|
||||
$user1 = User::factory()->create();
|
||||
$user2 = User::factory()->create();
|
||||
$user3 = User::factory()->create();
|
||||
$user4 = User::factory()->create();
|
||||
$user5 = User::factory()->create();
|
||||
$member1 = Member::factory()->forOrganization($organization)->create();
|
||||
$member2 = Member::factory()->forOrganization($organization)->create();
|
||||
$member3 = Member::factory()->forOrganization($organization)->create();
|
||||
$member4 = Member::factory()->forOrganization($organization)->create();
|
||||
$member5 = Member::factory()->forOrganization($organization)->create();
|
||||
$task1 = Task::factory()->forOrganization($organization)->create();
|
||||
$timeEntry1 = TimeEntry::factory()->forUser($user1)->forOrganization($organization)->active()->create([
|
||||
$timeEntry1 = TimeEntry::factory()->forMember($member1)->forOrganization($organization)->active()->create([
|
||||
'start' => now()->subMinutes(10),
|
||||
]);
|
||||
$timeEntry2 = TimeEntry::factory()->forUser($user2)->forOrganization($organization)->create([
|
||||
$timeEntry2 = TimeEntry::factory()->forMember($member2)->forOrganization($organization)->create([
|
||||
'start' => now()->subMinutes(20),
|
||||
]);
|
||||
$timeEntry3 = TimeEntry::factory()->forUser($user3)->forOrganization($organization)->forTask($task1)->create([
|
||||
$timeEntry3 = TimeEntry::factory()->forMember($member3)->forOrganization($organization)->forTask($task1)->create([
|
||||
'description' => '',
|
||||
'start' => now()->subMinutes(30),
|
||||
]);
|
||||
$timeEntry4 = TimeEntry::factory()->forUser($user4)->forOrganization($organization)->forTask($task1)->create([
|
||||
$timeEntry4 = TimeEntry::factory()->forMember($member4)->forOrganization($organization)->forTask($task1)->create([
|
||||
'description' => 'TEST 123',
|
||||
'start' => now()->subMinutes(40),
|
||||
]);
|
||||
$timeEntry5 = TimeEntry::factory()->forUser($user4)->forOrganization($organization)->forTask($task1)->create([
|
||||
$timeEntry5 = TimeEntry::factory()->forMember($member4)->forOrganization($organization)->forTask($task1)->create([
|
||||
'description' => 'TEST 321',
|
||||
'start' => now()->subMinutes(50),
|
||||
]);
|
||||
$timeEntry6 = TimeEntry::factory()->forUser($user5)->forOrganization($organization)->forTask($task1)->create([
|
||||
$timeEntry6 = TimeEntry::factory()->forMember($member5)->forOrganization($organization)->forTask($task1)->create([
|
||||
'description' => 'TEST 321',
|
||||
'start' => now()->subMinutes(60),
|
||||
]);
|
||||
@@ -441,32 +440,32 @@ class DashboardServiceTest extends TestCase
|
||||
// Assert
|
||||
$this->assertSame([
|
||||
[
|
||||
'user_id' => $user1->getKey(),
|
||||
'name' => $user1->name,
|
||||
'member_id' => $member1->getKey(),
|
||||
'name' => $member1->user->name,
|
||||
'description' => $timeEntry1->description,
|
||||
'time_entry_id' => $timeEntry1->getKey(),
|
||||
'task_id' => null,
|
||||
'status' => true,
|
||||
],
|
||||
[
|
||||
'user_id' => $user2->getKey(),
|
||||
'name' => $user2->name,
|
||||
'member_id' => $member2->getKey(),
|
||||
'name' => $member2->user->name,
|
||||
'description' => $timeEntry2->description,
|
||||
'time_entry_id' => $timeEntry2->getKey(),
|
||||
'task_id' => null,
|
||||
'status' => false,
|
||||
],
|
||||
[
|
||||
'user_id' => $user3->getKey(),
|
||||
'name' => $user3->name,
|
||||
'member_id' => $member3->getKey(),
|
||||
'name' => $member3->user->name,
|
||||
'description' => $timeEntry3->description,
|
||||
'time_entry_id' => $timeEntry3->getKey(),
|
||||
'task_id' => $task1->getKey(),
|
||||
'status' => false,
|
||||
],
|
||||
[
|
||||
'user_id' => $user4->getKey(),
|
||||
'name' => $user4->name,
|
||||
'member_id' => $member4->getKey(),
|
||||
'name' => $member4->user->name,
|
||||
'description' => $timeEntry4->description,
|
||||
'time_entry_id' => $timeEntry4->getKey(),
|
||||
'task_id' => $task1->getKey(),
|
||||
@@ -480,25 +479,26 @@ class DashboardServiceTest extends TestCase
|
||||
// Arrange
|
||||
$organization = Organization::factory()->create();
|
||||
$user = User::factory()->create();
|
||||
$member = Member::factory()->forUser($user)->forOrganization($organization)->create();
|
||||
$task1 = Task::factory()->forOrganization($organization)->create();
|
||||
$task2 = Task::factory()->forOrganization($organization)->create();
|
||||
$task3 = Task::factory()->forOrganization($organization)->create();
|
||||
$task4 = Task::factory()->forOrganization($organization)->create();
|
||||
$task5 = Task::factory()->forOrganization($organization)->create();
|
||||
|
||||
$timeEntry1Task1 = TimeEntry::factory()->forTask($task1)->forUser($user)->forOrganization($organization)->create([
|
||||
$timeEntry1Task1 = TimeEntry::factory()->forTask($task1)->forMember($member)->forOrganization($organization)->create([
|
||||
'start' => now()->subMinutes(20),
|
||||
]);
|
||||
$timeEntry1Task2 = TimeEntry::factory()->forTask($task2)->forUser($user)->forOrganization($organization)->create([
|
||||
$timeEntry1Task2 = TimeEntry::factory()->forTask($task2)->forMember($member)->forOrganization($organization)->create([
|
||||
'start' => now()->subMinutes(30),
|
||||
]);
|
||||
$timeEntry1Task3 = TimeEntry::factory()->forTask($task3)->forUser($user)->forOrganization($organization)->create([
|
||||
$timeEntry1Task3 = TimeEntry::factory()->forTask($task3)->forMember($member)->forOrganization($organization)->create([
|
||||
'start' => now()->subMinutes(40),
|
||||
]);
|
||||
$timeEntry1Task4 = TimeEntry::factory()->forTask($task4)->forUser($user)->forOrganization($organization)->create([
|
||||
$timeEntry1Task4 = TimeEntry::factory()->forTask($task4)->forMember($member)->forOrganization($organization)->create([
|
||||
'start' => now()->subMinutes(50),
|
||||
]);
|
||||
$timeEntry1Task5 = TimeEntry::factory()->forTask($task5)->forUser($user)->forOrganization($organization)->create([
|
||||
$timeEntry1Task5 = TimeEntry::factory()->forTask($task5)->forMember($member)->forOrganization($organization)->create([
|
||||
'start' => now()->subMinutes(60),
|
||||
]);
|
||||
|
||||
@@ -543,15 +543,16 @@ class DashboardServiceTest extends TestCase
|
||||
$user = User::factory()->create([
|
||||
'timezone' => 'Europe/Vienna',
|
||||
]);
|
||||
$timeEntryOverWholePeriod = TimeEntry::factory()->forUser($user)->forOrganization($organization)->create([
|
||||
$member = Member::factory()->forUser($user)->forOrganization($organization)->create();
|
||||
$timeEntryOverWholePeriod = TimeEntry::factory()->forMember($member)->forOrganization($organization)->create([
|
||||
'start' => now('Europe/Vienna')->subDays(7)->startOfDay()->utc(),
|
||||
'end' => now('Europe/Vienna')->endOfDay()->addSecond()->utc(), // TODO: fix problem with last second
|
||||
]);
|
||||
$timeEntryOverWholePeriodWithoutEnd = TimeEntry::factory()->forUser($user)->forOrganization($organization)->create([
|
||||
$timeEntryOverWholePeriodWithoutEnd = TimeEntry::factory()->forMember($member)->forOrganization($organization)->create([
|
||||
'start' => now('Europe/Vienna')->subDays(7)->startOfDay()->utc(),
|
||||
'end' => null,
|
||||
]);
|
||||
$timeEntry1Task1 = TimeEntry::factory()->forUser($user)->forOrganization($organization)->create([
|
||||
$timeEntry1Task1 = TimeEntry::factory()->forMember($member)->forOrganization($organization)->create([
|
||||
'start' => now('Europe/Vienna')->subMinutes(30)->utc(),
|
||||
'end' => now('Europe/Vienna')->subMinutes(20)->utc(),
|
||||
]);
|
||||
|
||||
@@ -4,6 +4,7 @@ declare(strict_types=1);
|
||||
|
||||
namespace Tests\Unit\Service;
|
||||
|
||||
use App\Enums\Role;
|
||||
use App\Models\Organization;
|
||||
use App\Models\User;
|
||||
use App\Service\PermissionStore;
|
||||
@@ -20,7 +21,7 @@ class PermissionStoreTest extends TestCase
|
||||
// Arrange
|
||||
$organization = Organization::factory()->create();
|
||||
$user = User::factory()->create();
|
||||
$organization->users()->attach($user, ['role' => 'employee']);
|
||||
$organization->users()->attach($user, ['role' => Role::Employee->value]);
|
||||
$permissionStore = new PermissionStore();
|
||||
|
||||
// Act
|
||||
@@ -50,7 +51,7 @@ class PermissionStoreTest extends TestCase
|
||||
// Arrange
|
||||
$organization = Organization::factory()->create();
|
||||
$user = User::factory()->create();
|
||||
$organization->users()->attach($user, ['role' => 'employee']);
|
||||
$organization->users()->attach($user, ['role' => Role::Employee->value]);
|
||||
$permissionStore = new PermissionStore();
|
||||
$this->actingAs($user);
|
||||
|
||||
@@ -66,7 +67,7 @@ class PermissionStoreTest extends TestCase
|
||||
// Arrange
|
||||
$organization = Organization::factory()->create();
|
||||
$user = User::factory()->create();
|
||||
$organization->users()->attach($user, ['role' => 'employee']);
|
||||
$organization->users()->attach($user, ['role' => Role::Employee->value]);
|
||||
$permissionStore = new PermissionStore();
|
||||
$this->actingAs($user);
|
||||
|
||||
@@ -82,7 +83,7 @@ class PermissionStoreTest extends TestCase
|
||||
// Arrange
|
||||
$organization = Organization::factory()->create();
|
||||
$user = User::factory()->create();
|
||||
$organization->users()->attach($user, ['role' => 'employee']);
|
||||
$organization->users()->attach($user, ['role' => Role::Employee->value]);
|
||||
$permissionStore = new PermissionStore();
|
||||
|
||||
// Act
|
||||
@@ -111,7 +112,7 @@ class PermissionStoreTest extends TestCase
|
||||
// Arrange
|
||||
$organization = Organization::factory()->create();
|
||||
$user = User::factory()->create();
|
||||
$organization->users()->attach($user, ['role' => 'employee']);
|
||||
$organization->users()->attach($user, ['role' => Role::Employee->value]);
|
||||
$permissionStore = new PermissionStore();
|
||||
$this->actingAs($user);
|
||||
|
||||
@@ -119,6 +120,6 @@ class PermissionStoreTest extends TestCase
|
||||
$result = $permissionStore->getPermissions($organization);
|
||||
|
||||
// Assert
|
||||
$this->assertSame(Jetstream::findRole('employee')->permissions, $result);
|
||||
$this->assertSame(Jetstream::findRole(Role::Employee->value)->permissions, $result);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -5,7 +5,7 @@ declare(strict_types=1);
|
||||
namespace Tests\Unit\Service;
|
||||
|
||||
use App\Enums\Role;
|
||||
use App\Models\Membership;
|
||||
use App\Models\Member;
|
||||
use App\Models\Organization;
|
||||
use App\Models\Project;
|
||||
use App\Models\ProjectMember;
|
||||
@@ -27,10 +27,13 @@ class UserServiceTest extends TestCase
|
||||
$otherUser = User::factory()->create();
|
||||
$fromUser = User::factory()->create();
|
||||
$toUser = User::factory()->create();
|
||||
TimeEntry::factory()->forOrganization($organization)->forUser($otherUser)->createMany(3);
|
||||
TimeEntry::factory()->forOrganization($organization)->forUser($fromUser)->createMany(3);
|
||||
ProjectMember::factory()->forProject($project)->forUser($otherUser)->create();
|
||||
ProjectMember::factory()->forProject($project)->forUser($fromUser)->create();
|
||||
$otherUserMember = Member::factory()->forOrganization($organization)->forUser($otherUser)->create();
|
||||
$fromUserMember = Member::factory()->forOrganization($organization)->forUser($fromUser)->create();
|
||||
$toUserMember = Member::factory()->forOrganization($organization)->forUser($toUser)->create();
|
||||
TimeEntry::factory()->forOrganization($organization)->forMember($otherUserMember)->createMany(3);
|
||||
TimeEntry::factory()->forOrganization($organization)->forMember($fromUserMember)->createMany(3);
|
||||
ProjectMember::factory()->forProject($project)->forMember($otherUserMember)->create();
|
||||
ProjectMember::factory()->forProject($project)->forMember($fromUserMember)->create();
|
||||
|
||||
// Act
|
||||
/** @var UserService $userService */
|
||||
@@ -66,7 +69,7 @@ class UserServiceTest extends TestCase
|
||||
|
||||
// Assert
|
||||
$this->assertSame($newOwner->getKey(), $organization->refresh()->user_id);
|
||||
$this->assertSame(Role::Owner->value, Membership::whereBelongsTo($newOwner)->whereBelongsTo($organization)->firstOrFail()->role);
|
||||
$this->assertSame(Role::Admin->value, Membership::whereBelongsTo($oldOwner)->whereBelongsTo($organization)->firstOrFail()->role);
|
||||
$this->assertSame(Role::Owner->value, Member::whereBelongsTo($newOwner)->whereBelongsTo($organization)->firstOrFail()->role);
|
||||
$this->assertSame(Role::Admin->value, Member::whereBelongsTo($oldOwner)->whereBelongsTo($organization)->firstOrFail()->role);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user