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