root / snf-app / synnefo / ui / static / snf / js / tests.js @ d5ba5588
History | View | Annotate | Download (17.2 kB)
1 | 00469232 | Kostas Papadimitriou | // Copyright 2011 GRNET S.A. All rights reserved.
|
---|---|---|---|
2 | 00469232 | Kostas Papadimitriou | //
|
3 | 00469232 | Kostas Papadimitriou | // Redistribution and use in source and binary forms, with or
|
4 | 00469232 | Kostas Papadimitriou | // without modification, are permitted provided that the following
|
5 | 00469232 | Kostas Papadimitriou | // conditions are met:
|
6 | 00469232 | Kostas Papadimitriou | //
|
7 | 00469232 | Kostas Papadimitriou | // 1. Redistributions of source code must retain the above
|
8 | 00469232 | Kostas Papadimitriou | // copyright notice, this list of conditions and the following
|
9 | 00469232 | Kostas Papadimitriou | // disclaimer.
|
10 | 00469232 | Kostas Papadimitriou | //
|
11 | 00469232 | Kostas Papadimitriou | // 2. Redistributions in binary form must reproduce the above
|
12 | 00469232 | Kostas Papadimitriou | // copyright notice, this list of conditions and the following
|
13 | 00469232 | Kostas Papadimitriou | // disclaimer in the documentation and/or other materials
|
14 | 00469232 | Kostas Papadimitriou | // provided with the distribution.
|
15 | 00469232 | Kostas Papadimitriou | //
|
16 | 00469232 | Kostas Papadimitriou | // THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS
|
17 | 00469232 | Kostas Papadimitriou | // OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
18 | 00469232 | Kostas Papadimitriou | // WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
19 | 00469232 | Kostas Papadimitriou | // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR
|
20 | 00469232 | Kostas Papadimitriou | // CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
21 | 00469232 | Kostas Papadimitriou | // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
22 | 00469232 | Kostas Papadimitriou | // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
|
23 | 00469232 | Kostas Papadimitriou | // USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
|
24 | 00469232 | Kostas Papadimitriou | // AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
25 | 00469232 | Kostas Papadimitriou | // LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
|
26 | 00469232 | Kostas Papadimitriou | // ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
27 | 00469232 | Kostas Papadimitriou | // POSSIBILITY OF SUCH DAMAGE.
|
28 | 00469232 | Kostas Papadimitriou | //
|
29 | 00469232 | Kostas Papadimitriou | // The views and conclusions contained in the software and
|
30 | 00469232 | Kostas Papadimitriou | // documentation are those of the authors and should not be
|
31 | 00469232 | Kostas Papadimitriou | // interpreted as representing official policies, either expressed
|
32 | 00469232 | Kostas Papadimitriou | // or implied, of GRNET S.A.
|
33 | 00469232 | Kostas Papadimitriou | //
|
34 | 00469232 | Kostas Papadimitriou | |
35 | 8d08f18a | Kostas Papadimitriou | $(document).ready(function(){ |
36 | 8d08f18a | Kostas Papadimitriou | |
37 | 8d08f18a | Kostas Papadimitriou | // shortcuts
|
38 | 8d08f18a | Kostas Papadimitriou | snf = synnefo; |
39 | 8d08f18a | Kostas Papadimitriou | models = snf.models; |
40 | 8d08f18a | Kostas Papadimitriou | util = snf.utils; |
41 | 8d08f18a | Kostas Papadimitriou | views = snf.views; |
42 | 8d08f18a | Kostas Papadimitriou | bb = Backbone; |
43 | 8d08f18a | Kostas Papadimitriou | vms = snf.storage.vms; |
44 | 8d08f18a | Kostas Papadimitriou | nets = snf.storage.networks; |
45 | 8d08f18a | Kostas Papadimitriou | |
46 | 1a1bac97 | Kostas Papadimitriou | synnefo.config.api_urls = { |
47 | 1a1bac97 | Kostas Papadimitriou | 'compute': '/api/v1.1', |
48 | 1a1bac97 | Kostas Papadimitriou | 'glance':'/images/v1.1' |
49 | 1a1bac97 | Kostas Papadimitriou | }; |
50 | 1a1bac97 | Kostas Papadimitriou | |
51 | 8d08f18a | Kostas Papadimitriou | module("VM Model")
|
52 | 8d08f18a | Kostas Papadimitriou | |
53 | 8d08f18a | Kostas Papadimitriou | test("model change events", function(){ |
54 | 8d08f18a | Kostas Papadimitriou | expect(8);
|
55 | 8d08f18a | Kostas Papadimitriou | |
56 | 8d08f18a | Kostas Papadimitriou | synnefo.storage.images.add({id:1,metadata:{values:{size:100}}}); |
57 | 8d08f18a | Kostas Papadimitriou | var v1 = new models.VM({'imageRef':1}); |
58 | 8d08f18a | Kostas Papadimitriou | v1.bind("change", function(){ |
59 | 8d08f18a | Kostas Papadimitriou | ok(1, "change event triggered") |
60 | 8d08f18a | Kostas Papadimitriou | equals(v1.get("status"), "BUILD") |
61 | 8d08f18a | Kostas Papadimitriou | equals(v1.get("state"), "BUILD_COPY") |
62 | 8d08f18a | Kostas Papadimitriou | }) |
63 | 8d08f18a | Kostas Papadimitriou | v1.set({'status':'BUILD', 'progress':80, 'imageRef': 1}); |
64 | 8d08f18a | Kostas Papadimitriou | v1.unbind(); |
65 | 8d08f18a | Kostas Papadimitriou | |
66 | 8d08f18a | Kostas Papadimitriou | v1.bind("change", function(){ |
67 | 8d08f18a | Kostas Papadimitriou | ok(1, "change event triggered") |
68 | 8d08f18a | Kostas Papadimitriou | equals(v1.get("status"), "BUILD") |
69 | 8d08f18a | Kostas Papadimitriou | equals(v1.get("state"), "DESTROY") |
70 | 8d08f18a | Kostas Papadimitriou | }) |
71 | 8d08f18a | Kostas Papadimitriou | v1.set({'state':'DESTROY'}); |
72 | 8d08f18a | Kostas Papadimitriou | v1.unbind(); |
73 | 8d08f18a | Kostas Papadimitriou | |
74 | 8d08f18a | Kostas Papadimitriou | v1.bind("change", function() { |
75 | 8d08f18a | Kostas Papadimitriou | ok(1, "change event triggered") |
76 | 8d08f18a | Kostas Papadimitriou | equals(v1.get("status"), "BUILD") |
77 | 8d08f18a | Kostas Papadimitriou | equals(v1.get("state"), "BUILD_COPY") |
78 | 8d08f18a | Kostas Papadimitriou | }) |
79 | 8d08f18a | Kostas Papadimitriou | v1.set({'status':'BUILD', 'progress':80, 'imageRef': 1}); |
80 | 8d08f18a | Kostas Papadimitriou | equals(v1.get("status"), "BUILD") |
81 | 8d08f18a | Kostas Papadimitriou | equals(v1.get("state"), "DESTROY") |
82 | 8d08f18a | Kostas Papadimitriou | v1.unbind(); |
83 | 8d08f18a | Kostas Papadimitriou | }) |
84 | 8d08f18a | Kostas Papadimitriou | |
85 | 8d08f18a | Kostas Papadimitriou | test("model state transitions", function(){ |
86 | 8d08f18a | Kostas Papadimitriou | var vm = models.VM;
|
87 | 8d08f18a | Kostas Papadimitriou | |
88 | 8d08f18a | Kostas Papadimitriou | var v1 = new vm(); |
89 | 8d08f18a | Kostas Papadimitriou | v1.set({status: 'BUILD_COPY'}) |
90 | 8d08f18a | Kostas Papadimitriou | equals(v1.get("state"), 'BUILD_COPY', "State is set"); |
91 | 8d08f18a | Kostas Papadimitriou | v1.set({status: 'DESTROY'}) |
92 | 8d08f18a | Kostas Papadimitriou | equals(v1.get("state"), 'DESTROY', "From buld to destroy"); |
93 | 8d08f18a | Kostas Papadimitriou | v1.set({status: 'BUILD'}) |
94 | 8d08f18a | Kostas Papadimitriou | equals(v1.get("state"), 'DESTROY', "Keep destroy state"); |
95 | 8d08f18a | Kostas Papadimitriou | |
96 | 8d08f18a | Kostas Papadimitriou | v1 = new vm();
|
97 | 8d08f18a | Kostas Papadimitriou | v1.set({status: 'ACTIVE'}) |
98 | 8d08f18a | Kostas Papadimitriou | equals(v1.get("state"), 'ACTIVE', "State is set"); |
99 | 8d08f18a | Kostas Papadimitriou | |
100 | 8d08f18a | Kostas Papadimitriou | v1.set({status: 'SHUTDOWN'}) |
101 | 8d08f18a | Kostas Papadimitriou | equals(v1.get("state"), 'SHUTDOWN', "From active to shutdown (should change)"); |
102 | 8d08f18a | Kostas Papadimitriou | |
103 | 8d08f18a | Kostas Papadimitriou | v1.set({status: 'ACTIVE'}) |
104 | 8d08f18a | Kostas Papadimitriou | equals(v1.get("state"), 'SHUTDOWN', "From shutdown to active (should not change)"); |
105 | 8d08f18a | Kostas Papadimitriou | |
106 | 8d08f18a | Kostas Papadimitriou | v1.set({status: 'STOPPED'}) |
107 | 8d08f18a | Kostas Papadimitriou | equals(v1.get("state"), 'STOPPED', "From shutdown to stopped (should change)"); |
108 | 8d08f18a | Kostas Papadimitriou | |
109 | 8d08f18a | Kostas Papadimitriou | v1.set({status: 'ACTIVE'}) |
110 | 8d08f18a | Kostas Papadimitriou | equals(v1.get("state"), 'ACTIVE', "From stopped to active (should change)"); |
111 | 8d08f18a | Kostas Papadimitriou | v1.set({'status': 'STOPPED'}) |
112 | 8d08f18a | Kostas Papadimitriou | equals(v1.get('state'), 'STOPPED', "From shutdown to stopped should change"); |
113 | 8d08f18a | Kostas Papadimitriou | |
114 | 8d08f18a | Kostas Papadimitriou | v1.set({'status': 'DESTROY'}) |
115 | 8d08f18a | Kostas Papadimitriou | equals(v1.get('state'), 'DESTROY', "From stopped to destory should set state to DESTROY"); |
116 | 8d08f18a | Kostas Papadimitriou | v1.set({'status': 'ACTIVE'}) |
117 | 8d08f18a | Kostas Papadimitriou | equals(v1.get('state'), 'DESTROY', "From destroy to active should keep state to DESTROY"); |
118 | 8d08f18a | Kostas Papadimitriou | v1.set({'status': 'REBOOT'}) |
119 | 8d08f18a | Kostas Papadimitriou | equals(v1.get('state'), 'DESTROY', "From destroy to active should keep state to DESTROY"); |
120 | 1420aae4 | Kostas Papadimitriou | v1.set({'status': 'DELETED'}) |
121 | 1420aae4 | Kostas Papadimitriou | equals(v1.get('state'), 'DELETED', "Destroy should be kept until DELETE or ERROR"); |
122 | 8d08f18a | Kostas Papadimitriou | |
123 | 8d08f18a | Kostas Papadimitriou | v1 = new vm({status:'BUILD'}); |
124 | 8d08f18a | Kostas Papadimitriou | equals(v1.get('state'), 'BUILD', "new vm with build as initial status") |
125 | 8d08f18a | Kostas Papadimitriou | equals(v1.get('status'), 'BUILD', "new vm with build as initial status") |
126 | 8d08f18a | Kostas Papadimitriou | v1.set({status:'ACTIVE'}) |
127 | 8d08f18a | Kostas Papadimitriou | equals(v1.get('state'), 'ACTIVE', "active state has been set") |
128 | 8d08f18a | Kostas Papadimitriou | equals(v1.get('status'), 'ACTIVE', "active status has been set") |
129 | 8d08f18a | Kostas Papadimitriou | }) |
130 | 8d08f18a | Kostas Papadimitriou | |
131 | 8d08f18a | Kostas Papadimitriou | |
132 | 8d08f18a | Kostas Papadimitriou | test("building states", function(){ |
133 | 8d08f18a | Kostas Papadimitriou | synnefo.storage.images.add({id:1,metadata:{values:{size:100}}}); |
134 | 8d08f18a | Kostas Papadimitriou | var vm = models.VM;
|
135 | 8d08f18a | Kostas Papadimitriou | var v1 = new vm({'status':'BUILD','progress':0, 'imageRef':1}); |
136 | 8d08f18a | Kostas Papadimitriou | equals(v1.get('state'), 'BUILD_INIT', "progress 0 sets state to BUILD_INIT"); |
137 | 8d08f18a | Kostas Papadimitriou | equals(v1.get('status'), 'BUILD', "progress 0 sets status to BUILD"); |
138 | 8d08f18a | Kostas Papadimitriou | equals(v1.get('progress_message'), 'init', "message 'init'"); |
139 | 8d08f18a | Kostas Papadimitriou | v1.set({status:'BUILD', progress:50}); |
140 | 8d08f18a | Kostas Papadimitriou | equals(v1.get('state'), 'BUILD_COPY', "progress 50 sets state to BUILD_COPY"); |
141 | 8d08f18a | Kostas Papadimitriou | equals(v1.get('status'), 'BUILD', "progress 50 sets status to BUILD"); |
142 | 8d08f18a | Kostas Papadimitriou | equals(v1.get('progress_message'), '50.00 MB, 100.00 MB, 50', "message: 'final'"); |
143 | 8d08f18a | Kostas Papadimitriou | v1.set({status:'BUILD', progress:100}); |
144 | 8d08f18a | Kostas Papadimitriou | equals(v1.get('state'), 'BUILD_FINAL', "progress 100 sets state to BUILD_FINAL"); |
145 | 8d08f18a | Kostas Papadimitriou | equals(v1.get('status'), 'BUILD', "progress 100 sets status to BUILD"); |
146 | 8d08f18a | Kostas Papadimitriou | v1.set({status:'ACTIVE', progress:100}); |
147 | 8d08f18a | Kostas Papadimitriou | equals(v1.get('state'), 'ACTIVE', "ACTIVE set transition to ACTIVE"); |
148 | 8d08f18a | Kostas Papadimitriou | equals(v1.get('status'), 'ACTIVE', "ACTIVE set transition to ACTIVE"); |
149 | 8d08f18a | Kostas Papadimitriou | equals(v1.get('progress_message'), 'final', "message: 'final'"); |
150 | 8d08f18a | Kostas Papadimitriou | }) |
151 | 8d08f18a | Kostas Papadimitriou | |
152 | 8d08f18a | Kostas Papadimitriou | test("active inactive states", function(){ |
153 | 8d08f18a | Kostas Papadimitriou | |
154 | 8d08f18a | Kostas Papadimitriou | var vm = models.VM;
|
155 | 8d08f18a | Kostas Papadimitriou | var v1 = new vm(); |
156 | 8d08f18a | Kostas Papadimitriou | var v = {}
|
157 | 8d08f18a | Kostas Papadimitriou | var active = ['ACTIVE', 'BUILD', 'REBOOT']; |
158 | 8d08f18a | Kostas Papadimitriou | for (v in active) { |
159 | 8d08f18a | Kostas Papadimitriou | v = active[v]; |
160 | 8d08f18a | Kostas Papadimitriou | v1.set({status: v})
|
161 | 8d08f18a | Kostas Papadimitriou | equals(v1.is_active(), true, v + " status is active") |
162 | 8d08f18a | Kostas Papadimitriou | } |
163 | 8d08f18a | Kostas Papadimitriou | |
164 | 8d08f18a | Kostas Papadimitriou | var v1 = new vm(); |
165 | 8d08f18a | Kostas Papadimitriou | var inactive = ['STOPPED', 'ERROR', 'UNKNOWN']; |
166 | 8d08f18a | Kostas Papadimitriou | for (v in inactive) { |
167 | 8d08f18a | Kostas Papadimitriou | v = inactive[v]; |
168 | 8d08f18a | Kostas Papadimitriou | v1.set({status: v})
|
169 | 8d08f18a | Kostas Papadimitriou | equals(v1.is_active(), false, v1.state() + " status is not active") |
170 | 8d08f18a | Kostas Papadimitriou | } |
171 | 8d08f18a | Kostas Papadimitriou | |
172 | 8d08f18a | Kostas Papadimitriou | }) |
173 | 8d08f18a | Kostas Papadimitriou | |
174 | 8d08f18a | Kostas Papadimitriou | test("transition event", function(){ |
175 | 8d08f18a | Kostas Papadimitriou | expect(9);
|
176 | 8d08f18a | Kostas Papadimitriou | |
177 | 8d08f18a | Kostas Papadimitriou | var vm = new models.VM({status:'BUILD'}); |
178 | 8d08f18a | Kostas Papadimitriou | vm.bind("transition", function(data) { |
179 | 8d08f18a | Kostas Papadimitriou | ok(true, "Transition triggered"); |
180 | 8d08f18a | Kostas Papadimitriou | equals(data.from, "BUILD")
|
181 | 8d08f18a | Kostas Papadimitriou | equals(data.to, "ACTIVE");
|
182 | 8d08f18a | Kostas Papadimitriou | }) |
183 | 8d08f18a | Kostas Papadimitriou | // trigger 1 time
|
184 | 8d08f18a | Kostas Papadimitriou | vm.set({status:'BUILD'}); |
185 | 8d08f18a | Kostas Papadimitriou | vm.set({status:'ACTIVE'}); |
186 | 8d08f18a | Kostas Papadimitriou | vm.unbind(); |
187 | 8d08f18a | Kostas Papadimitriou | |
188 | 8d08f18a | Kostas Papadimitriou | // from build to active
|
189 | 8d08f18a | Kostas Papadimitriou | vm = new models.VM({status:'BUILD'}); |
190 | 8d08f18a | Kostas Papadimitriou | vm.bind("transition", function(data) { |
191 | 8d08f18a | Kostas Papadimitriou | ok(true, "Transition triggered"); |
192 | 8d08f18a | Kostas Papadimitriou | equals(data.from, "BUILD")
|
193 | 8d08f18a | Kostas Papadimitriou | equals(data.to, "ACTIVE");
|
194 | 8d08f18a | Kostas Papadimitriou | }) |
195 | 8d08f18a | Kostas Papadimitriou | // trigger 1 time
|
196 | 8d08f18a | Kostas Papadimitriou | vm.set({status:'ACTIVE'}); |
197 | 8d08f18a | Kostas Papadimitriou | vm.unbind(); |
198 | 8d08f18a | Kostas Papadimitriou | |
199 | 8d08f18a | Kostas Papadimitriou | // from active to shutdown
|
200 | 8d08f18a | Kostas Papadimitriou | vm = new models.VM({status:'SHUTDOWN'}); |
201 | 8d08f18a | Kostas Papadimitriou | vm.bind("transition", function(data) { |
202 | 8d08f18a | Kostas Papadimitriou | ok(true, "Transition triggered"); |
203 | 8d08f18a | Kostas Papadimitriou | equals(data.from, "SHUTDOWN")
|
204 | 8d08f18a | Kostas Papadimitriou | equals(data.to, "STOPPED");
|
205 | 8d08f18a | Kostas Papadimitriou | }) |
206 | 8d08f18a | Kostas Papadimitriou | // trigger 1 time
|
207 | 8d08f18a | Kostas Papadimitriou | vm.set({status:'STOPPED'}); |
208 | 8d08f18a | Kostas Papadimitriou | }) |
209 | 8d08f18a | Kostas Papadimitriou | |
210 | 8d08f18a | Kostas Papadimitriou | module("Collections");
|
211 | 8d08f18a | Kostas Papadimitriou | |
212 | 8d08f18a | Kostas Papadimitriou | test("status model remove events", function(){ |
213 | 8d08f18a | Kostas Papadimitriou | vms.unbind(); |
214 | 8d08f18a | Kostas Papadimitriou | expect(1)
|
215 | 8d08f18a | Kostas Papadimitriou | |
216 | 8d08f18a | Kostas Papadimitriou | vms.bind("change", function(){ |
217 | 8d08f18a | Kostas Papadimitriou | ok(-1, "change event should not get triggered"); |
218 | 8d08f18a | Kostas Papadimitriou | }) |
219 | 8d08f18a | Kostas Papadimitriou | |
220 | 8d08f18a | Kostas Papadimitriou | vms.bind("remove", function(){ |
221 | 8d08f18a | Kostas Papadimitriou | ok(1, "remove event triggered") |
222 | 8d08f18a | Kostas Papadimitriou | }) |
223 | 8d08f18a | Kostas Papadimitriou | |
224 | 8d08f18a | Kostas Papadimitriou | var vm = new models.VM({id:1, status:"ACTIVE", name:"oldname"}); |
225 | 8d08f18a | Kostas Papadimitriou | vms.add(vm); |
226 | 8d08f18a | Kostas Papadimitriou | |
227 | 8d08f18a | Kostas Papadimitriou | // NO change/delete just DELETE event triggered
|
228 | 8d08f18a | Kostas Papadimitriou | vms.update([{id:1, status:"DELETED", name:"newname"}]) |
229 | 8d08f18a | Kostas Papadimitriou | }); |
230 | 8d08f18a | Kostas Papadimitriou | |
231 | 8d08f18a | Kostas Papadimitriou | test("collection reset events", function() { |
232 | 8d08f18a | Kostas Papadimitriou | expect(9);
|
233 | 8d08f18a | Kostas Papadimitriou | |
234 | 8d08f18a | Kostas Papadimitriou | var testCollection = models.Collection.extend({
|
235 | 8d08f18a | Kostas Papadimitriou | url: '/testObject' |
236 | 8d08f18a | Kostas Papadimitriou | }); |
237 | 8d08f18a | Kostas Papadimitriou | var collection = new testCollection(); |
238 | 8d08f18a | Kostas Papadimitriou | |
239 | 8d08f18a | Kostas Papadimitriou | |
240 | 8d08f18a | Kostas Papadimitriou | // reset on new entry after empty
|
241 | 8d08f18a | Kostas Papadimitriou | $.mockjax({
|
242 | 8d08f18a | Kostas Papadimitriou | url: '/testObject', |
243 | 8d08f18a | Kostas Papadimitriou | responseTime: 50, |
244 | 8d08f18a | Kostas Papadimitriou | responseText: [
|
245 | 8d08f18a | Kostas Papadimitriou | {id:1, attr1: 1, attr2: 2} |
246 | 8d08f18a | Kostas Papadimitriou | ] |
247 | 8d08f18a | Kostas Papadimitriou | }); |
248 | 8d08f18a | Kostas Papadimitriou | // THIS SHOULD NOT FIRE, since we force update method
|
249 | 8d08f18a | Kostas Papadimitriou | collection.bind("reset", function() { |
250 | 8d08f18a | Kostas Papadimitriou | ok(1, "NOT EXPECTED: reset triggered on new entry while collection was empty"); |
251 | 8d08f18a | Kostas Papadimitriou | }); |
252 | 8d08f18a | Kostas Papadimitriou | collection.bind("add", function() { |
253 | 8d08f18a | Kostas Papadimitriou | ok(1, "1: add triggered on new entry while collection was empty"); |
254 | 8d08f18a | Kostas Papadimitriou | }); |
255 | 8d08f18a | Kostas Papadimitriou | // THIS SHOULD NOT FIRE, model was added, not changed
|
256 | 8d08f18a | Kostas Papadimitriou | collection.bind("change", function() { |
257 | 8d08f18a | Kostas Papadimitriou | ok(1, "NOT EXPECTED: change triggered on new entry while collection was empty"); |
258 | 8d08f18a | Kostas Papadimitriou | }); |
259 | 8d08f18a | Kostas Papadimitriou | collection.fetch({'async': false}); |
260 | 8d08f18a | Kostas Papadimitriou | equals(collection.length, 1, "2: collection contains 1 model"); |
261 | 8d08f18a | Kostas Papadimitriou | collection.unbind(); |
262 | 8d08f18a | Kostas Papadimitriou | $.mockjaxClear();
|
263 | 8d08f18a | Kostas Papadimitriou | |
264 | 8d08f18a | Kostas Papadimitriou | // reset is called on change
|
265 | 8d08f18a | Kostas Papadimitriou | $.mockjax({
|
266 | 8d08f18a | Kostas Papadimitriou | url: '/testObject', |
267 | 8d08f18a | Kostas Papadimitriou | responseTime: 50, |
268 | 8d08f18a | Kostas Papadimitriou | responseText: [
|
269 | 8d08f18a | Kostas Papadimitriou | {id:1, attr1: 4, attr2: 2} |
270 | 8d08f18a | Kostas Papadimitriou | ] |
271 | 8d08f18a | Kostas Papadimitriou | }); |
272 | 8d08f18a | Kostas Papadimitriou | collection.bind("reset", function() { |
273 | 8d08f18a | Kostas Papadimitriou | ok(1, "NOT EXPECTED: reset triggered on new entry while collection was empty"); |
274 | 8d08f18a | Kostas Papadimitriou | }); |
275 | 8d08f18a | Kostas Papadimitriou | collection.bind("add", function() { |
276 | 8d08f18a | Kostas Papadimitriou | ok(1, "NOT EXPECTED: add triggered on new entry while collection was empty"); |
277 | 8d08f18a | Kostas Papadimitriou | }); |
278 | 8d08f18a | Kostas Papadimitriou | // THIS SHOULD NOT FIRE, model was added, not changed
|
279 | 8d08f18a | Kostas Papadimitriou | collection.bind("change", function() { |
280 | 8d08f18a | Kostas Papadimitriou | ok(1, "3: change triggered on new entry while collection was empty"); |
281 | 8d08f18a | Kostas Papadimitriou | }); |
282 | 8d08f18a | Kostas Papadimitriou | collection.fetch({'async': false, refresh:true}); |
283 | 8d08f18a | Kostas Papadimitriou | equals(collection.length, 1, "4 collection contains 1 model"); |
284 | 8d08f18a | Kostas Papadimitriou | collection.unbind(); |
285 | 8d08f18a | Kostas Papadimitriou | $.mockjaxClear();
|
286 | 8d08f18a | Kostas Papadimitriou | |
287 | 8d08f18a | Kostas Papadimitriou | // reset on second entry
|
288 | 8d08f18a | Kostas Papadimitriou | $.mockjax({
|
289 | 8d08f18a | Kostas Papadimitriou | url: '/testObject', |
290 | 8d08f18a | Kostas Papadimitriou | responseTime: 50, |
291 | 8d08f18a | Kostas Papadimitriou | responseText: [
|
292 | 8d08f18a | Kostas Papadimitriou | {id:1, attr1: 4, attr2: 2}, |
293 | 8d08f18a | Kostas Papadimitriou | {id:2, attr1: 1, attr2: 2} |
294 | 8d08f18a | Kostas Papadimitriou | ] |
295 | 8d08f18a | Kostas Papadimitriou | }); |
296 | 8d08f18a | Kostas Papadimitriou | collection.bind("reset", function() { |
297 | 8d08f18a | Kostas Papadimitriou | ok(1, "NOT EXPECTED: reset triggered when new model arrived"); |
298 | 8d08f18a | Kostas Papadimitriou | }) |
299 | 8d08f18a | Kostas Papadimitriou | collection.bind("add", function() { |
300 | 8d08f18a | Kostas Papadimitriou | ok(1, "5: add triggered when new model arrived"); |
301 | 8d08f18a | Kostas Papadimitriou | }) |
302 | 8d08f18a | Kostas Papadimitriou | collection.bind("change", function() { |
303 | 8d08f18a | Kostas Papadimitriou | ok(1, "NOT EXPECTED: change triggered when new model arrived"); |
304 | 8d08f18a | Kostas Papadimitriou | }) |
305 | 8d08f18a | Kostas Papadimitriou | collection.fetch({async:false, refresh:true}); |
306 | 8d08f18a | Kostas Papadimitriou | equals(collection.length, 2, "6 new model added"); |
307 | 8d08f18a | Kostas Papadimitriou | collection.unbind(); |
308 | 8d08f18a | Kostas Papadimitriou | $.mockjaxClear();
|
309 | 8d08f18a | Kostas Papadimitriou | |
310 | 8d08f18a | Kostas Papadimitriou | // reset does not remove
|
311 | 8d08f18a | Kostas Papadimitriou | $.mockjax({
|
312 | 8d08f18a | Kostas Papadimitriou | url: '/testObject', |
313 | 8d08f18a | Kostas Papadimitriou | responseTime: 50, |
314 | 8d08f18a | Kostas Papadimitriou | responseText: [
|
315 | 8d08f18a | Kostas Papadimitriou | {id:2, attr1: 1, attr2: 2} |
316 | 8d08f18a | Kostas Papadimitriou | ] |
317 | 8d08f18a | Kostas Papadimitriou | }); |
318 | 8d08f18a | Kostas Papadimitriou | collection.bind("reset", function() { |
319 | 8d08f18a | Kostas Papadimitriou | ok(1, "NOT EXPECTED: reset triggered when model removed"); |
320 | 8d08f18a | Kostas Papadimitriou | }) |
321 | 8d08f18a | Kostas Papadimitriou | collection.bind("remove", function() { |
322 | 8d08f18a | Kostas Papadimitriou | ok(1, "7: remove triggered when model removed"); |
323 | 8d08f18a | Kostas Papadimitriou | }) |
324 | 8d08f18a | Kostas Papadimitriou | collection.bind("change", function() { |
325 | 8d08f18a | Kostas Papadimitriou | ok(1, "NOT EXPECTED: change triggered when model removed"); |
326 | 8d08f18a | Kostas Papadimitriou | }) |
327 | 8d08f18a | Kostas Papadimitriou | |
328 | 8d08f18a | Kostas Papadimitriou | collection.fetch({async:false, refresh:true}); |
329 | 8d08f18a | Kostas Papadimitriou | equals(collection.length, 1, "8 one model removed"); |
330 | 8d08f18a | Kostas Papadimitriou | collection.unbind(); |
331 | 8d08f18a | Kostas Papadimitriou | $.mockjaxClear();
|
332 | 8d08f18a | Kostas Papadimitriou | |
333 | 8d08f18a | Kostas Papadimitriou | // reset is not called on 304
|
334 | 8d08f18a | Kostas Papadimitriou | $.mockjax({
|
335 | 8d08f18a | Kostas Papadimitriou | url: '/testObject', |
336 | 8d08f18a | Kostas Papadimitriou | responseTime: 50, |
337 | 8d08f18a | Kostas Papadimitriou | status: 304, |
338 | 8d08f18a | Kostas Papadimitriou | responseText: undefined |
339 | 8d08f18a | Kostas Papadimitriou | }); |
340 | 8d08f18a | Kostas Papadimitriou | // NO event is triggered on 304
|
341 | 8d08f18a | Kostas Papadimitriou | collection.bind("reset", function() { |
342 | 8d08f18a | Kostas Papadimitriou | ok(1, "WRONG: reset triggered on 304"); |
343 | 8d08f18a | Kostas Papadimitriou | }); |
344 | 8d08f18a | Kostas Papadimitriou | collection.bind("remove", function() { |
345 | 8d08f18a | Kostas Papadimitriou | ok(1, "WRONG: remove triggered on 304"); |
346 | 8d08f18a | Kostas Papadimitriou | }); |
347 | 8d08f18a | Kostas Papadimitriou | collection.bind("change", function() { |
348 | 8d08f18a | Kostas Papadimitriou | ok(1, "WRONG: remove triggered on 304"); |
349 | 8d08f18a | Kostas Papadimitriou | }); |
350 | 8d08f18a | Kostas Papadimitriou | collection.fetch({async:false, refresh:true}); |
351 | 8d08f18a | Kostas Papadimitriou | equals(collection.length, 1, "9 one model removed"); |
352 | 8d08f18a | Kostas Papadimitriou | collection.unbind(); |
353 | 8d08f18a | Kostas Papadimitriou | $.mockjaxClear();
|
354 | 8d08f18a | Kostas Papadimitriou | }) |
355 | 8d08f18a | Kostas Papadimitriou | |
356 | 8d08f18a | Kostas Papadimitriou | |
357 | 8d08f18a | Kostas Papadimitriou | module("network vm connections")
|
358 | 8d08f18a | Kostas Papadimitriou | test("network vm connections", function() { |
359 | 8d08f18a | Kostas Papadimitriou | |
360 | 8d08f18a | Kostas Papadimitriou | function _net(id, ip) { |
361 | 8d08f18a | Kostas Papadimitriou | return {
|
362 | 8d08f18a | Kostas Papadimitriou | id: id,
|
363 | 8d08f18a | Kostas Papadimitriou | name: "net " + id, |
364 | 8d08f18a | Kostas Papadimitriou | values:[{version:4, addr: ip}, {version:6, addr:ip}] |
365 | 8d08f18a | Kostas Papadimitriou | } |
366 | 8d08f18a | Kostas Papadimitriou | } |
367 | 8d08f18a | Kostas Papadimitriou | vms.add({id:1, name:"s1", linked_to_nets:[_net("p", "127")]}); |
368 | 8d08f18a | Kostas Papadimitriou | var vm = vms.at(0); |
369 | 8d08f18a | Kostas Papadimitriou | |
370 | 8d08f18a | Kostas Papadimitriou | nets.add({id:"p", nid:"p", name:"n1", linked_to:[1]}); |
371 | 8d08f18a | Kostas Papadimitriou | var n = nets.at(0); |
372 | 8d08f18a | Kostas Papadimitriou | }) |
373 | 1420aae4 | Kostas Papadimitriou | |
374 | 1420aae4 | Kostas Papadimitriou | module("images/flavors")
|
375 | 1420aae4 | Kostas Papadimitriou | test("Test DELETE state image retrieval", function() { |
376 | 1420aae4 | Kostas Papadimitriou | snf.storage.images.reset(); |
377 | 1420aae4 | Kostas Papadimitriou | snf.storage.vms.reset(); |
378 | 1420aae4 | Kostas Papadimitriou | |
379 | 1420aae4 | Kostas Papadimitriou | var images = snf.storage.images;
|
380 | 1420aae4 | Kostas Papadimitriou | var vms = snf.storage.vms;
|
381 | 1420aae4 | Kostas Papadimitriou | |
382 | 1420aae4 | Kostas Papadimitriou | var img = images.add({name:"image 1", id:1}).last(); |
383 | 1420aae4 | Kostas Papadimitriou | var vm1 = vms.add({imageRef:1, name:"vm1"}).last(); |
384 | 1420aae4 | Kostas Papadimitriou | var vm2 = vms.add({imageRef:2, name:"vm2"}).last(); |
385 | 1420aae4 | Kostas Papadimitriou | |
386 | 1420aae4 | Kostas Papadimitriou | equals(img, vm1.get_image()); |
387 | 1420aae4 | Kostas Papadimitriou | |
388 | 1420aae4 | Kostas Papadimitriou | // reset is not called on 304
|
389 | 1420aae4 | Kostas Papadimitriou | $.mockjax({
|
390 | 1420aae4 | Kostas Papadimitriou | url: '/api/v1.1/images/2', |
391 | 1420aae4 | Kostas Papadimitriou | responseTime: 50, |
392 | 1420aae4 | Kostas Papadimitriou | status: 200, |
393 | 1420aae4 | Kostas Papadimitriou | responseText: {image:{name:"image 2", id:2}} |
394 | 1420aae4 | Kostas Papadimitriou | }); |
395 | 1420aae4 | Kostas Papadimitriou | |
396 | 1420aae4 | Kostas Papadimitriou | |
397 | 1420aae4 | Kostas Papadimitriou | equals(images.length, 1, "1 image exists"); |
398 | 1420aae4 | Kostas Papadimitriou | vm2.get_image(); |
399 | 1420aae4 | Kostas Papadimitriou | equals(images.get(2).get("name"), "image 2", "image data parsed"); |
400 | 1420aae4 | Kostas Papadimitriou | equals(images.length, 2);
|
401 | 1420aae4 | Kostas Papadimitriou | }) |
402 | 1420aae4 | Kostas Papadimitriou | |
403 | 1420aae4 | Kostas Papadimitriou | test("Test DELETE state flavor retrieval", function() { |
404 | 1420aae4 | Kostas Papadimitriou | snf.storage.flavors.reset(); |
405 | 1420aae4 | Kostas Papadimitriou | snf.storage.vms.reset(); |
406 | 1420aae4 | Kostas Papadimitriou | |
407 | 1420aae4 | Kostas Papadimitriou | var flavors = snf.storage.flavors;
|
408 | 1420aae4 | Kostas Papadimitriou | var vms = snf.storage.vms;
|
409 | 1420aae4 | Kostas Papadimitriou | |
410 | 1420aae4 | Kostas Papadimitriou | var flv = flavors.add({id:1, cpu:1, disk:1, ram:1024}).last(); |
411 | 1420aae4 | Kostas Papadimitriou | var vm1 = vms.add({flavorRef:1, name:"vm1"}).last(); |
412 | 1420aae4 | Kostas Papadimitriou | var vm2 = vms.add({flavorRef:2, name:"vm2"}).last(); |
413 | 1420aae4 | Kostas Papadimitriou | |
414 | 1420aae4 | Kostas Papadimitriou | equals(flv, vm1.get_flavor()); |
415 | 1420aae4 | Kostas Papadimitriou | |
416 | 1420aae4 | Kostas Papadimitriou | // reset is not called on 304
|
417 | 1420aae4 | Kostas Papadimitriou | $.mockjax({
|
418 | 1420aae4 | Kostas Papadimitriou | url: '/api/v1.1/flavors/2', |
419 | 1420aae4 | Kostas Papadimitriou | responseTime: 50, |
420 | 1420aae4 | Kostas Papadimitriou | status: 200, |
421 | 1420aae4 | Kostas Papadimitriou | responseText: {flavor:{cpu:1, ram:2048, disk:100, id:2}} |
422 | 1420aae4 | Kostas Papadimitriou | }); |
423 | 1420aae4 | Kostas Papadimitriou | |
424 | 1420aae4 | Kostas Papadimitriou | |
425 | 1420aae4 | Kostas Papadimitriou | equals(flavors.length, 1, "1 flavor exists"); |
426 | 1420aae4 | Kostas Papadimitriou | vm2.get_flavor(); |
427 | 1420aae4 | Kostas Papadimitriou | equals(flavors.get(2).get("ram"), 2048, "flavor data parsed"); |
428 | 1420aae4 | Kostas Papadimitriou | equals(flavors.length, 2);
|
429 | 1420aae4 | Kostas Papadimitriou | }) |
430 | 101e6604 | Kostas Papadimitriou | |
431 | 101e6604 | Kostas Papadimitriou | test("actions list object", function(){ |
432 | 101e6604 | Kostas Papadimitriou | var m = new models.Image(); |
433 | 101e6604 | Kostas Papadimitriou | var l = new models.ParamsList(m, "actions"); |
434 | 101e6604 | Kostas Papadimitriou | var count = 0; |
435 | 101e6604 | Kostas Papadimitriou | |
436 | 101e6604 | Kostas Papadimitriou | l.add("destroy");
|
437 | 101e6604 | Kostas Papadimitriou | equals(l.has_action("destroy"), true); |
438 | 101e6604 | Kostas Papadimitriou | equals(l.contains("destroy"), true); |
439 | 101e6604 | Kostas Papadimitriou | |
440 | 101e6604 | Kostas Papadimitriou | l.add("destroy", 1, {}); |
441 | 101e6604 | Kostas Papadimitriou | equals(l.has_action("destroy"), true); |
442 | 101e6604 | Kostas Papadimitriou | equals(l.contains("destroy", 1, {}), true); |
443 | 101e6604 | Kostas Papadimitriou | |
444 | 101e6604 | Kostas Papadimitriou | l.remove("destroy", 1, {}); |
445 | 101e6604 | Kostas Papadimitriou | equals(l.contains("destroy", 1, {}), false); |
446 | 101e6604 | Kostas Papadimitriou | |
447 | 101e6604 | Kostas Papadimitriou | m.bind("change:actions", function() { count ++}); |
448 | 101e6604 | Kostas Papadimitriou | l.add("destroy");
|
449 | 101e6604 | Kostas Papadimitriou | |
450 | 101e6604 | Kostas Papadimitriou | equals(count, 0);
|
451 | 101e6604 | Kostas Papadimitriou | l.add("destroy", 1, {}); |
452 | 101e6604 | Kostas Papadimitriou | equals(count, 1);
|
453 | 101e6604 | Kostas Papadimitriou | }); |
454 | aeadb7bf | Kostas Papadimitriou | |
455 | aeadb7bf | Kostas Papadimitriou | module("update handlers")
|
456 | aeadb7bf | Kostas Papadimitriou | test("update handlers", function() { |
457 | aeadb7bf | Kostas Papadimitriou | // this test is based on multiple timeouts
|
458 | aeadb7bf | Kostas Papadimitriou | // so the results might differ between different browsers
|
459 | aeadb7bf | Kostas Papadimitriou | // or browser load
|
460 | aeadb7bf | Kostas Papadimitriou | stop(); |
461 | aeadb7bf | Kostas Papadimitriou | |
462 | aeadb7bf | Kostas Papadimitriou | var counter = 0; |
463 | aeadb7bf | Kostas Papadimitriou | var cb = function() { |
464 | aeadb7bf | Kostas Papadimitriou | counter++; |
465 | aeadb7bf | Kostas Papadimitriou | } |
466 | aeadb7bf | Kostas Papadimitriou | |
467 | aeadb7bf | Kostas Papadimitriou | var opts = {
|
468 | aeadb7bf | Kostas Papadimitriou | callback:cb,
|
469 | aeadb7bf | Kostas Papadimitriou | interval: 10, |
470 | aeadb7bf | Kostas Papadimitriou | fast: 5, |
471 | aeadb7bf | Kostas Papadimitriou | increase: 5, |
472 | aeadb7bf | Kostas Papadimitriou | max: 15, |
473 | aeadb7bf | Kostas Papadimitriou | increase_after_calls: 3, |
474 | aeadb7bf | Kostas Papadimitriou | initial_call: false |
475 | aeadb7bf | Kostas Papadimitriou | } |
476 | aeadb7bf | Kostas Papadimitriou | |
477 | aeadb7bf | Kostas Papadimitriou | var h = new snf.api.updateHandler(opts); |
478 | aeadb7bf | Kostas Papadimitriou | h.start(); |
479 | aeadb7bf | Kostas Papadimitriou | |
480 | aeadb7bf | Kostas Papadimitriou | var add = $.browser.msie ? 8 : 0; |
481 | aeadb7bf | Kostas Papadimitriou | |
482 | aeadb7bf | Kostas Papadimitriou | window.setTimeout(function(){
|
483 | aeadb7bf | Kostas Papadimitriou | h.stop(); |
484 | aeadb7bf | Kostas Papadimitriou | start(); |
485 | aeadb7bf | Kostas Papadimitriou | // 4 calls, limit reached
|
486 | aeadb7bf | Kostas Papadimitriou | equals(counter, 4, "normal calls"); |
487 | aeadb7bf | Kostas Papadimitriou | equals(h.interval, opts.max, "limit reached");
|
488 | aeadb7bf | Kostas Papadimitriou | |
489 | aeadb7bf | Kostas Papadimitriou | stop(); |
490 | aeadb7bf | Kostas Papadimitriou | h.start(false);
|
491 | aeadb7bf | Kostas Papadimitriou | h.faster(); |
492 | aeadb7bf | Kostas Papadimitriou | window.setTimeout(function(){
|
493 | aeadb7bf | Kostas Papadimitriou | // 11 calls, limit reached
|
494 | aeadb7bf | Kostas Papadimitriou | start(); |
495 | aeadb7bf | Kostas Papadimitriou | equals(counter, 11, "faster calls"); |
496 | aeadb7bf | Kostas Papadimitriou | equals(h.interval, opts.max, "limit reached");
|
497 | aeadb7bf | Kostas Papadimitriou | h.stop(); |
498 | aeadb7bf | Kostas Papadimitriou | stop(); |
499 | aeadb7bf | Kostas Papadimitriou | window.setTimeout(function(){
|
500 | aeadb7bf | Kostas Papadimitriou | // no additional calls because we stopped it
|
501 | aeadb7bf | Kostas Papadimitriou | start(); |
502 | aeadb7bf | Kostas Papadimitriou | equals(counter, 11, "no additional calls") |
503 | aeadb7bf | Kostas Papadimitriou | }, 50 + add)
|
504 | aeadb7bf | Kostas Papadimitriou | }, 50 + add)
|
505 | aeadb7bf | Kostas Papadimitriou | }, 43 + add)
|
506 | aeadb7bf | Kostas Papadimitriou | }) |
507 | 8d08f18a | Kostas Papadimitriou | }) |