-
Notifications
You must be signed in to change notification settings - Fork 311
/
CreateThreadsTest.php
144 lines (103 loc) · 3.72 KB
/
CreateThreadsTest.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
<?php
namespace Tests\Feature;
use App\Activity;
use Illuminate\Foundation\Testing\DatabaseMigrations;
use Tests\TestCase;
class CreateThreadsTest extends TestCase
{
use DatabaseMigrations;
/** @test */
function guests_may_not_create_threads()
{
$this->withExceptionHandling();
$this->get('/threads/create')
->assertRedirect(route('login'));
$this->post(route('threads'))
->assertRedirect(route('login'));
}
/** @test */
function new_users_must_first_confirm_their_email_address_before_creating_threads()
{
$user = factory('App\User')->states('unconfirmed')->create();
$this->signIn($user);
$thread = make('App\Thread');
$this->post(route('threads'), $thread->toArray())
->assertRedirect(route('threads'))
->assertSessionHas('flash', 'You must first confirm your email address.');
}
/** @test */
function a_user_can_create_new_forum_threads()
{
$this->signIn();
$thread = make('App\Thread');
$response = $this->post('/threads', $thread->toArray());
$this->get($response->headers->get('Location'))
->assertSee($thread->title)
->assertSee($thread->body);
}
/** @test */
function a_thread_requires_a_title()
{
$this->publishThread(['title' => null])
->assertSessionHasErrors('title');
}
/** @test */
function a_thread_requires_a_body()
{
$this->publishThread(['body' => null])
->assertSessionHasErrors('body');
}
/** @test */
function a_thread_requires_a_valid_channel()
{
factory('App\Channel', 2)->create();
$this->publishThread(['channel_id' => null])
->assertSessionHasErrors('channel_id');
$this->publishThread(['channel_id' => 999])
->assertSessionHasErrors('channel_id');
}
/** @test */
function a_thread_requires_a_unique_slug()
{
$this->signIn();
$thread = create('App\Thread', ['title' => 'Foo Title']);
$this->assertEquals($thread->slug, 'foo-title');
$thread = $this->postJson(route('threads'), $thread->toArray())->json();
$this->assertEquals("foo-title-{$thread['id']}", $thread['slug']);
}
/** @test */
function a_thread_with_a_title_that_ends_in_a_number_should_generate_the_proper_slug()
{
$this->signIn();
$thread = create('App\Thread', ['title' => 'Some Title 24']);
$thread = $this->postJson(route('threads'), $thread->toArray())->json();
$this->assertEquals("some-title-24-{$thread['id']}", $thread['slug']);
}
/** @test */
function unauthorized_users_may_not_delete_threads()
{
$this->withExceptionHandling();
$thread = create('App\Thread');
$this->delete($thread->path())->assertRedirect('/login');
$this->signIn();
$this->delete($thread->path())->assertStatus(403);
}
/** @test */
function authorized_users_can_delete_threads()
{
$this->signIn();
$thread = create('App\Thread', ['user_id' => auth()->id()]);
$reply = create('App\Reply', ['thread_id' => $thread->id]);
$response = $this->json('DELETE', $thread->path());
$response->assertStatus(204);
$this->assertDatabaseMissing('threads', ['id' => $thread->id]);
$this->assertDatabaseMissing('replies', ['id' => $reply->id]);
$this->assertEquals(0, Activity::count());
}
protected function publishThread($overrides = [])
{
$this->withExceptionHandling()->signIn();
$thread = make('App\Thread', $overrides);
return $this->post(route('threads'), $thread->toArray());
}
}