Skip to content

Commit 4e14cb6

Browse files
committed
KnowledgeEquityResponse Model and Migration
Adds a Model, Migration and some happy path tests. n.b. this uses the laravel Blueprint[1] rather than manually defining tables and columns. [1] https://laravel.com/docs/10.x/migrations Bug: T419209
1 parent a89378e commit 4e14cb6

File tree

3 files changed

+136
-0
lines changed

3 files changed

+136
-0
lines changed

app/KnowledgeEquityResponse.php

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
<?php
2+
3+
namespace App;
4+
5+
use Illuminate\Database\Eloquent\Factories\HasFactory;
6+
use Illuminate\Database\Eloquent\Model;
7+
use Illuminate\Database\Eloquent\Relations\BelongsTo;
8+
9+
class KnowledgeEquityResponse extends Model {
10+
use HasFactory;
11+
12+
protected $fillable = [
13+
'wiki_id',
14+
'selectedOption',
15+
'freeTextResponse',
16+
];
17+
18+
public function wiki(): BelongsTo {
19+
return $this->belongsTo(Wiki::class);
20+
}
21+
}
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
<?php
2+
3+
use Illuminate\Database\Migrations\Migration;
4+
use Illuminate\Database\Schema\Blueprint;
5+
use Illuminate\Support\Facades\Schema;
6+
7+
return new class extends Migration {
8+
/**
9+
* Run the migrations.
10+
*/
11+
public function up(): void {
12+
Schema::create('knowledge_equity_responses', function (Blueprint $table) {
13+
$table->id();
14+
$table->timestamps();
15+
$table->unsignedInteger('wiki_id');
16+
$table
17+
->foreign('wiki_id')
18+
->references('id')
19+
->on('wikis')
20+
// Explicitly use the eloquent default options.
21+
// restrict rather than cascading chosen to not result in unexpectedly deleting Knowledge Equity Responses when we delete a wiki
22+
->restrictOnDelete()
23+
->restrictOnUpdate();
24+
$table->enum('selectedOption', ['yes', 'no', 'unsure', 'unsaid']);
25+
$table->string('freeTextResponse', 3000)->nullable();
26+
});
27+
}
28+
29+
/**
30+
* Reverse the migrations.
31+
*/
32+
public function down(): void {
33+
Schema::dropIfExists('knowledge_equity_responses');
34+
}
35+
};
Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
<?php
2+
3+
namespace Tests;
4+
5+
use App\KnowledgeEquityResponse;
6+
use App\Wiki;
7+
use Illuminate\Database\QueryException;
8+
use Illuminate\Foundation\Testing\RefreshDatabase;
9+
use Str;
10+
11+
class KnowledgeEquityResponseTest extends TestCase {
12+
use RefreshDatabase;
13+
14+
protected Wiki $wiki;
15+
16+
protected function setUp(): void {
17+
parent::setUp();
18+
$this->wiki = Wiki::factory()->create();
19+
}
20+
21+
public function testCreateValidKnowledgeEquityResponse(): void {
22+
$knowledgeEquityResponse = new KnowledgeEquityResponse([
23+
'wiki_id' => $this->wiki->id,
24+
'selectedOption' => 'yes',
25+
'freeTextResponse' => 'Because it just does',
26+
]);
27+
28+
$knowledgeEquityResponse->save();
29+
30+
$this->assertDatabaseHas('knowledge_equity_responses', [
31+
'wiki_id' => $this->wiki->id,
32+
'selectedOption' => 'yes',
33+
'freeTextResponse' => 'Because it just does',
34+
]);
35+
}
36+
37+
public function testCreateValidKnowledgeEquityResponseNoFreeText(): void {
38+
$knowledgeEquityResponse = new KnowledgeEquityResponse([
39+
'wiki_id' => $this->wiki->id,
40+
'selectedOption' => 'yes',
41+
]);
42+
43+
$knowledgeEquityResponse->save();
44+
45+
$this->assertDatabaseHas('knowledge_equity_responses', [
46+
'wiki_id' => $this->wiki->id,
47+
'selectedOption' => 'yes',
48+
]);
49+
}
50+
51+
public function testCreateValidKnowledgeEquityResponse3000CharFreeText(): void {
52+
$longFreeText = Str::random(3000);
53+
$knowledgeEquityResponse = new KnowledgeEquityResponse([
54+
'wiki_id' => $this->wiki->id,
55+
'selectedOption' => 'yes',
56+
'freeTextResponse' => $longFreeText,
57+
]);
58+
59+
$knowledgeEquityResponse->save();
60+
61+
$this->assertDatabaseHas('knowledge_equity_responses', [
62+
'wiki_id' => $this->wiki->id,
63+
'selectedOption' => 'yes',
64+
]);
65+
}
66+
67+
public function testDeleteValidKnowledgeEquityResponsePreventsWikiDeletion(): void {
68+
$knowledgeEquityResponse = new KnowledgeEquityResponse([
69+
'wiki_id' => $this->wiki->id,
70+
'selectedOption' => 'yes',
71+
]);
72+
73+
$knowledgeEquityResponse->save();
74+
75+
$this->wiki->delete();
76+
$this->assertThrows(function () {
77+
$this->wiki->forceDelete();
78+
}, QueryException::class);
79+
}
80+
}

0 commit comments

Comments
 (0)