Completed
Pull Request — master (#4037)
by Muhlis
02:38
created

UserFormTest::testSubmitForm()   B

Complexity

Conditions 1
Paths 1

Size

Total Lines 61

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
nc 1
nop 0
dl 0
loc 61
rs 8.8509
c 0
b 0
f 0

How to fix   Long Method   

Long Method

Small methods make your code easier to understand, in particular if combined with a good name. Besides, if your method is small, finding a good name is usually much easier.

For example, if you find yourself adding comments to a method's body, this is usually a good sign to extract the commented part to a new method, and use the comment as a starting point when coming up with a good name for this new method.

Commonly applied refactorings include:

1
<?php
2
3
use Encore\Admin\Auth\Database\Administrator;
4
use Tests\Models\User as UserModel;
5
6
class UserFormTest extends TestCase
7
{
8
    public function setUp()
9
    {
10
        parent::setUp();
11
12
        $this->be(Administrator::first(), 'admin');
13
    }
14
15
    public function testCreatePage()
16
    {
17
        $this->visit('admin/users/create')
18
            ->seeElement('input[type=text][name=username]')
19
            ->seeElement('input[type=email][name=email]')
20
            ->seeElement('input[type=text][name=mobile]')
21
            ->seeElement('input[type=file][name=avatar]')
22
            ->seeElement('hr')
23
            ->seeElement("input[type=text][name='profile[first_name]']")
24
            ->seeElement("input[type=text][name='profile[last_name]']")
25
            ->seeElement("input[type=text][name='profile[postcode]']")
26
            ->seeElement("textarea[name='profile[address]'][rows=15]")
27
            ->seeElement("input[type=hidden][name='profile[latitude]']")
28
            ->seeElement("input[type=hidden][name='profile[longitude]']")
29
            ->seeElement("input[type=text][name='profile[color]']")
30
            ->seeElement("input[type=text][name='profile[start_at]']")
31
            ->seeElement("input[type=text][name='profile[end_at]']")
32
            ->seeElement('span[class=help-block] i[class*=fa-info-circle]')
33
            ->seeInElement('span[class=help-block]', 'Please input your postcode')
34
            ->seeElement('span[class=help-block] i[class*=fa-image]')
35
            ->seeInElement('span[class=help-block]', '上传头像')
36
            ->seeElement("select[name='tags[]'][multiple=multiple]")
37
            ->seeInElement('a[html-field]', 'html...');
38
    }
39
40
    public function testSubmitForm()
41
    {
42
        $data = [
43
            'username'              => 'John Doe',
44
            'email'                 => '[email protected]',
45
            'mobile'                => '13421234123',
46
            'password'              => '123456',
47
            'password_confirmation' => '123456',
48
            //"avatar"   => "test.jpg",
49
            'profile' => [
50
                'first_name' => 'John',
51
                'last_name'  => 'Doe',
52
                'postcode'   => '123456',
53
                'address'    => 'Jinshajiang RD',
54
                'latitude'   => '131.2123123456',
55
                'longitude'  => '21.342123456',
56
                'color'      => '#ffffff',
57
                'start_at'   => date('Y-m-d H:i:s', time()),
58
                'end_at'     => date('Y-m-d H:i:s', time()),
59
            ],
60
        ];
61
62
        $this->visit('admin/users/create')
63
            ->attach(__DIR__.'/assets/test.jpg', 'avatar')
64
65
            ->submitForm('Submit', $data)
66
            ->seePageIs('admin/users')
67
            ->seeInElement('td', 1)
68
            ->seeInElement('td', $data['username'])
69
            ->seeInElement('td', $data['email'])
70
            ->seeInElement('td', $data['mobile'])
71
            ->seeInElement('td', "{$data['profile']['first_name']} {$data['profile']['last_name']}")
72
            ->seeElement('td img')
73
            ->seeInElement('td', $data['profile']['postcode'])
74
            ->seeInElement('td', $data['profile']['address'])
75
            ->seeInElement('td', "{$data['profile']['latitude']} {$data['profile']['longitude']}")
76
            ->seeInElement('td', $data['profile']['color'])
77
            ->seeInElement('td', $data['profile']['start_at'])
78
            ->seeInElement('td', $data['profile']['end_at']);
79
80
        $this->assertCount(1, UserModel::all());
81
82
        $this->seeInDatabase('test_users', ['username' => $data['username']]);
83
        $this->seeInDatabase('test_users', ['email' => $data['email']]);
84
        $this->seeInDatabase('test_users', ['mobile' => $data['mobile']]);
85
        $this->seeInDatabase('test_users', ['password' => $data['password']]);
86
87
        $this->seeInDatabase('test_user_profiles', ['first_name' => $data['profile']['first_name']]);
88
        $this->seeInDatabase('test_user_profiles', ['last_name' => $data['profile']['last_name']]);
89
        $this->seeInDatabase('test_user_profiles', ['postcode' => $data['profile']['postcode']]);
90
        $this->seeInDatabase('test_user_profiles', ['address' => $data['profile']['address']]);
91
        $this->seeInDatabase('test_user_profiles', ['latitude' => $data['profile']['latitude']]);
92
        $this->seeInDatabase('test_user_profiles', ['longitude' => $data['profile']['longitude']]);
93
        $this->seeInDatabase('test_user_profiles', ['color' => $data['profile']['color']]);
94
        $this->seeInDatabase('test_user_profiles', ['start_at' => $data['profile']['start_at']]);
95
        $this->seeInDatabase('test_user_profiles', ['end_at' => $data['profile']['end_at']]);
96
97
        $avatar = UserModel::first()->avatar;
98
99
        $this->assertFileExists(public_path('uploads/'.$avatar));
100
    }
101
102
    protected function seedsTable($count = 100)
103
    {
104
        factory(\Tests\Models\User::class, $count)
105
            ->create()
106
            ->each(function ($u) {
107
                $u->profile()->save(factory(\Tests\Models\Profile::class)->make());
108
                $u->tags()->saveMany(factory(\Tests\Models\Tag::class, 5)->make());
109
            });
110
    }
111
112
    public function testEditForm()
113
    {
114
        $this->seedsTable(10);
115
116
        $id = rand(1, 10);
117
118
        $user = UserModel::with('profile')->find($id);
119
120
        $this->visit("admin/users/$id/edit")
121
            ->seeElement("input[type=text][name=username][value='{$user->username}']")
122
            ->seeElement("input[type=email][name=email][value='{$user->email}']")
123
            ->seeElement("input[type=text][name=mobile][value='{$user->mobile}']")
124
            ->seeElement('hr')
125
            ->seeElement("input[type=text][name='profile[first_name]'][value='{$user->profile->first_name}']")
126
            ->seeElement("input[type=text][name='profile[last_name]'][value='{$user->profile->last_name}']")
127
            ->seeElement("input[type=text][name='profile[postcode]'][value='{$user->profile->postcode}']")
128
            ->seeInElement("textarea[name='profile[address]']", $user->profile->address)
129
            ->seeElement("input[type=hidden][name='profile[latitude]'][value='{$user->profile->latitude}']")
130
            ->seeElement("input[type=hidden][name='profile[longitude]'][value='{$user->profile->longitude}']")
131
            ->seeElement("input[type=text][name='profile[color]'][value='{$user->profile->color}']")
132
            ->seeElement("input[type=text][name='profile[start_at]'][value='{$user->profile->start_at}']")
133
            ->seeElement("input[type=text][name='profile[end_at]'][value='{$user->profile->end_at}']")
134
            ->seeElement("select[name='tags[]'][multiple=multiple]");
135
136
        $this->assertCount(50, $this->crawler()->filter("select[name='tags[]'] option"));
137
        $this->assertCount(5, $this->crawler()->filter("select[name='tags[]'] option[selected]"));
138
    }
139
140
    public function testUpdateForm()
141
    {
142
        $this->seedsTable(10);
143
144
        $id = rand(1, 10);
145
146
        $this->visit("admin/users/$id/edit")
147
            ->type('hello world', 'username')
148
            ->type('123', 'password')
149
            ->type('123', 'password_confirmation')
150
            ->press('Submit')
151
            ->seePageIs('admin/users')
152
            ->seeInDatabase('test_users', ['username' => 'hello world']);
153
154
        $user = UserModel::with('profile')->find($id);
155
156
        $this->assertEquals($user->username, 'hello world');
157
    }
158
159
    public function testUpdateFormWithRule()
160
    {
161
        $this->seedsTable(10);
162
163
        $id = rand(1, 10);
164
165
        $this->visit("admin/users/$id/edit")
166
            ->type('', 'email')
167
            ->press('Submit')
168
            ->seePageIs("admin/users/$id/edit")
169
            ->see('The email field is required');
170
171
        $this->type('xxaxx', 'email')
172
            ->press('Submit')
173
            ->seePageIs("admin/users/$id/edit")
174
            ->see('The email must be a valid email address.');
175
176
        $this->visit("admin/users/$id/edit")
177
            ->type('123', 'password')
178
            ->type('1234', 'password_confirmation')
179
            ->press('Submit')
180
            ->seePageIs("admin/users/$id/edit")
181
            ->see('The Password confirmation does not match.');
182
183
        $this->type('[email protected]', 'email')
184
            ->type('123', 'password')
185
            ->type('123', 'password_confirmation')
186
            ->press('Submit')
187
            ->seePageIs('admin/users')
188
            ->seeInDatabase('test_users', ['email' => '[email protected]']);
189
    }
190
191
    public function testFormHeader()
192
    {
193
        $this->seedsTable(1);
194
195
        $this->visit('admin/users/1/edit')
196
            ->seeInElement('a[class*=btn-danger]', 'Delete')
197
            ->seeInElement('a[class*=btn-default]', 'List')
198
            ->seeInElement('a[class*=btn-primary]', 'View');
199
    }
200
201
    public function testFormFooter()
202
    {
203
        $this->seedsTable(1);
204
205
        $this->visit('admin/users/1/edit')
206
            ->seeElement('input[type=checkbox][value=1]')
207
            ->seeElement('input[type=checkbox][value=2]');
208
    }
209
}
210