diff --git a/app/KnowledgeEquityResponse.php b/app/KnowledgeEquityResponse.php new file mode 100644 index 00000000..8f8d1f24 --- /dev/null +++ b/app/KnowledgeEquityResponse.php @@ -0,0 +1,21 @@ +belongsTo(Wiki::class); + } +} diff --git a/database/migrations/2026_03_06_160019_create_knowledge_equity_responses_table.php b/database/migrations/2026_03_06_160019_create_knowledge_equity_responses_table.php new file mode 100644 index 00000000..b5c9088f --- /dev/null +++ b/database/migrations/2026_03_06_160019_create_knowledge_equity_responses_table.php @@ -0,0 +1,35 @@ +id(); + $table->timestamps(); + $table->unsignedInteger('wiki_id'); + $table + ->foreign('wiki_id') + ->references('id') + ->on('wikis') + // Explicitly use the eloquent default options. + // restrict rather than cascading chosen to not result in unexpectedly deleting Knowledge Equity Responses when we delete a wiki + ->restrictOnDelete() + ->restrictOnUpdate(); + $table->enum('selectedOption', ['yes', 'no', 'unsure', 'unsaid']); + $table->string('freeTextResponse', 3000)->nullable(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void { + Schema::dropIfExists('knowledge_equity_responses'); + } +}; diff --git a/tests/KnowledgeEquityResponseTest.php b/tests/KnowledgeEquityResponseTest.php new file mode 100644 index 00000000..dc7bf4d1 --- /dev/null +++ b/tests/KnowledgeEquityResponseTest.php @@ -0,0 +1,80 @@ +wiki = Wiki::factory()->create(); + } + + public function testCreateValidKnowledgeEquityResponse(): void { + $knowledgeEquityResponse = new KnowledgeEquityResponse([ + 'wiki_id' => $this->wiki->id, + 'selectedOption' => 'yes', + 'freeTextResponse' => 'Because it just does', + ]); + + $knowledgeEquityResponse->save(); + + $this->assertDatabaseHas('knowledge_equity_responses', [ + 'wiki_id' => $this->wiki->id, + 'selectedOption' => 'yes', + 'freeTextResponse' => 'Because it just does', + ]); + } + + public function testCreateValidKnowledgeEquityResponseNoFreeText(): void { + $knowledgeEquityResponse = new KnowledgeEquityResponse([ + 'wiki_id' => $this->wiki->id, + 'selectedOption' => 'yes', + ]); + + $knowledgeEquityResponse->save(); + + $this->assertDatabaseHas('knowledge_equity_responses', [ + 'wiki_id' => $this->wiki->id, + 'selectedOption' => 'yes', + ]); + } + + public function testCreateValidKnowledgeEquityResponse3000CharFreeText(): void { + $longFreeText = Str::random(3000); + $knowledgeEquityResponse = new KnowledgeEquityResponse([ + 'wiki_id' => $this->wiki->id, + 'selectedOption' => 'yes', + 'freeTextResponse' => $longFreeText, + ]); + + $knowledgeEquityResponse->save(); + + $this->assertDatabaseHas('knowledge_equity_responses', [ + 'wiki_id' => $this->wiki->id, + 'selectedOption' => 'yes', + ]); + } + + public function testDeleteValidKnowledgeEquityResponsePreventsWikiDeletion(): void { + $knowledgeEquityResponse = new KnowledgeEquityResponse([ + 'wiki_id' => $this->wiki->id, + 'selectedOption' => 'yes', + ]); + + $knowledgeEquityResponse->save(); + + $this->wiki->delete(); + $this->assertThrows(function () { + $this->wiki->forceDelete(); + }, QueryException::class); + } +}