OSDN Git Service

1cee52d68541ce79ef7809490a7a4d6e56937bfc
[elecoma/elecoma.git] / spec / models / service_cooperation_spec.rb
1 # -*- coding: utf-8 -*-
2 require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
3 require 'nkf'
4 require 'tempfile'
5 require 'digest/md5'
6
7 describe ServiceCooperation do
8   fixtures :service_cooperations
9   fixtures :products
10
11   describe "validateのテスト" do
12     before do
13       @service = service_cooperations(:one)
14     end
15     it "正しい条件" do
16       @service.should be_valid
17     end
18     it "サービスの名称は必須" do
19       @service.name = nil
20       @service.should_not be_valid
21     end
22     it "サービス名称の文字数チェック" do
23       @service.name = "a"*200
24       @service.should be_valid
25       @service.name = "a"*201
26       @service.should_not be_valid
27     end
28     it "URL取得用文字列は必須" do
29       @service.url_file_name = nil
30       @service.should_not be_valid
31     end
32     it "URL取得用文字列の文字数チェック" do
33       @service.url_file_name = 'a'*30
34       @service.should be_valid
35       @service.url_file_name = 'a'*31
36       @service.should_not be_valid
37     end
38     valid_url_file_name = [
39       "abcdefg",
40       "1234566",
41       "a___aaa___a____",
42       "______",
43       "AAAAASSASASA",
44       "abc_123",
45       "_123abc",
46       "123abc_"
47     ]
48     valid_url_file_name.each do |words|
49       it "許可ファイル名のテスト:"+words do
50         @service.url_file_name = words
51         @service.should be_valid
52       end
53     end
54     non_valid_url_file_name = [
55       "アイウエオ",
56       "あいうえお",
57       "漢字",
58       "abcあefg",
59       "ZENKAKU",
60       "あtest",
61       "testあ",
62       "1+1"
63     ]
64     non_valid_url_file_name.each do |words|
65       it "禁止ファイル名のテスト:"+words do
66         @service.url_file_name = words
67         @service.should_not be_valid
68       end
69     end
70     it "URL取得用文字列に使えるのは英数字と'_'です" do
71       @service.url_file_name = "abc_123"
72       @service.should be_valid
73       @service.url_file_name = "あいうえお"
74       @service.should_not be_valid
75     end
76     it "ファイル形式の範囲外参照チェック" do
77       @service.file_type = -1
78       @service.should_not be_valid
79     end
80     it "エンコードタイプの範囲外参照チェック" do
81       @service.encode = -1
82       @service.should_not be_valid
83     end
84     it "改行文字の範囲外参照チェック" do
85       @service.newline_character = -1
86       @service.should_not be_valid
87     end
88     it "SQL文は必須" do
89       @service.sql = nil
90       @service.should_not be_valid
91     end
92     
93     valid_sql_words = [
94       "select alterer from anonymouse",
95       "select altalter from anonymouse",
96       "select alter_id from anonymouse",
97       "select alter,delete from anonymouse",
98       "select alter,delete,create form anonymouse",
99       "select alter,delete,create,drop,analyze,commit,copy,end form anolyze",
100       "SELECT actual from non_actual order by id",
101       "select test from alterer",
102       "select test from tes_alterer",
103       "select delete_at from products",
104       "SELECT create_at FROM non_actual",
105       "SELECT test from non_actual order by id",
106       "SELECT name,id FROM products WHERE id > 5 ORDER BY id",
107       "select delete,create,alter,end from non_actual where id < 10 order by id",
108       "select commit_table,newline_character FROM test",
109       "SELECT template_name,service_name,url_file_name,file_type,encode,newline_character,sql,field_items FROM service_cooperations_templates"
110     ]
111
112     valid_sql_words.each do |words|
113       it "SQL許可コマンドテスト:"+words do
114         @service.sql = words
115         @service.should be_valid
116       end
117     end
118
119     non_valid_sql_words = [
120       "ALTER INDEX name RENAME TO super_name FROM products",
121       "alter index name rename to super_name from products",
122       "CREATE TABLE actual",
123       "create table actual",
124       "CREATE ROLE jonathan LOGIN",
125       "create role jonathan login",
126       "CREATE UNIQUE INDEX title_idx ON films(title)",
127       "create unique index code_idx ON films(code) TABLESPACE indexspace",
128       "CREATE superman name SUPREUSER",
129       "create superman name superuser",
130       "DROP DOMAIN box",
131       "drop function sqrt(integer)",
132       "DROP ROLE jonathan",
133       "DROP TABLE actual",
134       "DELETE FROM test",
135       "analyze non_actual",
136       "ANALYZE non_actual",
137       "COMMIT",
138       "COMMIT PREPARED 'foober'",
139       "END",
140       "COPY name FROM products ORDER BY id",
141       "copy name from products order by id"
142     ]
143
144     non_valid_sql_words.each do |words|
145       it "SQL禁止コマンドテスト:"+words do
146         @service.sql = words
147         @service.should_not be_valid
148       end
149     end
150
151     it "SQL文は範囲以内" do
152       @service.sql = 'a'*2000
153       @service.should be_valid
154     end
155     it "アイテムフィールドは必須" do
156       @service.field_items = nil
157       @service.should_not be_valid
158     end
159     it "アイテムフィールドの文字数チェック" do
160       @service.field_items = "a"*300
161       @service.should be_valid
162     end
163   end
164
165   describe "管理画面関係" do
166     it "select_file_type メソッドのチェック" do
167       output = [ ["CSV", 0],["TSV",1] ]
168       ServiceCooperation.select_file_type.sort{ |a,b|
169         (a[1] <=> b[1])
170       }.should eql(output)
171     end
172     it "select_encode メソッドのチェック" do
173       output = [ ["UTF-8", 0],["SHIFT-JIS",1],["EUC",2],["JIS",3] ]
174       ServiceCooperation.select_encode.sort{ |a,b|
175         (a[1] <=> b[1])
176       }.should eql(output)
177     end
178     it "select_newline_character メソッドのチェック" do
179       output = [ ["CR",0], ["LF",1], ["CR+LF",2] ]
180       ServiceCooperation.select_newline_character.sort{ |a,b|
181         (a[1] <=> b[1])
182       }.should eql(output)
183     end
184   end
185   describe "get_filename メソッド" do
186     before do
187       @service = service_cooperations(:one)
188     end
189     it "ファイル名取得チェック" do
190       @service.url_file_name = "test"
191       @service.file_type = 0
192       @service.get_filename.should == "test.CSV"
193     end
194   end
195   describe "file_generate メソッド" do
196     before do
197       @service = service_cooperations(:one)
198     end
199     describe "sqlの検証" do
200       before do
201         @service.field_items = "name,id"
202         @service.file_type = 0
203         @service.newline_character = 1
204         @service.encode = 0
205       end
206       it "SQLの検証" do
207         # 存在しないテーブル名を指定した時
208         @service.sql = "SELECT * FROM no_actual"
209         @service.file_generate.should be_nil
210         # 存在しないカラム
211         @service.sql = "SELECT anonymouse FROM admin_users"
212         @service.file_generate.should be_nil
213         # 間違ったコマンド名
214         @service.sql = "SEEEELCT id,name FROM products"
215         @service.file_generate.should be_nil
216       end
217     end
218
219     describe "CSV-TSV" do
220       it "CSV形式出力の検証" do
221         @service.sql = "SELECT name,id FROM products WHERE id < 3 ORDER BY id"
222         @service.field_items = "name,id"
223         @service.file_type = 0
224         @service.newline_character = 1
225         @service.encode = 0
226         open(File.dirname(__FILE__) + "/../csv/service_cooperations_sample.csv") { |f|
227           @service.file_generate.should eql(NKF.nkf('-w8', f.read))
228           f.close
229         }
230       end
231       
232       it "CSV出力照合検証" do
233         @service.sql = "SELECT name,id FROM products WHERE id < 3 ORDER BY id"
234         @service.field_items = "name,id"
235         @service.file_type = 0
236         @service.newline_character = 1
237         @service.encode = 0
238   
239         Tempfile.open("test") do |temp|
240           temp.puts @service.file_generate
241           temp.close
242           temp.open
243           open(File.dirname(__FILE__) + "/../csv/service_cooperations_sample.csv") do |f|
244             Digest::MD5.new.update(temp.read).should == (Digest::MD5.new.update(NKF.nkf('-w8',f.read)))
245             f.close
246           end
247           temp.close!
248         end
249       end
250
251       it "TSV形式出力の検証" do
252         @service.sql = "SELECT name,id FROM products WHERE id < 3 ORDER BY id"
253         @service.field_items = "name,id"
254         @service.file_type = 1
255         @service.newline_character = 2
256         @service.encode = 1
257         Tempfile.open("test") do |temp|
258           temp.puts @service.file_generate
259           temp.close
260           temp.open
261           open(File.dirname(__FILE__) + "/../csv/service_cooperations_sample.tsv") do |f|
262             Digest::MD5.new.update(temp.read).should == (Digest::MD5.new.update(NKF.nkf('-s',f.read)))
263             f.close
264           end
265           temp.close!
266         end
267       end
268     
269       it "EUCに正しく変換できるか" do
270         @service.encode = 2
271         NKF.guess(@service.file_generate).should eql(NKF::EUC)
272       end
273       it "UTF-8に正しく変換できるか" do
274         @service.encode = 0
275         NKF.guess(@service.file_generate).should eql(NKF::UTF8)
276       end
277       it "Shift-JISに正しく変換できるか" do
278         @service.encode = 1
279         NKF.guess(@service.file_generate).should eql(NKF::SJIS)
280       end
281
282       it "CR+LFの改行コードのテスト" do
283         @service.newline_character = 2
284         @service.file_generate.should match(/\r\n/)
285       end
286       it "LFの改行コードテスト" do
287         @service.newline_character = 1
288         @service.file_generate.should_not match(/\r\n/)
289         @service.file_generate.should_not match(/\r/)
290         @service.file_generate.should match(/\n/)
291       end
292       it "CRの改行コードテスト" do
293         @service.newline_character = 0
294         @service.file_generate.should_not match(/\r\n/)
295         @service.file_generate.should match(/\r/)
296         @service.file_generate.should_not match(/\n/)
297       end
298     end
299   end
300 end