merged cont.
[opensuse:yast-rest-service.git] / webservice / test / plugin_basic_tests.rb
1 #--
2 # Webyast Webservice framework
3 #
4 # Copyright (C) 2009, 2010 Novell, Inc. 
5 #   This library is free software; you can redistribute it and/or modify
6 # it only under the terms of version 2.1 of the GNU Lesser General Public
7 # License as published by the Free Software Foundation. 
8 #
9 #   This library is distributed in the hope that it will be useful, but WITHOUT
10 # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
11 # FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more 
12 # details. 
13 #
14 #   You should have received a copy of the GNU Lesser General Public
15 # License along with this library; if not, write to the Free Software 
16 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
17 #++
18
19 # = PluginBasicTests module
20 # The module is designed to perform few basic tests of webservice plugin
21 # controller behavior. Its goal is provide same unify behavior to each
22 # webservice plugin like unified response if user doesn't have permissions
23 # or same content type.
24 # == Prerequisites
25 # The module expect some hints from controller test file for correct work.
26 # It needs model class specified at @*model_class* field, controller instance at
27 # @*controller* and request specification at @*request* field. Field @*data* is
28 # used to test update with valid data but without permissions.
29 # Controller is expected to be thin layer and all dbus or system call is done
30 # at model code. Controller use during reading only *find* metode of model
31 # and during writing only *save* method.
32 # == Example usage
33 # This example show basic testing of controller of plugin
34 #    require File.expand_path(File.dirname(__FILE__) + "/../test_helper")
35 #    require 'test/unit'
36 #    require 'mocha'
37 #    require File.expand_path( File.join("test","plugin_basic_tests"), RailsParent.parent )
38 #
39 #    class LanguageControllerTest < ActionController::TestCase
40 #      fixtures :accounts
41 #      
42 #        TEST_DATA = {:language => {
43 #      :current => "cs_CZ",
44 #      :utf8 => "true",
45 #      :rootlocale => "false"
46 #    }}
47 #      def setup
48 #        @model_class = Language
49 #        @controller = LanguageController.new
50 #        @request = ActionController::TestRequest.new
51 #        # http://railsforum.com/viewtopic.php?id=1719
52 #        @request.session[:account_id] = 1 # defined in fixtures
53 #        @data = TEST_DATA
54 #      end
55 #
56 #      include PluginBasicTests
57 #      #another specific controller test like correct parsing arguments
58 #      #or specific exceptions
59 #     end
60
61 # TODO use better names (aliased for compatibility),
62 # PluginBasicTests -> SingleResourceTests
63
64 module CommonResourceTests
65   # A parameter hash that contains :id => "test" for the collection tests
66   # and nothing for the singleton tests, so that routing works for both cases.
67   def just_id
68     raise NotImplementedError
69   end
70
71   def test_update_noparams
72     @model_class.stubs(:save)
73     put :update, just_id
74     assert_response 422
75   end
76
77   def test_update_noperm
78     #ensure that nothing is saved
79     @model_class.expects(:save).never
80
81     @controller.stubs(:permission_check).raises(NoPermissionException.new("action", "test"));
82
83     put :update, just_id.merge(@data || {})
84
85     assert_response  403 # Forbidden
86   end
87 end
88
89 module PluginBasicTests
90   include CommonResourceTests
91
92   def just_id
93     Hash.new                    # no :id
94   end
95
96   def test_access_denied
97     #mock model to test only controller
98     @model_class.stubs(:find)
99     @controller.stubs(:permission_check).raises(NoPermissionException.new("action", "test"));
100     get :show
101     assert_response 403 # Forbidden
102   end
103
104   def test_access_show_xml
105     mime = Mime::XML
106     get :show, :format => 'xml'
107     assert_equal mime.to_s, @response.content_type
108   end
109
110   def test_access_show_json
111     mime = Mime::JSON
112     get :show, :format => 'json'
113     assert_equal mime.to_s, @response.content_type
114   end
115 end
116
117 module CollectionResourceTests
118   include CommonResourceTests
119
120   def just_id
121     { :id => "test" }
122   end
123
124   def test_access_index_xml
125     mime = Mime::XML
126     get :index, :format => 'xml'
127     assert_equal mime.to_s, @response.content_type
128   end
129
130   def test_access_index_json
131     mime = Mime::JSON
132     get :index, :format => 'json'
133     assert_equal mime.to_s, @response.content_type
134   end
135 end