···
oauthClient := SetupOAuthTestClient(t, oauthStore)
88
-
voteService := votes.NewService(voteRepo, nil, oauthClient, oauthStore, nil)
88
+
voteService := votes.NewService(voteRepo, oauthClient, oauthStore, nil)
// Create test user on PDS
testUserHandle := fmt.Sprintf("voter-%d.local.coves.dev", time.Now().Unix())
···
176
-
if err := json.NewDecoder(resp.Body).Decode(&voteResp); err != nil {
177
-
t.Fatalf("Failed to decode vote response: %v", err)
176
+
if decodeErr := json.NewDecoder(resp.Body).Decode(&voteResp); decodeErr != nil {
177
+
t.Fatalf("Failed to decode vote response: %v", decodeErr)
t.Logf("✅ XRPC response received:")
···
oauthStore := SetupOAuthTestStore(t, db)
oauthClient := SetupOAuthTestClient(t, oauthStore)
313
-
voteService := votes.NewService(voteRepo, nil, oauthClient, oauthStore, nil)
313
+
voteService := votes.NewService(voteRepo, oauthClient, oauthStore, nil)
testUserHandle := fmt.Sprintf("toggle-%d.local.coves.dev", time.Now().Unix())
···
369
-
json.NewDecoder(resp.Body).Decode(&firstVoteResp)
369
+
if decodeErr := json.NewDecoder(resp.Body).Decode(&firstVoteResp); decodeErr != nil {
370
+
t.Fatalf("Failed to decode first vote response: %v", decodeErr)
372
+
if closeErr := resp.Body.Close(); closeErr != nil {
373
+
t.Logf("Failed to close response body: %v", closeErr)
t.Logf("✅ First vote created: %s", firstVoteResp.URI)
···
397
-
voteConsumer.HandleEvent(ctx, &voteEvent)
401
+
if handleErr := voteConsumer.HandleEvent(ctx, &voteEvent); handleErr != nil {
402
+
t.Fatalf("Failed to handle first vote event: %v", handleErr)
// Second upvote (same direction) - should toggle off (delete)
t.Logf("\n📝 Creating second upvote (toggle off)...")
···
t.Fatalf("Failed to toggle vote: %v", err)
411
-
defer resp2.Body.Close()
418
+
if closeErr := resp2.Body.Close(); closeErr != nil {
419
+
t.Logf("Failed to close response body: %v", closeErr)
if resp2.StatusCode != http.StatusOK {
body, _ := io.ReadAll(resp2.Body)
···
433
-
voteConsumer.HandleEvent(ctx, &deleteEvent)
443
+
if handleErr := voteConsumer.HandleEvent(ctx, &deleteEvent); handleErr != nil {
444
+
t.Fatalf("Failed to handle delete event: %v", handleErr)
// Verify vote was removed from AppView
t.Logf("\n🔍 Verifying vote removed from AppView...")
···
oauthStore := SetupOAuthTestStore(t, db)
oauthClient := SetupOAuthTestClient(t, oauthStore)
472
-
voteService := votes.NewService(voteRepo, nil, oauthClient, oauthStore, nil)
484
+
voteService := votes.NewService(voteRepo, oauthClient, oauthStore, nil)
testUserHandle := fmt.Sprintf("flip-%d.local.coves.dev", time.Now().Unix())
···
req.Header.Set("Content-Type", "application/json")
req.Header.Set("Authorization", "Bearer "+token)
519
-
resp, _ := http.DefaultClient.Do(req)
531
+
resp, err := http.DefaultClient.Do(req)
533
+
t.Fatalf("Failed to create upvote: %v", err)
524
-
json.NewDecoder(resp.Body).Decode(&upvoteResp)
539
+
if decodeErr := json.NewDecoder(resp.Body).Decode(&upvoteResp); decodeErr != nil {
540
+
t.Fatalf("Failed to decode upvote response: %v", decodeErr)
542
+
if closeErr := resp.Body.Close(); closeErr != nil {
543
+
t.Logf("Failed to close response body: %v", closeErr)
rkey := utils.ExtractRKeyFromURI(upvoteResp.URI)
···
550
-
voteConsumer.HandleEvent(ctx, &upvoteEvent)
569
+
if handleErr := voteConsumer.HandleEvent(ctx, &upvoteEvent); handleErr != nil {
570
+
t.Fatalf("Failed to handle upvote event: %v", handleErr)
t.Logf("✅ Upvote created and indexed")
···
req2.Header.Set("Content-Type", "application/json")
req2.Header.Set("Authorization", "Bearer "+token)
571
-
resp2, _ := http.DefaultClient.Do(req2)
592
+
resp2, err := http.DefaultClient.Do(req2)
594
+
t.Fatalf("Failed to create downvote: %v", err)
var downvoteResp struct {
576
-
json.NewDecoder(resp2.Body).Decode(&downvoteResp)
600
+
if decodeErr := json.NewDecoder(resp2.Body).Decode(&downvoteResp); decodeErr != nil {
601
+
t.Fatalf("Failed to decode downvote response: %v", decodeErr)
603
+
if closeErr := resp2.Body.Close(); closeErr != nil {
604
+
t.Logf("Failed to close response body: %v", closeErr)
// Simulate Jetstream UPDATE event (PDS updates the existing record)
t.Logf("\n🔄 Simulating Jetstream UPDATE event...")
···
602
-
voteConsumer.HandleEvent(ctx, &updateEvent)
630
+
if handleErr := voteConsumer.HandleEvent(ctx, &updateEvent); handleErr != nil {
631
+
t.Fatalf("Failed to handle update event: %v", handleErr)
// Verify vote direction changed in AppView
t.Logf("\n🔍 Verifying vote direction changed in AppView...")
···
oauthStore := SetupOAuthTestStore(t, db)
oauthClient := SetupOAuthTestClient(t, oauthStore)
651
-
voteService := votes.NewService(voteRepo, nil, oauthClient, oauthStore, nil)
681
+
voteService := votes.NewService(voteRepo, oauthClient, oauthStore, nil)
testUserHandle := fmt.Sprintf("delete-%d.local.coves.dev", time.Now().Unix())
···
req.Header.Set("Content-Type", "application/json")
req.Header.Set("Authorization", "Bearer "+token)
698
-
resp, _ := http.DefaultClient.Do(req)
728
+
resp, err := http.DefaultClient.Do(req)
730
+
t.Fatalf("Failed to create vote: %v", err)
703
-
json.NewDecoder(resp.Body).Decode(&voteResp)
736
+
if decodeErr := json.NewDecoder(resp.Body).Decode(&voteResp); decodeErr != nil {
737
+
t.Fatalf("Failed to decode vote response: %v", decodeErr)
739
+
if closeErr := resp.Body.Close(); closeErr != nil {
740
+
t.Logf("Failed to close response body: %v", closeErr)
rkey := utils.ExtractRKeyFromURI(voteResp.URI)
···
729
-
voteConsumer.HandleEvent(ctx, &voteEvent)
766
+
if handleErr := voteConsumer.HandleEvent(ctx, &voteEvent); handleErr != nil {
767
+
t.Fatalf("Failed to handle vote event: %v", handleErr)
t.Logf("✅ Vote created and indexed")
···
deleteHttpReq.Header.Set("Content-Type", "application/json")
deleteHttpReq.Header.Set("Authorization", "Bearer "+token)
749
-
deleteResp, _ := http.DefaultClient.Do(deleteHttpReq)
750
-
defer deleteResp.Body.Close()
788
+
deleteResp, err := http.DefaultClient.Do(deleteHttpReq)
790
+
t.Fatalf("Failed to delete vote: %v", err)
793
+
if closeErr := deleteResp.Body.Close(); closeErr != nil {
794
+
t.Logf("Failed to close response body: %v", closeErr)
if deleteResp.StatusCode != http.StatusOK {
body, _ := io.ReadAll(deleteResp.Body)
···
// Per lexicon, delete returns empty object {}
var deleteRespBody map[string]interface{}
759
-
json.NewDecoder(deleteResp.Body).Decode(&deleteRespBody)
805
+
if decodeErr := json.NewDecoder(deleteResp.Body).Decode(&deleteRespBody); decodeErr != nil {
806
+
t.Fatalf("Failed to decode delete response: %v", decodeErr)
if len(deleteRespBody) != 0 {
t.Errorf("Expected empty object per lexicon, got %v", deleteRespBody)
···
780
-
voteConsumer.HandleEvent(ctx, &deleteEvent)
828
+
if handleErr := voteConsumer.HandleEvent(ctx, &deleteEvent); handleErr != nil {
829
+
t.Fatalf("Failed to handle delete event: %v", handleErr)
// Verify vote removed from AppView
t.Logf("\n🔍 Verifying vote removed from AppView...")