|
| 1 | +require 'spec_helper' |
| 2 | +require File.expand_path(File.join(File.dirname(__FILE__), '..', 'manifest_shared_examples.rb')) |
| 3 | + |
| 4 | +describe 'sqlserver::user::permission' do |
| 5 | + let(:facts) { {:osfamily => 'windows'} } |
| 6 | + context 'validation errors' do |
| 7 | + include_context 'manifests' do |
| 8 | + let(:title) { 'myTitle' } |
| 9 | + let(:sqlserver_tsql_title) { 'user-permissions-MSSQLSERVER-loggingDb-loggingUser-GRANT-SELECT' } |
| 10 | + end |
| 11 | + context 'user =>' do |
| 12 | + let(:params) { { |
| 13 | + :permission => 'SELECT', |
| 14 | + :database => 'loggingDb', |
| 15 | + } } |
| 16 | + let(:raise_error_check) { 'User must be between 1 and 128 characters' } |
| 17 | + describe 'missing' do |
| 18 | + let(:raise_error_check) { 'Must pass user to Sqlserver::User::Permission[myTitle]' } |
| 19 | + it_behaves_like 'validation error' |
| 20 | + end |
| 21 | + describe 'empty' do |
| 22 | + let(:additional_params) { {:user => ''} } |
| 23 | + it_behaves_like 'validation error' |
| 24 | + end |
| 25 | + describe 'over limit' do |
| 26 | + let(:additional_params) { {:user => random_string_of_size(129)} } |
| 27 | + end |
| 28 | + end |
| 29 | + context 'permission' do |
| 30 | + let(:params) { { |
| 31 | + :user => 'loggingUser', |
| 32 | + :database => 'loggingDb', |
| 33 | + } } |
| 34 | + let(:raise_error_check) { 'Permission must be between 4 and 128 characters' } |
| 35 | + describe 'empty' do |
| 36 | + let(:additional_params) { {:permission => ''} } |
| 37 | + it_behaves_like 'validation error' |
| 38 | + end |
| 39 | + describe 'under limit' do |
| 40 | + let(:additional_params) { {:permission => random_string_of_size(3, false)} } |
| 41 | + it_behaves_like 'validation error' |
| 42 | + end |
| 43 | + describe 'over limit' do |
| 44 | + let(:additional_params) { {:permission => random_string_of_size(129, false)} } |
| 45 | + it_behaves_like 'validation error' |
| 46 | + end |
| 47 | + end |
| 48 | + context 'state =>' do |
| 49 | + let(:params) { { |
| 50 | + :permission => 'SELECT', |
| 51 | + :database => 'loggingDb', |
| 52 | + :user => 'loggingUser' |
| 53 | + } } |
| 54 | + describe 'invalid' do |
| 55 | + let(:additional_params) { {:state => 'invalide'} } |
| 56 | + let(:raise_error_check) { "State can only be of 'GRANT', 'REVOKE' or 'DENY' you passed invalide" } |
| 57 | + it_behaves_like 'validation error' |
| 58 | + end |
| 59 | + end |
| 60 | + end |
| 61 | + context 'successfully' do |
| 62 | + include_context 'manifests' do |
| 63 | + let(:title) { 'myTitle' } |
| 64 | + let(:sqlserver_tsql_title) { 'user-permissions-MSSQLSERVER-loggingDb-loggingUser-GRANT-SELECT' } |
| 65 | + let(:params) { { |
| 66 | + :user => 'loggingUser', |
| 67 | + :permission => 'SELECT', |
| 68 | + :database => 'loggingDb', |
| 69 | + } } |
| 70 | + end |
| 71 | + %w(revoke grant deny).each do |state| |
| 72 | + context "state => '#{state}'" do |
| 73 | + let(:sqlserver_tsql_title) { "user-permissions-MSSQLSERVER-loggingDb-loggingUser-#{state.upcase}-SELECT" } |
| 74 | + let(:should_contain_command) { ["#{state.upcase} SELECT TO [loggingUser];", 'USE [loggingDb];'] } |
| 75 | + describe "lowercase #{state}" do |
| 76 | + let(:additional_params) { {:state => state} } |
| 77 | + it_behaves_like 'sqlserver_tsql command' |
| 78 | + end |
| 79 | + state.capitalize! |
| 80 | + describe "capitalized #{state}" do |
| 81 | + let(:additional_params) { {:state => state} } |
| 82 | + it_behaves_like 'sqlserver_tsql command' |
| 83 | + end |
| 84 | + end |
| 85 | + end |
| 86 | + |
| 87 | + context 'permission' do |
| 88 | + describe 'upper limit' do |
| 89 | + permission =random_string_of_size(128, false) |
| 90 | + let(:additional_params) { {:permission => permission} } |
| 91 | + let(:sqlserver_tsql_title) { "user-permissions-MSSQLSERVER-loggingDb-loggingUser-GRANT-#{permission.upcase}" } |
| 92 | + let(:should_contain_command) { ['USE [loggingDb];'] } |
| 93 | + it_behaves_like 'sqlserver_tsql command' |
| 94 | + end |
| 95 | + describe 'alter' do |
| 96 | + let(:additional_params) { {:permission => 'ALTER'} } |
| 97 | + let(:should_contain_command) { ['USE [loggingDb];', 'GRANT ALTER TO [loggingUser];'] } |
| 98 | + let(:sqlserver_tsql_title) { "user-permissions-MSSQLSERVER-loggingDb-loggingUser-GRANT-ALTER" } |
| 99 | + it_behaves_like 'sqlserver_tsql command' |
| 100 | + end |
| 101 | + end |
| 102 | + |
| 103 | + describe 'Minimal Params' do |
| 104 | + let(:pre_condition) { <<-EOF |
| 105 | + define sqlserver::config{} |
| 106 | + sqlserver::config {'MSSQLSERVER': } |
| 107 | + EOF |
| 108 | + } |
| 109 | + let(:should_contain_command) { ['USE [loggingDb];'] } |
| 110 | + it_behaves_like 'compile' |
| 111 | + end |
| 112 | + |
| 113 | + end |
| 114 | + |
| 115 | + context 'command syntax' do |
| 116 | + include_context 'manifests' do |
| 117 | + let(:title) { 'myTitle' } |
| 118 | + let(:sqlserver_tsql_title) { 'user-permissions-MSSQLSERVER-loggingDb-loggingUser-GRANT-SELECT' } |
| 119 | + let(:params) { { |
| 120 | + :user => 'loggingUser', |
| 121 | + :permission => 'SELECT', |
| 122 | + :database => 'loggingDb', |
| 123 | + } } |
| 124 | + describe '' do |
| 125 | + let(:should_contain_command) { [ |
| 126 | + 'USE [loggingDb];', |
| 127 | + 'GRANT SELECT TO [loggingUser];', |
| 128 | + /DECLARE @perm_state varchar\(250\)/, |
| 129 | + /SET @perm_state = ISNULL\(\n\s+\(SELECT perm.state_desc FROM sys\.database_principals princ\n\s+JOIN sys\./, |
| 130 | + /JOIN sys\.database_permissions perm ON perm\.grantee_principal_id = princ.principal_id\n\s+WHERE/, |
| 131 | + /WHERE princ\.type in \('U','S','G'\) AND name = 'loggingUser' AND permission_name = 'SELECT' \),\n\s+'REVOKE'\);/, |
| 132 | + /DECLARE @error_msg varchar\(250\);\nSET @error_msg = 'EXPECTED user \[loggingUser\] to have permission \[SELECT\] with GRANT but got ' \+ @perm_state;/, |
| 133 | + /IF @perm_state != 'GRANT'\n\s+THROW 51000, @error_msg, 10/ |
| 134 | + ] } |
| 135 | + it_behaves_like 'sqlserver_tsql command' |
| 136 | + end |
| 137 | + end |
| 138 | + end |
| 139 | + |
| 140 | +end |
0 commit comments