1Code.require_file "../../../installer/test/mix_helper.exs", __DIR__
2
3defmodule Phoenix.DupHTMLController do
4end
5
6defmodule Phoenix.DupHTMLView do
7end
8
9defmodule Mix.Tasks.Phoenix.Gen.HtmlTest do
10  use ExUnit.Case
11  import ExUnit.CaptureIO
12  import MixHelper
13
14  setup do
15    Mix.Task.clear()
16    :ok
17  end
18
19  test "generates html resource" do
20    in_tmp "deprecated: generates html resource", fn ->
21      capture_io(:stderr, fn ->
22        Mix.Tasks.Phoenix.Gen.Html.run ["user", "users", "name", "age:integer", "height:decimal",
23                                        "nicks:array:text", "famous:boolean", "born_at:naive_datetime",
24                                        "secret:uuid", "first_login:date", "alarm:time",
25                                        "address_id:references:addresses"]
26      end)
27      assert_file "web/models/user.ex"
28      assert_file "test/models/user_test.exs"
29      assert [_] = Path.wildcard("priv/repo/migrations/*_create_user.exs")
30
31      assert_file "web/controllers/user_controller.ex", fn file ->
32        assert file =~ "defmodule Phoenix.UserController"
33        assert file =~ "use Phoenix.Web, :controller"
34        assert file =~ "Repo.get!"
35      end
36
37      assert_file "web/views/user_view.ex", fn file ->
38        assert file =~ "defmodule Phoenix.UserView do"
39        assert file =~ "use Phoenix.Web, :view"
40      end
41
42      assert_file "web/templates/user/edit.html.eex", fn file ->
43        assert file =~ "action: user_path(@conn, :update, @user)"
44      end
45
46      assert_file "web/templates/user/form.html.eex", fn file ->
47        assert file =~ ~s(<%= text_input f, :name, class: "form-control" %>)
48        assert file =~ ~s(<%= number_input f, :age, class: "form-control" %>)
49        assert file =~ ~s(<%= number_input f, :height, step: "any", class: "form-control" %>)
50        assert file =~ ~s(<%= checkbox f, :famous, class: "checkbox" %>)
51        assert file =~ ~s(<%= datetime_select f, :born_at, class: "form-control" %>)
52        assert file =~ ~s(<%= text_input f, :secret, class: "form-control" %>)
53        assert file =~ ~s(<%= label f, :name, class: "control-label" %>)
54        assert file =~ ~s(<%= label f, :age, class: "control-label" %>)
55        assert file =~ ~s(<%= label f, :height, class: "control-label" %>)
56        assert file =~ ~s(<%= label f, :famous, class: "control-label" %>)
57        assert file =~ ~s(<%= label f, :born_at, class: "control-label" %>)
58        assert file =~ ~s(<%= label f, :secret, class: "control-label" %>)
59
60        refute file =~ ~s(<%= label f, :address_id)
61        refute file =~ ~s(<%= number_input f, :address_id)
62        refute file =~ ":nicks"
63      end
64
65      assert_file "web/templates/user/index.html.eex", fn file ->
66        assert file =~ "<th>Name</th>"
67        assert file =~ "<%= for user <- @users do %>"
68        assert file =~ "<td><%= user.name %></td>"
69      end
70
71      assert_file "web/templates/user/new.html.eex", fn file ->
72        assert file =~ "action: user_path(@conn, :create)"
73      end
74
75      assert_file "web/templates/user/show.html.eex", fn file ->
76        assert file =~ "<strong>Name:</strong>"
77        assert file =~ "<%= @user.name %>"
78      end
79
80      assert_file "test/controllers/user_controller_test.exs", fn file ->
81        assert file =~ "defmodule Phoenix.UserControllerTest"
82        assert file =~ "use Phoenix.ConnCase"
83
84        assert file =~ ~S|@valid_attrs %{age: 42|
85        assert file =~ ~S|@invalid_attrs %{}|
86        refute file =~ ~S|address_id: nil|
87
88        assert file =~ ~S|test "lists all entries on index"|
89        assert file =~ ~S|conn = get conn, user_path(conn, :index)|
90        assert file =~ ~S|assert html_response(conn, 200) =~ "Listing users"|
91
92        assert file =~ ~S|test "renders form for new resources"|
93        assert file =~ ~S|conn = get conn, user_path(conn, :new)|
94        assert file =~ ~S|assert html_response(conn, 200) =~ "New user"|
95
96        assert file =~ ~S|test "creates resource and redirects when data is valid"|
97        assert file =~ ~S|conn = post conn, user_path(conn, :create), user: @valid_attrs|
98        assert file =~ ~S|assert redirected_to(conn) == user_path(conn, :index)|
99        assert file =~ ~r/creates.*when data is valid.*?assert Repo\.get_by\(User, @valid_attrs\).*?end/s
100
101        assert file =~ ~S|test "does not create resource and renders errors when data is invalid"|
102        assert file =~ ~S|conn = post conn, user_path(conn, :create), user: @invalid_attrs|
103
104        assert file =~ ~S|test "shows chosen resource"|
105        assert file =~ ~S|user = Repo.insert! %User{}|
106        assert file =~ ~S|assert html_response(conn, 200) =~ "Show user"|
107
108        assert file =~ ~S|test "renders form for editing chosen resource"|
109        assert file =~ ~S|assert html_response(conn, 200) =~ "Edit user"|
110
111        assert file =~ ~S|test "updates chosen resource and redirects when data is valid"|
112        assert file =~ ~S|conn = put conn, user_path(conn, :update, user), user: @valid_attrs|
113        assert file =~ ~r/updates.*when data is valid.*?assert Repo\.get_by\(User, @valid_attrs\).*?end/s
114
115        assert file =~ ~S|test "does not update chosen resource and renders errors when data is invalid"|
116        assert file =~ ~S|conn = put conn, user_path(conn, :update, user), user: @invalid_attrs|
117
118        assert file =~ ~S|test "deletes chosen resource"|
119        assert file =~ ~S|conn = delete conn, user_path(conn, :delete, user)|
120
121        assert file =~ ~S|test "renders page not found when id is nonexistent"|
122        assert file =~ ~S|user_path(conn, :show, -1)|
123      end
124
125      assert_received {:mix_shell, :info, ["\nAdd the resource" <> _ = message]}
126      assert message =~ ~s(resources "/users", UserController)
127    end
128  end
129
130  test "generates nested resource" do
131    in_tmp "deprecated: generates nested resource", fn ->
132      capture_io(:stderr, fn ->
133        Mix.Tasks.Phoenix.Gen.Html.run ["Admin.SuperUser", "super_users", "name:string"]
134      end)
135
136      assert_file "web/models/admin/super_user.ex"
137      assert [_] = Path.wildcard("priv/repo/migrations/*_create_admin_super_user.exs")
138
139      assert_file "web/controllers/admin/super_user_controller.ex", fn file ->
140        assert file =~ "defmodule Phoenix.Admin.SuperUserController"
141        assert file =~ "use Phoenix.Web, :controller"
142        assert file =~ "Repo.get!"
143      end
144
145      assert_file "web/views/admin/super_user_view.ex", fn file ->
146        assert file =~ "defmodule Phoenix.Admin.SuperUserView do"
147        assert file =~ "use Phoenix.Web, :view"
148      end
149
150      assert_file "web/templates/admin/super_user/edit.html.eex", fn file ->
151        assert file =~ "<h2>Edit super user</h2>"
152        assert file =~ "action: super_user_path(@conn, :update, @super_user)"
153      end
154
155      assert_file "web/templates/admin/super_user/form.html.eex", fn file ->
156        assert file =~ ~s(<%= text_input f, :name, class: "form-control" %>)
157      end
158
159      assert_file "web/templates/admin/super_user/index.html.eex", fn file ->
160        assert file =~ "<h2>Listing super users</h2>"
161        assert file =~ "<th>Name</th>"
162        assert file =~ "<%= for super_user <- @super_users do %>"
163      end
164
165      assert_file "web/templates/admin/super_user/new.html.eex", fn file ->
166        assert file =~ "<h2>New super user</h2>"
167        assert file =~ "action: super_user_path(@conn, :create)"
168      end
169
170      assert_file "web/templates/admin/super_user/show.html.eex", fn file ->
171        assert file =~ "<h2>Show super user</h2>"
172        assert file =~ "<strong>Name:</strong>"
173        assert file =~ "<%= @super_user.name %>"
174      end
175
176      assert_file "test/controllers/admin/super_user_controller_test.exs", fn file ->
177        assert file =~ ~S|assert html_response(conn, 200) =~ "Listing super users"|
178        assert file =~ ~S|assert html_response(conn, 200) =~ "New super user"|
179        assert file =~ ~S|assert html_response(conn, 200) =~ "Show super user"|
180        assert file =~ ~S|assert html_response(conn, 200) =~ "Edit super user"|
181      end
182
183      assert_received {:mix_shell, :info, ["\nAdd the resource" <> _ = message]}
184      assert message =~ ~s(resources "/admin/super_users", Admin.SuperUserController)
185    end
186  end
187
188  test "generates html resource without model" do
189    in_tmp "deprecated: generates html resource without model", fn ->
190      capture_io(:stderr, fn ->
191        Mix.Tasks.Phoenix.Gen.Html.run ["Admin.User", "users", "--no-model", "name:string"]
192      end)
193
194      refute File.exists? "web/models/admin/user.ex"
195      assert [] = Path.wildcard("priv/repo/migrations/*_create_admin_user.exs")
196
197      assert_file "web/templates/admin/user/form.html.eex", fn file ->
198        refute file =~ ~s(--no-model)
199      end
200    end
201  end
202
203  test "with binary_id properly generates controller test" do
204    in_tmp "deprecated: with binary_id properly generates controller test", fn ->
205      with_generator_env [binary_id: true, sample_binary_id: "abcd"], fn ->
206        capture_io(:stderr, fn ->
207          Mix.Tasks.Phoenix.Gen.Html.run ["User", "users"]
208        end)
209
210        assert_file "test/controllers/user_controller_test.exs", fn file ->
211          assert file =~ ~S|user_path(conn, :show, "abcd")|
212        end
213      end
214
215      with_generator_env [binary_id: true], fn ->
216        capture_io(:stderr, fn ->
217          Mix.Tasks.Phoenix.Gen.Html.run ["Post", "posts"]
218        end)
219
220        assert_file "test/controllers/post_controller_test.exs", fn file ->
221          assert file =~ ~S|post_path(conn, :show, "11111111-1111-1111-1111-111111111111")|
222        end
223      end
224    end
225  end
226
227  test "plural can't contain a colon" do
228    assert_raise Mix.Error, fn ->
229      capture_io(:stderr, fn ->
230        Mix.Tasks.Phoenix.Gen.Html.run ["Admin.User", "name:string", "foo:string"]
231      end)
232    end
233  end
234
235  test "plural can't have uppercased characters or camelized format" do
236    assert_raise Mix.Error, fn ->
237      capture_io(:stderr, fn ->
238        Mix.Tasks.Phoenix.Gen.Html.run ["Admin.User", "Users", "foo:string"]
239      end)
240    end
241
242    assert_raise Mix.Error, fn ->
243      capture_io(:stderr, fn ->
244        Mix.Tasks.Phoenix.Gen.Html.run ["Admin.User", "AdminUsers", "foo:string"]
245      end)
246    end
247  end
248
249  test "name is already defined" do
250    assert_raise Mix.Error, fn ->
251      capture_io(:stderr, fn ->
252        Mix.Tasks.Phoenix.Gen.Html.run ["DupHTML", "duphtmls"]
253      end)
254    end
255  end
256end
257