diff --git a/oc-chef-pedant/spec/api/user_spec.rb b/oc-chef-pedant/spec/api/user_spec.rb index fb73b54a92..b4eab6223f 100644 --- a/oc-chef-pedant/spec/api/user_spec.rb +++ b/oc-chef-pedant/spec/api/user_spec.rb @@ -415,6 +415,83 @@ end end + context "with a blank middle name" do + let(:request_body) do + { + "username" => username, + "email" => "#{username}@chef.io", + "display_name" => username, + "password" => "badger badger", + "first_name" => username, + "last_name" => username, + "middle_name" => "", + } + end + + it "can create new user" do + post(request_url, platform.superuser, + :payload => request_body).should look_like({ + :status => 201, + :body_exact => response_body + }) + get(request_url, platform.superuser).should look_like({ + :status => 200, + :body => users_with_new_user + }) + end + end + + context "with a blank first name" do + let(:request_body) do + { + "username" => username, + "email" => "#{username}@chef.io", + "display_name" => username, + "password" => "badger badger", + "first_name" => "", + "last_name" => username, + "middle_name" => username, + } + end + + it "can create new user" do + post(request_url, platform.superuser, + :payload => request_body).should look_like({ + :status => 201, + :body_exact => response_body + }) + get(request_url, platform.superuser).should look_like({ + :status => 200, + :body => users_with_new_user + }) + end + end + + context "with a blank last name" do + let(:request_body) do + { + "username" => username, + "email" => "#{username}@chef.io", + "display_name" => username, + "password" => "badger badger", + "first_name" => username, + "last_name" => "", + "middle_name" => username, + } + end + + it "can create new user" do + post(request_url, platform.superuser, + :payload => request_body).should look_like({ + :status => 201, + :body_exact => response_body + }) + get(request_url, platform.superuser).should look_like({ + :status => 200, + :body => users_with_new_user + }) + end + end context "without email" do let(:request_body) do { diff --git a/src/oc_erchef/apps/chef_objects/src/chef_regex.erl b/src/oc_erchef/apps/chef_objects/src/chef_regex.erl index a9e43642ae..8a235ee196 100644 --- a/src/oc_erchef/apps/chef_objects/src/chef_regex.erl +++ b/src/oc_erchef/apps/chef_objects/src/chef_regex.erl @@ -72,7 +72,10 @@ -define(USERNAME_REGEX, "[a-z0-9\-_]+"). %% Validation regex for various names --define(HUMAN_NAME_REGEX, "[[:word:][:digit:]!'. -]+"). +-define(REQUIRED_NAME_REGEX, "[[:word:][:digit:]!'. -]+"). + +%% Validation regex for various names that can be empty. +-define(OPTIONAL_NAME_REGEX, "[[:word:][:digit:]!'. -]*"). %% Non-blank string regex -define(NON_BLANK_REGEX, ".+"). @@ -171,16 +174,16 @@ regex_for(user_name) -> generate_regex_msg_tuple(?ANCHOR_REGEX(?USERNAME_REGEX), <<"Malformed user name. Must only contain a-z, 0-9, _, or -">>); regex_for(first_name) -> - generate_regex_msg_tuple(?ANCHOR_REGEX(?HUMAN_NAME_REGEX), + generate_regex_msg_tuple(?ANCHOR_REGEX(?OPTIONAL_NAME_REGEX), <<"Denied first_name. Must only contain word characters, digits, ', or .">>, [unicode, ucp]); regex_for(middle_name) -> - generate_regex_msg_tuple(?ANCHOR_REGEX(?HUMAN_NAME_REGEX), + generate_regex_msg_tuple(?ANCHOR_REGEX(?OPTIONAL_NAME_REGEX), <<"Denied middle_name. Must only contain word characters, digits, ', or .">>, [unicode, ucp]); regex_for(last_name) -> - generate_regex_msg_tuple(?ANCHOR_REGEX(?HUMAN_NAME_REGEX), + generate_regex_msg_tuple(?ANCHOR_REGEX(?OPTIONAL_NAME_REGEX), <<"Denied last_name. Must only contain word characters, digits, ', or .">>, [unicode, ucp]); regex_for(display_name) -> - generate_regex_msg_tuple(?ANCHOR_REGEX(?HUMAN_NAME_REGEX), + generate_regex_msg_tuple(?ANCHOR_REGEX(?REQUIRED_NAME_REGEX), <<"Denied display_name. Must only contain word characters, digits, ', or .">>, [unicode, ucp]); regex_for(non_blank_string) -> generate_regex_msg_tuple(?ANCHOR_REGEX(?NON_BLANK_REGEX), <<"Field must have a non-empty string value">>); diff --git a/src/oc_erchef/apps/chef_objects/test/chef_user_tests.erl b/src/oc_erchef/apps/chef_objects/test/chef_user_tests.erl index 5a0efdf0b5..85bb671375 100644 --- a/src/oc_erchef/apps/chef_objects/test/chef_user_tests.erl +++ b/src/oc_erchef/apps/chef_objects/test/chef_user_tests.erl @@ -180,6 +180,46 @@ parse_binary_json_tests(Version) -> ?assertEqual(lists:sort(MinValid), lists:sort(GotData)) end }, + {?VD("Can create user with empty first name"), + fun() -> + UserEJson = make_min_valid_create_user_ejson() ++ [{<<"first_name">>, <<>>}, + {<<"last_name">>, <<"Bobson">>}, + {<<"middle_name">>, <<"Joe">>}], + UserJson = chef_json:encode({UserEJson}), + {ok, {GotData}} = chef_user:parse_binary_json(Version, UserJson, create, undefined), + ?assertEqual(lists:sort(UserEJson), lists:sort(GotData)) + end + }, + {?VD("Can create user with empty last name"), + fun() -> + UserEJson = make_min_valid_create_user_ejson() ++ [{<<"first_name">>, <<"Alice">>}, + {<<"last_name">>, <<>>}, + {<<"middle_name">>, <<"Joe">>}], + UserJson = chef_json:encode({UserEJson}), + {ok, {GotData}} = chef_user:parse_binary_json(Version, UserJson, create, undefined), + ?assertEqual(lists:sort(UserEJson), lists:sort(GotData)) + end + }, + {?VD("Can create user with empty middle name"), + fun() -> + UserEJson = make_min_valid_create_user_ejson() ++ [{<<"first_name">>, <<"Alice">>}, + {<<"last_name">>, <<"Bobson">>}, + {<<"middle_name">>, <<>>}], + UserJson = chef_json:encode({UserEJson}), + {ok, {GotData}} = chef_user:parse_binary_json(Version, UserJson, create, undefined), + ?assertEqual(lists:sort(UserEJson), lists:sort(GotData)) + end + }, + {?VD("Can create user with all required fields and first, middle, and last names"), + fun() -> + UserEJson = make_min_valid_create_user_ejson() ++ [{<<"first_name">>, <<"Alice">>}, + {<<"last_name">>, <<"Bobson">>}, + {<<"middle_name">>, <<"Joe">>}], + UserJson = chef_json:encode({UserEJson}), + {ok, {GotData}} = chef_user:parse_binary_json(Version, UserJson, create, undefined), + ?assertEqual(lists:sort(UserEJson), lists:sort(GotData)) + end + }, {?VD("Can create user when external auth uid is present"), fun() -> MinValid = make_external_auth_create_user_ejson(),