root/lang/ruby/ymldot/spec/ymldot_spec.rb @ 19133

Revision 19133, 7.5 kB (checked in by authorNari, 6 years ago)

imprement category describe function, add test.

Line 
1$: << File.join(File.dirname(__FILE__), "..", "lib")
2require 'ymldot'
3
4class Ymldot
5  attr_accessor :node, :entity_dict, :one_relations, :many_relations, :file_name, :config, :category
6end
7
8describe Ymldot, "で読み込んだ.ymlのリレーションがhas_manyである場合" do
9  before do
10    @ymldot = Ymldot.new("test_has_many.yml")
11  end
12
13  it "#node は正しくパースされた値が設定されていること" do
14    @ymldot.node.should == {"config" => {"font" => "MSUIGOTHIC.ttf"},
15      "tables" => [{"name" => "foo",
16                     "columns" => ["password", "group_id"],
17                     "foreignkeys" => {"belongs_to" => ["hoge"]},
18                     "dependent" => true
19                   },
20                   {"name" => "hoge",
21                     "columns" => ["password", "group_id"],
22                     "foreignkeys" => {"has_many" => ["foo"]},
23                     "dependent" => false
24                   }
25                  ]
26    }
27  end
28
29  it "#entity_dict には正しいEntityクラスが格納されていること" do
30    @ymldot.entity_dict["foo"].name.should == "foo"
31    @ymldot.entity_dict["foo"].dependent?.should be_true
32    @ymldot.entity_dict["foo"].columns.should == ["password", "group_id"]
33    @ymldot.entity_dict["foo"].foreignkeys.should == ["hogeID(FK)"]
34    @ymldot.entity_dict["hoge"].name.should == "hoge"
35    @ymldot.entity_dict["hoge"].dependent?.should be_false
36    @ymldot.entity_dict["hoge"].columns.should == ["password", "group_id"]
37    @ymldot.entity_dict["hoge"].foreignkeys.should be_empty
38  end
39
40  it "#one_relations には正しいリレーションが設定されていること" do
41    @ymldot.one_relations.should be_empty
42    @ymldot.many_relations[0][:self].name = "foo"
43    @ymldot.many_relations[0][:have].name = "hoge"
44  end
45
46  it "#dot_generate では正しいfile名が登録されていること" do
47    @ymldot.file_name.should == "test_has_many"
48  end
49
50  it "#dot_generate では正しいdot言語が出力されていること" do
51    @ymldot.dot_generate.should_not be_empty
52    @ymldot.dot_generate.should == <<'EOS'
53digraph test_has_many {
54  graph[overlap=false, splines=true]
55  node [fontname="MSUIGOTHIC.ttf"]
56  "foo" [shape=Mrecord, label="{foo|hogeID(FK)\lpassword\lgroup_id\l}"]
57  "hoge" [shape=record, label="{hoge|password\lgroup_id\l}"]
58
59  "hoge" -> "foo" [arrowtail=none arrowhead=dot headlabel="n" taillabel="1"]
60
61}
62EOS
63  end
64end
65
66describe Ymldot, "で読み込んだ.ymlのリレーションがhas_many_and_belongs_toである場合" do
67  before do
68    @ymldot = Ymldot.new("test_has_many_and_belongs_to.yml")
69  end
70
71  it "#entity_dict には正しいEntityクラスが格納されていること" do
72    @ymldot.entity_dict["one1_one2"].foreignkeys.should == ["one1ID(FK)", "one2ID(FK)"]
73  end
74
75  it "#one_relations には正しいリレーションが設定されていること" do
76    @ymldot.one_relations.should be_empty
77    @ymldot.many_relations[0][:self].name = "one1_one2"
78    @ymldot.many_relations[0][:have].name = "one1"
79    @ymldot.many_relations[1][:self].name = "one1_one2"
80    @ymldot.many_relations[1][:have].name = "one2"
81  end
82
83  it "#dot_generate では正しいdot言語が出力されていること" do
84    @ymldot.dot_generate.should_not be_empty
85    @ymldot.dot_generate.should == <<'EOS'
86digraph test_has_many_and_belongs_to {
87  graph[overlap=false, splines=true]
88  node [fontname="MSUIGOTHIC.ttf"]
89  "one1" [shape=Mrecord, label="{one1|password\lgroup_id\l}"]
90  "one2" [shape=record, label="{one2|password\lgroup_id\l}"]
91  "one1_one2" [shape=record, label="{one1_one2|one1ID(FK)\lone2ID(FK)\l}"]
92
93  "one1" -> "one1_one2" [arrowtail=none arrowhead=dot headlabel="n" taillabel="1"]
94  "one2" -> "one1_one2" [arrowtail=none arrowhead=dot headlabel="n" taillabel="1"]
95
96}
97EOS
98  end
99end
100
101describe Ymldot, "で読み込んだ.ymlのリレーションがhas_oneである場合" do
102  before do
103    @ymldot = Ymldot.new("test_has_one.yml")
104  end
105
106  it "#entity_dict には正しいEntityクラスが格納されていること" do
107    @ymldot.entity_dict["one1"].foreignkeys.should == ["one2ID(FK)"]
108  end
109
110  it "#dot_generate では正しいdot言語が出力されていること" do
111    @ymldot.dot_generate.should_not be_empty
112    @ymldot.dot_generate.should == <<'EOS'
113digraph test_has_one {
114  graph[overlap=false, splines=true]
115  node [fontname="MSUIGOTHIC.ttf"]
116  "one1" [shape=record, label="{one1|one2ID(FK)\ltitle\l}"]
117  "one2" [shape=record, label="{one2|type\l}"]
118
119  "one2" -> "one1" [arrowtail=none arrowhead=dot headlabel="1" taillabel="1"]
120
121}
122EOS
123  end
124end
125
126describe Ymldot, "で読み込んだ.ymlが日本語である場合" do
127  before do
128    @ymldot = Ymldot.new("test_jp.yml")
129  end
130
131  it "#entity_dict には正しいEntityクラスが格納されていること" do
132    @ymldot.entity_dict["コンテンツ_カテゴリ"].foreignkeys.should == ["コンテンツID(FK)", "カテゴリID(FK)"]
133  end
134
135  it "#dot_generate では正しいdot言語が出力されていること" do
136    @ymldot.dot_generate.should_not be_empty
137  end
138end
139
140describe Ymldot, "で読み込んだ.ymlにconfigがない場合" do
141  before do
142    @ymldot = Ymldot.new("test_config_none.yml")
143  end
144
145  it "#config は空のHashが格納されていること" do
146    @ymldot.config.should be_empty
147  end
148end
149
150describe Ymldot, "で読み込んだ.ymlにて一つのに複数の関係を持っている場合" do
151  before do
152    @ymldot = Ymldot.new("test_many_relation.yml")
153  end
154
155  it "#many_relations には'bar'から'baf'へのリレーションがあること" do
156    res = nil
157    @ymldot.many_relations.each{|e| res = e if e[:self].name == 'bar' and e[:have].name == 'baf' }
158    res.should_not be_nil
159  end
160
161  it "#entity_dict の'baf'には'bar'へのforeginkeyがあること" do
162     @ymldot.entity_dict["baf"].foreignkeys[0].should == "barID(FK)"
163  end
164end
165
166describe Ymldot, "で読み込んだ.ymlにてカラムが無くforeingkeyのみのEntityがあった場合" do
167  before do
168    @ymldot = Ymldot.new("test_columns_none.yml")
169  end
170
171  it "#entity_dict['foo'].columnsは空の配列であること" do
172    @ymldot.entity_dict["foo"].columns.should == []
173    @ymldot.entity_dict["hoge"].columns.should be_empty
174  end
175end
176
177describe Ymldot, "で読み込んだ.ymlにてカテゴリわけがしてがあった場合" do
178  before do
179    @ymldot = Ymldot.new("test_category.yml")
180  end
181
182  it "#category[1].labelはhogeであること" do
183    @ymldot.category[1].label.should == "hoge"
184  end
185
186  it "出力されるdotが正しいこと" do
187    @ymldot.dot_generate.should == <<'EOS'
188digraph test_category {
189  graph[overlap=false, splines=true]
190
191  "bar" [shape=record, label="{bar|fooID(FK)\lbazID(FK)\lfuge\l}"]
192  "foo" [shape=record, label="{foo|hoge\l}"]
193  subgraph cluster1 {
194    label=hoge
195    "baf" [shape=record, label="{baf|bazID(FK)\lbuge\l}"]
196    "baz" [shape=record, label="{baz|gage\l}"]
197  }
198
199  "baz" -> "baf" [arrowtail=none arrowhead=dot headlabel="n" taillabel="1"]
200  "baz" -> "bar" [arrowtail=none arrowhead=dot headlabel="n" taillabel="1"]
201  "foo" -> "bar" [arrowtail=none arrowhead=dot headlabel="n" taillabel="1"]
202
203}
204EOS
205  end
206end
207
208describe Ymldot, "で読み込んだ.ymlにてカテゴリわけがしてあり、かつ、tableが定義されていない場合" do
209  before do
210    @ymldot = Ymldot.new("test_category_none_table.yml")
211  end
212
213  it "出力されるdotが正しいこと" do
214    @ymldot.dot_generate.should == <<'EOS'
215digraph test_category_none_table {
216  graph[overlap=false, splines=true]
217
218  subgraph cluster0 {
219    label=hoge
220    "baf" [shape=record, label="{baf|buge\l}"]
221    "baz" [shape=record, label="{baz|gage\l}"]
222  }
223
224
225}
226EOS
227  end
228end
Note: See TracBrowser for help on using the browser.