A forum is a deceptively complex thing. Sure, it's made up of threads and replies, but what else might exist as part of a forum? What about profiles, or thread subscriptions, or filtering, or real-time notifications? As it turns out, a forum is the perfect project to stretch your programming muscles. In this series, we'll work together to build one with tests from A to Z.
Overview
Syllabus
- Initial Database Setup With Seeding
- Test-Driving Threads
- A Thread Can Have Replies
- A User May Respond to Threads
- The Reply Form
- A User May Publish Threads
- Let's Make Some Testing Helpers
- The Exception Handling Conundrum
- A Thread Should Be Assigned a Channel
- How to Test Validation Errors
- Users Can Filter Threads By Channel
- Validation Errors and Old Data
- Extracting to View Composers
- A User Can Filter All Threads By Username
- A Lesson in Refactoring
- Meta Details and Pagination
- A User Can Filter Threads By Popularity
- A User Can Favorite Replies
- The Favorite Button
- From 56 Queries Down to 2
- Global Scopes and Further Query Reduction
- A User Has a Profile
- A User Can Delete Their Threads
- Authorization With Policies
- How to Construct an Activity Feed with TDD
- How to Construct An Activity Feed with TDD: Part 2
- Extracting Controller Queries to the Model
- The Activity Deletion Bug
- Flash Messaging With Vue
- A User's Activity Feed Should Include Favorited Replies
- Authorized Users Can Delete Replies
- A Vue Reply Component
- Ajaxifying the Delete Button
- A Vue Favorite Component
- Squashing Bugs
- A More Data-centric Approach
- A New Reply Component
- Laravel and Vue Pagination
- A User Can Filter By Unanswered Threads
- Thread Subscriptions: Part 1
- Thread Subscriptions: Part 2
- Thread Subscriptions: Part 3
- Thread Subscriptions: Part 4
- Test Refactoring
- Thread Subscriptions: Part 5
- Refactoring for the Better or Worse?
- Notification Fakes in a Nutshell
- This Thread Has Been Updated Since You Last Read It
- Spam Detection
- Graduating Inspection Methods to Classes
- Spam Detection At All Ports
- Handling Server Exceptions with JavaScript
- Refactoring to Custom Validation
- A User May Not Reply More Than Once Per Minute
- Refactoring to Form Requests
- Mentioned Users Notifications: Part 1
- Mentioned Users Notifications: Part 2
- Don't Forget to Scan Your Files
- Wrap Usernames Within Anchor Tags
- Instant Username Autocompletion
- Instant Username Autocompletion: Part 2
- Basic View Tweaks
- Testing Avatar Uploads
- Testing Avatar Uploads: Part 2
- AJAX Image Uploads
- Trending Threads With Redis
- Isolating Knowledge
- Thread Views: Design #1 - Trait
- Thread Views: Design #2 - Extract Class
- Thread Views: Design #3 - KISS
- Users Must Confirm Their Email Address: #1 - Protection
- Users Must Confirm Their Email Address: #2 - Confirmation
- Users Must Confirm Their Email Address: #3 - Cleanup
- Email Confirmation Loose Ends
- A Thread Should Have a Unique Slug: Part 1
- A Thread Should Have a Unique Slug: Part 2
- We Need a Regression Test
- Mark the Best Reply: Part 1
- Mark the Best Reply: Part 2
- Refactoring Authorization
- Remembering a Best Reply
- Confusing Errors and Solutions
- Thread Authorization
- An Administrator May Lock Any Thread
- An Administrator May Lock Any Thread: Part 2
- An Administrator May Lock Any Thread: Part 3
- An Administrator May Lock Any Thread: Part 4
- From Laravel 5.4 to Laravel 5.5
- Recaptcha
- Recaptcha Refactoring
- A Thread Can Be Updated
- A Thread Can Be Updated: Part 2
- A Thread Can Be Updated: Part 3
- First Class Search: Scout Review
- First Class Search: Implementation
- First Class Search: Faceting and Ranking
- First Class Search: Instant Results
- First Class Search: Forum Integration
- WYSIWYG
- WYSIWYG: Part 2
- Sanitizing is a Must
- Onward
Taught by
Jeffrey Way