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