Skip to content

Commit ee1be6d

Browse files
committed
Fixed tests
1 parent 16ccbb8 commit ee1be6d

9 files changed

Lines changed: 116 additions & 107 deletions

File tree

app/Http/Controllers/ResourceEditsController.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,13 @@
22

33
namespace App\Http\Controllers;
44

5+
use App\Events\TagFrequencyChanged;
56
use App\Models\ComputerScienceResource;
67
use App\Models\ResourceEdits;
78
use App\Services\ResourceEditsService;
89
use App\Services\DataNormalizationService;
910
use App\Http\Requests\ResourceEdit\StoreResourceEdit;
11+
use App\Http\Resources\ComputerScienceResourceResource;
1012
use Illuminate\Support\Facades\Auth;
1113
use Inertia\Inertia;
1214
use Log;

app/Models/ResourceReviewSummary.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@ class ResourceReviewSummary extends Model
1212
use HasVotes;
1313
use HasComments;
1414

15+
public $timestamps = false;
16+
1517
protected $fillable = ['computer_science_resource_id'];
1618

1719
protected $primaryKey = 'computer_science_resource_id';

app/Models/Upvote.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,5 +10,7 @@ class Upvote extends Model
1010
/** @use HasFactory<\Database\Factories\UpvoteFactory> */
1111
use HasFactory;
1212

13+
public $timestamps = false;
14+
1315
protected $fillable = ['value', 'user_id'];
1416
}

database/migrations/2025_02_09_172232_create_upvote_summaries_table.php

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,6 @@ public function up(): void
2222
$table->integer('total_votes')->storedAs('upvotes + downvotes');
2323
$table->integer('controversy')->storedAs('(upvotes + downvotes) - ABS(upvotes - downvotes)');
2424

25-
$table->timestamps();
2625
});
2726
}
2827

database/migrations/2025_02_18_225525_create_resource_review_summaries_table.php

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -57,8 +57,6 @@ public function up(): void
5757
->index();
5858

5959
$table->integer('review_count')->default(0);
60-
61-
$table->timestamps();
6260
});
6361
}
6462

resources/js/Components/Resources/Reviews/CreateResourceReview.vue

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ const form = useForm({
3737
const resolver = ref(yupResolver(resourceReviewFields));
3838
const isSavedToLocalStorage = ref(false);
3939
const isSubmitting = ref(false);
40+
const isDataLoaded = ref(false); // New: For controlling form rendering
4041
4142
// LocalStorage key for this resource's review draft
4243
const localStorageKey = computed(() => `review-draft-${props.resourceId}`);
@@ -90,17 +91,20 @@ const loadFromLocalStorage = () => {
9091
const parsedData = JSON.parse(savedData);
9192
form.title = parsedData.title || "";
9293
form.description = parsedData.description || "";
93-
form.community = parsedData.community;
94-
form.teaching_clarity = parsedData.teaching_clarity;
95-
form.engagement = parsedData.engagement;
96-
form.practicality = parsedData.practicality;
97-
form.user_friendliness = parsedData.user_friendliness;
98-
form.updates = parsedData.updates;
94+
form.community = parsedData.community ?? null;
95+
form.teaching_clarity = parsedData.teaching_clarity ?? null;
96+
form.engagement = parsedData.engagement ?? null;
97+
form.practicality = parsedData.practicality ?? null;
98+
form.user_friendliness = parsedData.user_friendliness ?? null;
99+
form.updates = parsedData.updates ?? null;
99100
form.pros = parsedData.pros || [];
100101
form.cons = parsedData.cons || [];
101102
isSavedToLocalStorage.value = true;
102103
} catch (error) {
103104
console.error('Error loading saved review:', error);
105+
// clear localStorage if data is corrupt
106+
localStorage.removeItem(localStorageKey.value);
107+
isSavedToLocalStorage.value = false;
104108
}
105109
}
106110
};
@@ -134,6 +138,7 @@ watch(
134138
135139
onMounted(() => {
136140
loadFromLocalStorage();
141+
isDataLoaded.value = true; // New: Set to true after loading
137142
});
138143
139144
onUnmounted(() => {
@@ -146,7 +151,6 @@ const submitReview = async (event) => {
146151
return;
147152
}
148153
149-
150154
isSubmitting.value = true;
151155
152156
form.post(
@@ -172,7 +176,8 @@ const submitReview = async (event) => {
172176
</script>
173177
174178
<template>
175-
<div class="mx-auto bg-white shadow-lg rounded-2xl p-6 relative">
179+
<!-- Main container, conditionally rendered -->
180+
<div v-if="isDataLoaded" class="mx-auto bg-white shadow-lg rounded-2xl p-6 relative">
176181
<!-- Saved to localStorage indicator -->
177182
<div
178183
v-if="isSavedToLocalStorage && hasFormContent"

tests/Feature/CommentsTest.php

Lines changed: 0 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -331,55 +331,6 @@ public function test_paginated_comment_retrieval_returns_all_posted_comments()
331331
);
332332
}
333333

334-
/**
335-
* Test that upvote summaries are created for both root comments and reply comments.
336-
*/
337-
public function test_upvote_summaries_created_for_comments()
338-
{
339-
$user = User::factory()->create();
340-
$this->actingAs($user);
341-
342-
$resource = ComputerScienceResource::factory()->create();
343-
344-
// Create a top-level comment.
345-
$topPayload = [
346-
'content' => 'Top level comment for upvote summary test.',
347-
'commentable_key' => 'resource',
348-
'commentable_id' => $resource->id,
349-
'parent_comment_id' => null,
350-
];
351-
$topResponse = $this->postJson(route('comments.store'), $topPayload);
352-
$topResponse->assertStatus(200);
353-
$topCommentId = $topResponse->json('new_comment.id');
354-
355-
// Upvote the top-level comment.
356-
$this->postJson(route('upvote', ['type'=>'comment', 'id'=>$topCommentId]));
357-
$this->assertDatabaseHas('upvote_summaries', [
358-
'upvotable_id' => $topCommentId,
359-
'upvotable_type' => Comment::class,
360-
'upvotes' => 1,
361-
]);
362-
363-
// Create a reply to the top-level comment.
364-
$replyPayload = [
365-
'content' => 'This is a reply to the top level comment.',
366-
'commentable_key' => 'resource',
367-
'commentable_id' => $resource->id,
368-
'parent_comment_id' => $topCommentId,
369-
];
370-
$replyResponse = $this->postJson(route('comments.store'), $replyPayload);
371-
$replyResponse->assertStatus(200);
372-
$replyCommentId = $replyResponse->json('new_comment.id');
373-
374-
// Upvote the reply comment.
375-
$this->postJson(route('upvote', ['type'=>'comment', 'id'=>$replyCommentId]));
376-
$this->assertDatabaseHas('upvote_summaries', [
377-
'upvotable_id' => $replyCommentId,
378-
'upvotable_type' => Comment::class,
379-
'upvotes' => 1,
380-
]);
381-
}
382-
383334
/**
384335
* Test that upvote summaries are created for all comments (root and replies).
385336
*/

tests/Feature/SortingStrategies/VoteSortingStrategyTest.php

Lines changed: 68 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -27,15 +27,20 @@ public function test_it_sorts_resource_reviews_by_top_votes()
2727
$reviews = ResourceReview::factory()->count(3)->create();
2828

2929
// 10, 2, -1
30-
UpvoteSummary::factory()
31-
->forUpvotable($reviews[0])
32-
->create([ 'upvotes' => 10, 'downvotes' => 0 ]);
33-
UpvoteSummary::factory()
34-
->forUpvotable($reviews[1])
35-
->create([ 'upvotes' => 7, 'downvotes' => 8 ]); // 7 - 8 = -1
36-
UpvoteSummary::factory()
37-
->forUpvotable($reviews[2])
38-
->create([ 'upvotes' => 6, 'downvotes' => 4 ]); // 6 - 4 = 2
30+
$summary1 = UpvoteSummary::where('upvotable_id', $reviews[0]->id)->where('upvotable_type', ResourceReview::class)->first();
31+
$summary1->upvotes = 10;
32+
$summary1->downvotes = 0;
33+
$summary1->save();
34+
35+
$summary2 = UpvoteSummary::where('upvotable_id', $reviews[1]->id)->where('upvotable_type', ResourceReview::class)->first();
36+
$summary2->upvotes = 7;
37+
$summary2->downvotes = 8; // 7 - 8 = -1
38+
$summary2->save();
39+
40+
$summary3 = UpvoteSummary::where('upvotable_id', $reviews[2]->id)->where('upvotable_type', ResourceReview::class)->first();
41+
$summary3->upvotes = 6;
42+
$summary3->downvotes = 4; // 6 - 4 = 2
43+
$summary3->save();
3944

4045
$sorted = $this->sortingManager
4146
->applySort(ResourceReview::query(), 'top')
@@ -48,25 +53,32 @@ public function test_it_sorts_resource_reviews_by_top_votes()
4853
$reviews[2]->id,
4954
$reviews[1]->id,
5055
], $sorted);
56+
5157
}
5258

5359
public function test_it_sorts_resource_reviews_by_bottom_votes()
5460
{
5561
$reviews = ResourceReview::factory()->count(3)->create();
5662

5763
// Scores: -5, 0, 5
58-
UpvoteSummary::factory()
59-
->forUpvotable($reviews[0])
60-
->create([ 'upvotes' => 0, 'downvotes' => 5 ]);
61-
UpvoteSummary::factory()
62-
->forUpvotable($reviews[1])
63-
->create([ 'upvotes' => 3, 'downvotes' => 3 ]);
64-
UpvoteSummary::factory()
65-
->forUpvotable($reviews[2])
66-
->create([ 'upvotes' => 10, 'downvotes' => 5 ]);
64+
$summary1 = UpvoteSummary::where('upvotable_id', $reviews[0]->id)->where('upvotable_type', ResourceReview::class)->first();
65+
$summary1->upvotes = 0;
66+
$summary1->downvotes = 5;
67+
$summary1->save();
68+
69+
$summary2 = UpvoteSummary::where('upvotable_id', $reviews[1]->id)->where('upvotable_type', ResourceReview::class)->first();
70+
$summary2->upvotes = 3;
71+
$summary2->downvotes = 3;
72+
$summary2->save();
73+
74+
$summary3 = UpvoteSummary::where('upvotable_id', $reviews[2]->id)->where('upvotable_type', ResourceReview::class)->first();
75+
$summary3->upvotes = 10;
76+
$summary3->downvotes = 5;
77+
$summary3->save();
6778

6879
$sorted = $this->sortingManager
6980
->applySort(ResourceReview::query(), 'bottom')
81+
->get()
7082
->pluck('id')
7183
->toArray();
7284

@@ -86,12 +98,24 @@ public function test_it_sorts_resource_reviews_by_controversial()
8698
// For (up, down): (5, 5) -> 10 - 0 = 10
8799
// (6, 4) -> 10 - 2 = 8
88100
// (10,0) -> 10 - 10 = 0
89-
UpvoteSummary::factory()->forUpvotable($reviews[0])->create(['upvotes'=>5, 'downvotes'=>5]);
90-
UpvoteSummary::factory()->forUpvotable($reviews[1])->create(['upvotes'=>6, 'downvotes'=>4]);
91-
UpvoteSummary::factory()->forUpvotable($reviews[2])->create(['upvotes'=>10, 'downvotes'=>0]);
101+
$summary1 = UpvoteSummary::where('upvotable_id', $reviews[0]->id)->where('upvotable_type', ResourceReview::class)->first();
102+
$summary1->upvotes = 5;
103+
$summary1->downvotes = 5;
104+
$summary1->save();
105+
106+
$summary2 = UpvoteSummary::where('upvotable_id', $reviews[1]->id)->where('upvotable_type', ResourceReview::class)->first();
107+
$summary2->upvotes = 6;
108+
$summary2->downvotes = 4;
109+
$summary2->save();
110+
111+
$summary3 = UpvoteSummary::where('upvotable_id', $reviews[2]->id)->where('upvotable_type', ResourceReview::class)->first();
112+
$summary3->upvotes = 10;
113+
$summary3->downvotes = 0;
114+
$summary3->save();
92115

93116
$sorted = $this->sortingManager
94117
->applySort(ResourceReview::query(), 'controversial')
118+
->get()
95119
->pluck('id')
96120
->toArray();
97121

@@ -108,9 +132,20 @@ public function test_it_sorts_resource_reviews_by_total_votes()
108132
$reviews = ResourceReview::factory()->count(3)->create();
109133

110134
// Total votes: 5, 10, 15
111-
UpvoteSummary::factory()->forUpvotable($reviews[0])->create(['upvotes'=>2, 'downvotes'=>3]);
112-
UpvoteSummary::factory()->forUpvotable($reviews[1])->create(['upvotes'=>5, 'downvotes'=>5]);
113-
UpvoteSummary::factory()->forUpvotable($reviews[2])->create(['upvotes'=>10, 'downvotes'=>5]);
135+
$summary1 = UpvoteSummary::where('upvotable_id', $reviews[0]->id)->where('upvotable_type', ResourceReview::class)->first();
136+
$summary1->upvotes = 2;
137+
$summary1->downvotes = 3;
138+
$summary1->save();
139+
140+
$summary2 = UpvoteSummary::where('upvotable_id', $reviews[1]->id)->where('upvotable_type', ResourceReview::class)->first();
141+
$summary2->upvotes = 5;
142+
$summary2->downvotes = 5;
143+
$summary2->save();
144+
145+
$summary3 = UpvoteSummary::where('upvotable_id', $reviews[2]->id)->where('upvotable_type', ResourceReview::class)->first();
146+
$summary3->upvotes = 10;
147+
$summary3->downvotes = 5;
148+
$summary3->save();
114149

115150
$sorted = $this->sortingManager
116151
->applySort(ResourceReview::query(), 'total_votes')
@@ -132,8 +167,15 @@ public function test_it_sorts_resource_reviews_by_hot()
132167
// review2: created now, score 10
133168
$review2 = ResourceReview::factory()->create(['created_at' => $now]);
134169

135-
UpvoteSummary::factory()->forUpvotable($review1)->create(['upvotes'=>100, 'downvotes'=>0]);
136-
UpvoteSummary::factory()->forUpvotable($review2)->create(['upvotes'=>10, 'downvotes'=>0]);
170+
$summary1 = UpvoteSummary::where('upvotable_id', $review1->id)->where('upvotable_type', ResourceReview::class)->first();
171+
$summary1->upvotes = 100;
172+
$summary1->downvotes = 0;
173+
$summary1->save();
174+
175+
$summary2 = UpvoteSummary::where('upvotable_id', $review2->id)->where('upvotable_type', ResourceReview::class)->first();
176+
$summary2->upvotes = 10;
177+
$summary2->downvotes = 0;
178+
$summary2->save();
137179

138180
$sorted = $this->sortingManager
139181
->applySort(ResourceReview::query(), 'hot')

0 commit comments

Comments
 (0)