my_annotations 0.5.0 → 0.5.1
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +6 -0
- data/.rvmrc +1 -0
- data/AUTHORS.rdoc +5 -0
- data/CHANGELOG.rdoc +64 -0
- data/INDEX.rdoc +17 -0
- data/generators/annotations_migration/annotations_migration_generator.rb +32 -0
- data/generators/annotations_migration/templates/migration_v1.rb +60 -0
- data/generators/annotations_migration/templates/migration_v2.rb +9 -0
- data/generators/annotations_migration/templates/migration_v3.rb +74 -0
- data/generators/annotations_migration/templates/migration_v4.rb +13 -0
- data/install.rb +1 -0
- data/lib/annotations/acts_as_annotatable.rb +271 -0
- data/lib/annotations/acts_as_annotation_source.rb +117 -0
- data/lib/annotations/acts_as_annotation_value.rb +115 -0
- data/lib/annotations/config.rb +148 -0
- data/lib/annotations/routing.rb +8 -0
- data/lib/annotations/util.rb +82 -0
- data/lib/annotations_version_fu.rb +119 -0
- data/lib/app/controllers/annotations_controller.rb +162 -0
- data/lib/app/controllers/application_controller.rb +2 -0
- data/lib/app/helpers/application_helper.rb +2 -0
- data/lib/app/models/annotation.rb +413 -0
- data/lib/app/models/annotation_attribute.rb +37 -0
- data/lib/app/models/annotation_value_seed.rb +48 -0
- data/lib/app/models/number_value.rb +23 -0
- data/lib/app/models/text_value.rb +23 -0
- data/my_annotations.gemspec +4 -9
- data/rails/init.rb +8 -0
- data/test/acts_as_annotatable_test.rb +186 -0
- data/test/acts_as_annotation_source_test.rb +84 -0
- data/test/acts_as_annotation_value_test.rb +17 -0
- data/test/annotation_attribute_test.rb +22 -0
- data/test/annotation_test.rb +213 -0
- data/test/annotation_value_seed_test.rb +14 -0
- data/test/annotation_version_test.rb +39 -0
- data/test/annotations_controller_test.rb +27 -0
- data/test/app_root/app/controllers/application_controller.rb +9 -0
- data/test/app_root/app/models/book.rb +5 -0
- data/test/app_root/app/models/chapter.rb +5 -0
- data/test/app_root/app/models/group.rb +3 -0
- data/test/app_root/app/models/tag.rb +6 -0
- data/test/app_root/app/models/user.rb +3 -0
- data/test/app_root/app/views/annotations/edit.html.erb +12 -0
- data/test/app_root/app/views/annotations/index.html.erb +1 -0
- data/test/app_root/app/views/annotations/new.html.erb +11 -0
- data/test/app_root/app/views/annotations/show.html.erb +3 -0
- data/test/app_root/config/boot.rb +115 -0
- data/test/app_root/config/environment.rb +16 -0
- data/test/app_root/config/environments/mysql.rb +0 -0
- data/test/app_root/config/routes.rb +4 -0
- data/test/app_root/db/migrate/001_create_test_models.rb +38 -0
- data/test/app_root/db/migrate/002_annotations_migration_v1.rb +60 -0
- data/test/app_root/db/migrate/003_annotations_migration_v2.rb +9 -0
- data/test/app_root/db/migrate/004_annotations_migration_v3.rb +72 -0
- data/test/config_test.rb +383 -0
- data/test/fixtures/annotation_attributes.yml +49 -0
- data/test/fixtures/annotation_value_seeds.csv +16 -0
- data/test/fixtures/annotation_versions.yml +259 -0
- data/test/fixtures/annotations.yml +239 -0
- data/test/fixtures/books.yml +13 -0
- data/test/fixtures/chapters.yml +27 -0
- data/test/fixtures/groups.yml +7 -0
- data/test/fixtures/number_value_versions.csv +2 -0
- data/test/fixtures/number_values.csv +2 -0
- data/test/fixtures/text_value_versions.csv +35 -0
- data/test/fixtures/text_values.csv +35 -0
- data/test/fixtures/users.yml +8 -0
- data/test/number_value_version_test.rb +40 -0
- data/test/routing_test.rb +27 -0
- data/test/test_helper.rb +41 -0
- data/test/text_value_version_test.rb +40 -0
- metadata +77 -7
@@ -0,0 +1,186 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/test_helper.rb'
|
2
|
+
|
3
|
+
class ActsAsAnnotatableTest < ActiveSupport::TestCase
|
4
|
+
|
5
|
+
def test_has_many_annotations_association
|
6
|
+
assert_equal 6, books(:h).annotations.length
|
7
|
+
assert_equal 5, books(:r).annotations.length
|
8
|
+
assert_equal 2, chapters(:bh_c10).annotations.length
|
9
|
+
assert_equal 4, chapters(:br_c2).annotations.length
|
10
|
+
end
|
11
|
+
|
12
|
+
def test_find_annotations_for_class_method
|
13
|
+
assert_equal 6, Book.find_annotations_for(books(:h).id).length
|
14
|
+
assert_equal 6, Book.find_annotations_for(books(:h).id, true).length
|
15
|
+
assert_equal 5, Book.find_annotations_for(books(:r).id).length
|
16
|
+
assert_equal 5, Book.find_annotations_for(books(:r).id, true).length
|
17
|
+
assert_equal 2, Chapter.find_annotations_for(chapters(:bh_c10).id).length
|
18
|
+
assert_equal 2, Chapter.find_annotations_for(chapters(:bh_c10).id, true).length
|
19
|
+
assert_equal 4, Chapter.find_annotations_for(chapters(:br_c2).id).length
|
20
|
+
assert_equal 4, Chapter.find_annotations_for(chapters(:br_c2).id, true).length
|
21
|
+
end
|
22
|
+
|
23
|
+
def test_find_annotations_by_class_method
|
24
|
+
assert_equal 4, Book.find_annotations_by("User", users(:jane)).length
|
25
|
+
assert_equal 4, Book.find_annotations_by("User", users(:jane), true).length
|
26
|
+
assert_equal 1, Book.find_annotations_by("Group", groups(:sci_fi_geeks)).length
|
27
|
+
assert_equal 1, Book.find_annotations_by("Group", groups(:sci_fi_geeks), true).length
|
28
|
+
assert_equal 3, Chapter.find_annotations_by("User", users(:john)).length
|
29
|
+
assert_equal 3, Chapter.find_annotations_by("User", users(:john), true).length
|
30
|
+
assert_equal 2, Chapter.find_annotations_by("Group", groups(:classical_fans)).length
|
31
|
+
assert_equal 2, Chapter.find_annotations_by("Group", groups(:classical_fans), true).length
|
32
|
+
end
|
33
|
+
|
34
|
+
def test_annotatable_name_field_class_attribute
|
35
|
+
h = books(:h)
|
36
|
+
|
37
|
+
hs = Book.find(:all, :conditions => { Book.annotatable_name_field.to_sym => h.title })
|
38
|
+
|
39
|
+
assert !hs.empty?
|
40
|
+
end
|
41
|
+
|
42
|
+
def test_annotatable_name_instance_method
|
43
|
+
assert_equal "Learning Ruby in 2 Seconds", books(:r).annotatable_name
|
44
|
+
assert_equal "Hashing It Up", chapters(:br_c2).annotatable_name
|
45
|
+
end
|
46
|
+
|
47
|
+
def test_latest_annotations_instance_method
|
48
|
+
assert_equal 6, books(:h).latest_annotations.length
|
49
|
+
assert_equal 6, books(:h).latest_annotations(nil, true).length
|
50
|
+
assert_equal 2, chapters(:bh_c10).latest_annotations.length
|
51
|
+
assert_equal 2, chapters(:bh_c10).latest_annotations(nil, true).length
|
52
|
+
|
53
|
+
assert_equal 2, books(:h).latest_annotations(2).length
|
54
|
+
assert_equal 2, books(:h).latest_annotations(2, true).length
|
55
|
+
end
|
56
|
+
|
57
|
+
def test_annotations_with_attribute_instance_method
|
58
|
+
assert_equal 2, books(:h).annotations_with_attribute("tag").length
|
59
|
+
assert_equal 2, books(:h).annotations_with_attribute("tag", true).length
|
60
|
+
assert_equal 0, books(:r).annotations_with_attribute("doesnt_exist").length
|
61
|
+
assert_equal 0, books(:r).annotations_with_attribute("doesnt_exist", true).length
|
62
|
+
assert_equal 1, chapters(:bh_c10).annotations_with_attribute("endingType").length
|
63
|
+
assert_equal 1, chapters(:bh_c10).annotations_with_attribute("endingType", true).length
|
64
|
+
assert_equal 1, chapters(:br_c202).annotations_with_attribute("Title").length
|
65
|
+
assert_equal 1, chapters(:br_c202).annotations_with_attribute("Title", true).length
|
66
|
+
end
|
67
|
+
|
68
|
+
def test_annotations_with_attributes_instance_method
|
69
|
+
assert_equal 4, books(:h).annotations_with_attributes([ "tag", "summary", "LENGTH" ]).length
|
70
|
+
assert_equal 4, books(:h).annotations_with_attributes([ "tag", "summary", "LENGTH" ], true).length
|
71
|
+
assert_equal 0, books(:h).annotations_with_attributes([ "doesnt_exist", "also doesn't exist" ]).length
|
72
|
+
assert_equal 0, books(:h).annotations_with_attributes([ "doesnt_exist", "also doesn't exist" ], true).length
|
73
|
+
assert_equal 1, chapters(:bh_c10).annotations_with_attributes([ "endingType" ]).length
|
74
|
+
assert_equal 1, chapters(:bh_c10).annotations_with_attributes([ "endingType" ], true).length
|
75
|
+
assert_equal 2, chapters(:br_c202).annotations_with_attributes([ "Title", "complexity", "doesn't exist but still"]).length
|
76
|
+
assert_equal 2, chapters(:br_c202).annotations_with_attributes([ "Title", "complexity", "doesn't exist but still"], true).length
|
77
|
+
end
|
78
|
+
|
79
|
+
def test_annotations_with_attribute_and_by_source_instance_method
|
80
|
+
assert_equal 1, books(:h).annotations_with_attribute_and_by_source("tag", users(:jane)).length
|
81
|
+
assert_equal 1, books(:h).annotations_with_attribute_and_by_source("tag", users(:jane), true).length
|
82
|
+
assert_equal 0, books(:r).annotations_with_attribute_and_by_source("doesnt_exist", users(:jane)).length
|
83
|
+
assert_equal 0, books(:r).annotations_with_attribute_and_by_source("doesnt_exist", users(:jane), true).length
|
84
|
+
assert_equal 1, chapters(:bh_c10).annotations_with_attribute_and_by_source("endingType", groups(:sci_fi_geeks)).length
|
85
|
+
assert_equal 1, chapters(:bh_c10).annotations_with_attribute_and_by_source("endingType", groups(:sci_fi_geeks), true).length
|
86
|
+
assert_equal 1, chapters(:br_c202).annotations_with_attribute_and_by_source("Title", users(:john)).length
|
87
|
+
assert_equal 1, chapters(:br_c202).annotations_with_attribute_and_by_source("Title", users(:john), true).length
|
88
|
+
end
|
89
|
+
|
90
|
+
def test_all_annotations_excluding_attributes
|
91
|
+
assert_equal 4, books(:h).all_annotations_excluding_attributes([ "TITLE", "length" ]).length
|
92
|
+
assert_equal 4, books(:h).all_annotations_excluding_attributes([ "TITLE", "length" ], true).length
|
93
|
+
assert_equal 5, books(:r).all_annotations_excluding_attributes([ "doesnt_exist" ]).length
|
94
|
+
assert_equal 5, books(:r).all_annotations_excluding_attributes([ "doesnt_exist" ], true).length
|
95
|
+
assert_equal 1, chapters(:bh_c10).all_annotations_excluding_attributes([ "endingType" ]).length
|
96
|
+
assert_equal 1, chapters(:bh_c10).all_annotations_excluding_attributes([ "endingType" ], true).length
|
97
|
+
assert_equal 2, chapters(:br_c202).all_annotations_excluding_attributes([ "tag", "doesn't exist but who cares" ]).length
|
98
|
+
assert_equal 2, chapters(:br_c202).all_annotations_excluding_attributes([ "tag", "doesn't exist but who cares" ], true).length
|
99
|
+
end
|
100
|
+
|
101
|
+
def test_count_annotations_by_instance_method
|
102
|
+
assert_equal 6, books(:h).count_annotations_by("all")
|
103
|
+
assert_equal 2, books(:h).count_annotations_by("Group")
|
104
|
+
assert_equal 4, chapters(:br_c2).count_annotations_by("All")
|
105
|
+
assert_equal 3, chapters(:br_c2).count_annotations_by("User")
|
106
|
+
end
|
107
|
+
|
108
|
+
def test_create_annotations_instance_method
|
109
|
+
bk = Book.create
|
110
|
+
|
111
|
+
data1 = {
|
112
|
+
:test1 => "test123",
|
113
|
+
"test2" => nil,
|
114
|
+
" test3" => "",
|
115
|
+
:foo => 1,
|
116
|
+
:bar => [ "one", "two", 3, "", nil ]
|
117
|
+
}
|
118
|
+
|
119
|
+
anns1 = bk.create_annotations(data1, users(:jane))
|
120
|
+
|
121
|
+
assert_equal 5, anns1.length
|
122
|
+
anns1.each do |a|
|
123
|
+
assert_kind_of Annotation, a
|
124
|
+
end
|
125
|
+
assert_equal 5, bk.annotations.length
|
126
|
+
|
127
|
+
|
128
|
+
data2 = { :tagx => "ko", :tagy => [ "oii", "tuo" ] }
|
129
|
+
|
130
|
+
anns2 = bk.create_annotations(data2, users(:jane))
|
131
|
+
|
132
|
+
assert_equal 3, anns2.length
|
133
|
+
anns2.each do |a|
|
134
|
+
assert_kind_of Annotation, a
|
135
|
+
end
|
136
|
+
assert_equal 8, bk.annotations(true).length
|
137
|
+
|
138
|
+
|
139
|
+
data3 = { :tagx => "ko", :tagy => [ "oii", "piopjpjnp" ] }
|
140
|
+
|
141
|
+
anns3 = bk.create_annotations(data3, users(:jane))
|
142
|
+
|
143
|
+
assert_equal 1, anns3.length
|
144
|
+
anns2.each do |a|
|
145
|
+
assert_kind_of Annotation, a
|
146
|
+
end
|
147
|
+
assert_equal 9, bk.annotations(true).length
|
148
|
+
end
|
149
|
+
|
150
|
+
def test_adding_of_annotation
|
151
|
+
ch = chapters(:bh_c10)
|
152
|
+
assert_equal 2, ch.annotations.length
|
153
|
+
ann1 = Annotation.new(:attribute_id => AnnotationAttribute.find_or_create_by_name("tag").id,
|
154
|
+
:source_type => "User",
|
155
|
+
:source_id => 1)
|
156
|
+
ann1.value = "test"
|
157
|
+
ch.annotations << ann1
|
158
|
+
|
159
|
+
ann2 = Annotation.new(:attribute_name => "description",
|
160
|
+
:source_type => "User",
|
161
|
+
:source_id => 2)
|
162
|
+
ann2.value = "test2"
|
163
|
+
ch.annotations << ann2
|
164
|
+
|
165
|
+
assert_not_nil(ann1)
|
166
|
+
assert_not_nil(ann2)
|
167
|
+
assert_equal 4, ch.annotations(true).length
|
168
|
+
end
|
169
|
+
|
170
|
+
def test_annotations_hash_method
|
171
|
+
book1 = books(:h)
|
172
|
+
expected_hash1 = {
|
173
|
+
"Summary" => "Something interesting happens",
|
174
|
+
"length" => 345,
|
175
|
+
"Title" => "Harry Potter and the Exploding Men's Locker Room",
|
176
|
+
"Tag" => [ "wizadry", "amusing rhetoric" ],
|
177
|
+
"rating" => "4/5"
|
178
|
+
}
|
179
|
+
assert_equal expected_hash1, book1.annotations_hash
|
180
|
+
|
181
|
+
book2 = Book.create(:title => "YAB")
|
182
|
+
expected_hash2 = { }
|
183
|
+
assert_equal expected_hash2, book2.annotations_hash
|
184
|
+
end
|
185
|
+
|
186
|
+
end
|
@@ -0,0 +1,84 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/test_helper.rb'
|
2
|
+
|
3
|
+
class ActsAsAnnotationSourceTest < ActiveSupport::TestCase
|
4
|
+
|
5
|
+
def test_has_many_annotations_association
|
6
|
+
assert_equal 7, users(:john).annotations_by.length
|
7
|
+
assert_equal 6, users(:jane).annotations_by.length
|
8
|
+
assert_equal 3, groups(:sci_fi_geeks).annotations_by.length
|
9
|
+
assert_equal 4, groups(:classical_fans).annotations_by.length
|
10
|
+
end
|
11
|
+
|
12
|
+
def test_annotations_by_class_method
|
13
|
+
assert_equal 7, User.annotations_by(users(:john).id).length
|
14
|
+
assert_equal 7, User.annotations_by(users(:john).id, true).length
|
15
|
+
assert_equal 6, User.annotations_by(users(:jane).id).length
|
16
|
+
assert_equal 6, User.annotations_by(users(:jane).id, true).length
|
17
|
+
assert_equal 3, Group.annotations_by(groups(:sci_fi_geeks).id).length
|
18
|
+
assert_equal 3, Group.annotations_by(groups(:sci_fi_geeks).id, true).length
|
19
|
+
assert_equal 4, Group.annotations_by(groups(:classical_fans).id).length
|
20
|
+
assert_equal 4, Group.annotations_by(groups(:classical_fans).id, true).length
|
21
|
+
end
|
22
|
+
|
23
|
+
def test_annotations_for_class_method
|
24
|
+
assert_equal 4, User.annotations_for("Book", books(:h).id).length
|
25
|
+
assert_equal 4, User.annotations_for("Book", books(:h).id, true).length
|
26
|
+
assert_equal 1, User.annotations_for("Chapter", chapters(:bh_c10).id).length
|
27
|
+
assert_equal 1, User.annotations_for("Chapter", chapters(:bh_c10).id, true).length
|
28
|
+
assert_equal 1, Group.annotations_for("Book", books(:r).id).length
|
29
|
+
assert_equal 1, Group.annotations_for("Book", books(:r).id, true).length
|
30
|
+
assert_equal 1, Group.annotations_for("Chapter", chapters(:br_c2).id).length
|
31
|
+
assert_equal 1, Group.annotations_for("Chapter", chapters(:br_c2).id, true).length
|
32
|
+
end
|
33
|
+
|
34
|
+
def test_latest_annotations_instance_method
|
35
|
+
assert_equal 6, users(:jane).latest_annotations.length
|
36
|
+
assert_equal 6, users(:jane).latest_annotations(nil, true).length
|
37
|
+
assert_equal 3, groups(:sci_fi_geeks).latest_annotations.length
|
38
|
+
assert_equal 3, groups(:sci_fi_geeks).latest_annotations(nil, true).length
|
39
|
+
|
40
|
+
assert_equal 3, users(:john).latest_annotations(3).length
|
41
|
+
assert_equal 3, users(:john).latest_annotations(3, true).length
|
42
|
+
end
|
43
|
+
|
44
|
+
def test_annotation_source_name_instance_method
|
45
|
+
assert_equal "john", users(:john).annotation_source_name
|
46
|
+
assert_equal "Classical Fans", groups(:classical_fans).annotation_source_name
|
47
|
+
end
|
48
|
+
|
49
|
+
def test_adding_of_annotation
|
50
|
+
us = users(:jane)
|
51
|
+
assert_equal 6, us.annotations_by.length
|
52
|
+
ann1 = Annotation.new(:attribute_id => AnnotationAttribute.find_or_create_by_name("tag").id,
|
53
|
+
:annotatable_type => "Book",
|
54
|
+
:annotatable_id => 1)
|
55
|
+
ann1.value = "test"
|
56
|
+
us.annotations_by << ann1
|
57
|
+
|
58
|
+
ann2 = Annotation.new(:attribute_name => "description",
|
59
|
+
:annotatable_type => "Book",
|
60
|
+
:annotatable_id => 2)
|
61
|
+
ann2.value = "test2"
|
62
|
+
us.annotations_by << ann2
|
63
|
+
|
64
|
+
assert_not_nil(ann1)
|
65
|
+
assert_not_nil(ann2)
|
66
|
+
assert_equal 8, us.annotations_by(true).length
|
67
|
+
end
|
68
|
+
|
69
|
+
def test_annotations_by_hash_method
|
70
|
+
user1 = users(:jane)
|
71
|
+
expected_hash1 = {
|
72
|
+
"Tag" => [ "programming", "wizadry" ],
|
73
|
+
"Note" => "Remember to buy milk!",
|
74
|
+
"Title" => [ "Ruby Hashes", "And It All Falls Down" ],
|
75
|
+
"rating" => "4/5"
|
76
|
+
}
|
77
|
+
assert_equal expected_hash1, user1.annotations_by_hash
|
78
|
+
|
79
|
+
user2 = User.create(:name => "Jim")
|
80
|
+
expected_hash2 = { }
|
81
|
+
assert_equal expected_hash2, user2.annotations_by_hash
|
82
|
+
end
|
83
|
+
|
84
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/test_helper.rb'
|
2
|
+
|
3
|
+
class ActsAsAnnotationValueTest < ActiveSupport::TestCase
|
4
|
+
|
5
|
+
# TODO: duplication tests!!
|
6
|
+
|
7
|
+
def test_ann_content_setter
|
8
|
+
val = Annotation.first.value
|
9
|
+
|
10
|
+
new_content = "hellow world, testing test_ann_content_setter"
|
11
|
+
|
12
|
+
val.ann_content = new_content
|
13
|
+
|
14
|
+
assert_equal new_content, val.send(val.class.ann_value_content_field)
|
15
|
+
end
|
16
|
+
|
17
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/test_helper.rb'
|
2
|
+
|
3
|
+
class AnnotationAttributeTest < ActiveSupport::TestCase
|
4
|
+
|
5
|
+
def test_annotation_attribute_class_loaded
|
6
|
+
assert_kind_of AnnotationAttribute, AnnotationAttribute.new
|
7
|
+
end
|
8
|
+
|
9
|
+
def test has_many_annotations_association
|
10
|
+
assert_equal 6, annotations_attributes(:aa_tag).annotations.length
|
11
|
+
assert_equal 1, annotations_attributes(:aa_contextualtag).annotations.length
|
12
|
+
end
|
13
|
+
|
14
|
+
def test_add_duplicates
|
15
|
+
assert_not_nil AnnotationAttribute.find_by_name("tag")
|
16
|
+
|
17
|
+
assert_raise ActiveRecord::RecordInvalid do
|
18
|
+
AnnotationAttribute.create!(:name => 'Tag')
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
end
|
@@ -0,0 +1,213 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/test_helper.rb'
|
2
|
+
|
3
|
+
class AnnotationTest < ActiveSupport::TestCase
|
4
|
+
|
5
|
+
def test_annotation_class_loaded
|
6
|
+
assert_kind_of Annotation, Annotation.new
|
7
|
+
end
|
8
|
+
|
9
|
+
def test_fixtures_loaded
|
10
|
+
assert_equal 2, Book.count(:all)
|
11
|
+
assert_equal 4, Chapter.count(:all)
|
12
|
+
assert_equal 2, User.count(:all)
|
13
|
+
assert_equal 2, Group.count(:all)
|
14
|
+
assert_equal 20, Annotation.count(:all)
|
15
|
+
|
16
|
+
assert_equal 1, books(:h).id
|
17
|
+
assert_equal 2, chapters(:bh_c10).id
|
18
|
+
assert_equal 2, users(:jane).id
|
19
|
+
assert_equal 1, groups(:sci_fi_geeks).id
|
20
|
+
#assert_equal 2, annotations(:bh_length_1).id # Doesn't work due to the autonumbering used in the annotations fixtures.
|
21
|
+
end
|
22
|
+
|
23
|
+
def test_belongs_to_annotatable_association
|
24
|
+
assert_equal books(:h), annotations(:bh_summary_1).annotatable
|
25
|
+
assert_equal books(:r), annotations(:br_author_1).annotatable
|
26
|
+
assert_equal chapters(:bh_c10), annotations(:bh_c10_title_1).annotatable
|
27
|
+
assert_equal chapters(:br_c2), annotations(:br_c2_tag_2).annotatable
|
28
|
+
end
|
29
|
+
|
30
|
+
def test_belongs_to_source_association
|
31
|
+
assert_equal users(:john), annotations(:bh_title_1).source
|
32
|
+
assert_equal users(:jane), annotations(:br_c2_title_2).source
|
33
|
+
assert_equal groups(:sci_fi_geeks), annotations(:br_summary_2).source
|
34
|
+
assert_equal groups(:classical_fans), annotations(:br_c202_tag_1).source
|
35
|
+
end
|
36
|
+
|
37
|
+
def test_belongs_to_value_association
|
38
|
+
assert_equal TextValue.find(33), annotations(:br_c202_title_1).value
|
39
|
+
assert_equal TextValue.find(23), annotations(:br_author_1).value
|
40
|
+
assert_equal TextValue.find(19), annotations(:bh_tag_1).value
|
41
|
+
assert_equal NumberValue.find(1), annotations(:bh_length_1).value
|
42
|
+
end
|
43
|
+
|
44
|
+
def test_belongs_to_attribute_association
|
45
|
+
assert_equal annotation_attributes(:aa_length), annotations(:bh_length_1).attribute
|
46
|
+
assert_equal annotation_attributes(:aa_tag), annotations(:br_tag_1).attribute
|
47
|
+
end
|
48
|
+
|
49
|
+
def test_include_values_named_scope
|
50
|
+
assert_equal 20, Annotation.include_values.length
|
51
|
+
assert_not_nil Annotation.include_values.find(annotations(:bh_title_1).id)
|
52
|
+
end
|
53
|
+
|
54
|
+
def test_by_source_named_scope_finder
|
55
|
+
assert_equal 7, Annotation.by_source('User', users(:john).id).length
|
56
|
+
assert_equal 6, Annotation.by_source('User', users(:jane).id).length
|
57
|
+
assert_equal 3, Annotation.by_source('Group', groups(:sci_fi_geeks).id).length
|
58
|
+
assert_equal 4, Annotation.by_source('Group', groups(:classical_fans).id).length
|
59
|
+
end
|
60
|
+
|
61
|
+
def test_for_annotatable_named_scope_finder
|
62
|
+
assert_equal 6, Annotation.for_annotatable('Book', books(:h).id).length
|
63
|
+
assert_equal 5, Annotation.for_annotatable('Book', books(:r).id).length
|
64
|
+
assert_equal 3, Annotation.for_annotatable('Chapter', chapters(:br_c202).id).length
|
65
|
+
assert_equal 0, Annotation.for_annotatable('Chapter', chapters(:bh_c1).id).length
|
66
|
+
end
|
67
|
+
|
68
|
+
def test_with_attribute_name_named_scope_finder
|
69
|
+
assert_equal 6, Annotation.with_attribute_name('tag').length
|
70
|
+
assert_equal 5, Annotation.with_attribute_name('title').length
|
71
|
+
assert_equal 1, Annotation.with_attribute_name('note').length
|
72
|
+
assert_equal 0, Annotation.with_attribute_name('does_not_exist_zzzzzz').length
|
73
|
+
end
|
74
|
+
|
75
|
+
def test_find_annotatable_class_method
|
76
|
+
assert_equal books(:h), Annotation.find_annotatable('Book', books(:h).id)
|
77
|
+
assert_equal books(:r), Annotation.find_annotatable('Book', books(:r).id)
|
78
|
+
assert_equal chapters(:bh_c10), Annotation.find_annotatable('Chapter', chapters(:bh_c10).id)
|
79
|
+
assert_equal chapters(:br_c2), Annotation.find_annotatable('Chapter', chapters(:br_c2).id)
|
80
|
+
end
|
81
|
+
|
82
|
+
def test_attribute_name_getter
|
83
|
+
assert_equal "tag", annotations(:bh_tag_2).attribute_name.downcase
|
84
|
+
assert_equal "title", annotations(:bh_c10_title_1).attribute_name.downcase
|
85
|
+
end
|
86
|
+
|
87
|
+
def test_attribute_name_setter
|
88
|
+
attr_name = "Testing attribute name setter"
|
89
|
+
|
90
|
+
ann = Annotation.new
|
91
|
+
ann.attribute_name = attr_name
|
92
|
+
|
93
|
+
attr = AnnotationAttribute.find_by_name(attr_name)
|
94
|
+
|
95
|
+
assert_equal ann.attribute, attr
|
96
|
+
end
|
97
|
+
|
98
|
+
def test_annotation_create_with_implicit_value
|
99
|
+
source = users(:john)
|
100
|
+
|
101
|
+
ann = Annotation.new(:attribute_name => "tag",
|
102
|
+
:value => "hot",
|
103
|
+
:source_type => source.class.name,
|
104
|
+
:source_id => source.id,
|
105
|
+
:annotatable_type => "Book",
|
106
|
+
:annotatable_id => 1)
|
107
|
+
|
108
|
+
assert ann.valid?
|
109
|
+
assert ann.save
|
110
|
+
|
111
|
+
ann_again = Annotation.find_by_id(ann.id)
|
112
|
+
|
113
|
+
assert_not_nil ann_again
|
114
|
+
assert_equal "User", ann_again.source_type
|
115
|
+
assert_equal "TextValue", ann_again.value_type
|
116
|
+
assert_not_nil ann_again.value
|
117
|
+
assert_equal "hot", ann_again.value_content
|
118
|
+
end
|
119
|
+
|
120
|
+
def test_annotation_create_with_explicit_value
|
121
|
+
source = users(:john)
|
122
|
+
|
123
|
+
val = NumberValue.new :number => 0
|
124
|
+
|
125
|
+
ann = Annotation.new(:attribute_name => "rating",
|
126
|
+
:value => val,
|
127
|
+
:source_type => source.class.name,
|
128
|
+
:source_id => source.id,
|
129
|
+
:annotatable_type => "Book",
|
130
|
+
:annotatable_id => 1)
|
131
|
+
|
132
|
+
assert ann.valid?
|
133
|
+
assert ann.save
|
134
|
+
|
135
|
+
ann_again = Annotation.find_by_id(ann.id)
|
136
|
+
|
137
|
+
assert_not_nil ann_again
|
138
|
+
assert_equal "User", ann_again.source_type
|
139
|
+
assert_equal "NumberValue", ann_again.value_type
|
140
|
+
assert_not_nil ann_again.value
|
141
|
+
assert_equal 0, ann_again.value_content
|
142
|
+
end
|
143
|
+
|
144
|
+
def test_cannot_create_annotation_with_invalid_annotatable
|
145
|
+
source = users(:john)
|
146
|
+
|
147
|
+
ann1 = Annotation.new(:attribute_name => "tag",
|
148
|
+
:value => "hot",
|
149
|
+
:source_type => source.class.name,
|
150
|
+
:source_id => source.id,
|
151
|
+
:annotatable_type => "Book",
|
152
|
+
:annotatable_id => 100)
|
153
|
+
|
154
|
+
assert ann1.invalid? # TODO: check for the specific error, not just that it's invalid!
|
155
|
+
assert !ann1.save
|
156
|
+
|
157
|
+
ann2 = Annotation.new(:attribute_name => "tag",
|
158
|
+
:value => "hot",
|
159
|
+
:source_type => source.class.name,
|
160
|
+
:source_id => source.id,
|
161
|
+
:annotatable_type => "Whale",
|
162
|
+
:annotatable_id => 1)
|
163
|
+
|
164
|
+
assert ann2.invalid? # TODO: check for the specific error, not just that it's invalid!
|
165
|
+
assert !ann2.save
|
166
|
+
end
|
167
|
+
|
168
|
+
def test_cannot_create_annotation_with_invalid_source
|
169
|
+
bk = books(:h)
|
170
|
+
|
171
|
+
ann1 = Annotation.new(:attribute_name => "tag",
|
172
|
+
:value => "hot",
|
173
|
+
:source_type => "User",
|
174
|
+
:source_id => 100,
|
175
|
+
:annotatable_type => bk.class.name,
|
176
|
+
:annotatable_id => bk.id)
|
177
|
+
|
178
|
+
assert ann1.invalid? # TODO: check for the specific error, not just that it's invalid!
|
179
|
+
assert !ann1.save
|
180
|
+
|
181
|
+
ann2 = Annotation.new(:attribute_name => "tag",
|
182
|
+
:value => "hot",
|
183
|
+
:source_type => "Monkey",
|
184
|
+
:source_id => 1,
|
185
|
+
:annotatable_type => bk.class.name,
|
186
|
+
:annotatable_id => bk.id)
|
187
|
+
|
188
|
+
assert ann2.invalid? # TODO: check for the specific error, not just that it's invalid!
|
189
|
+
assert !ann2.save
|
190
|
+
end
|
191
|
+
|
192
|
+
def test_cannot_create_annotation_with_invalid_value
|
193
|
+
bk = books(:h)
|
194
|
+
source = users(:john)
|
195
|
+
|
196
|
+
ann = Annotation.new(:attribute_name => "tag")
|
197
|
+
ann.annotatable = bk
|
198
|
+
ann.source = source
|
199
|
+
ann.value = nil
|
200
|
+
|
201
|
+
assert ann.invalid? # TODO: check for the specific error, not just that it's invalid!
|
202
|
+
assert !ann.save
|
203
|
+
|
204
|
+
ann.value = bk
|
205
|
+
|
206
|
+
assert ann.invalid? # TODO: check for the specific error, not just that it's invalid!
|
207
|
+
assert !ann.save
|
208
|
+
end
|
209
|
+
|
210
|
+
def test_reload_versioned_columns
|
211
|
+
assert Annotation.reload_versioned_columns_info
|
212
|
+
end
|
213
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/test_helper.rb'
|
2
|
+
|
3
|
+
class AnnotationValueSeedTest < ActiveSupport::TestCase
|
4
|
+
|
5
|
+
def test_annotation_value_seed_class_loaded
|
6
|
+
assert_kind_of AnnotationValueSeed, AnnotationValueSeed.new
|
7
|
+
end
|
8
|
+
|
9
|
+
def test_find_by_key
|
10
|
+
assert_equal 10, AnnotationValueSeed.find_by_attribute_name("tag").length
|
11
|
+
assert_equal 5, AnnotationValueSeed.find_by_attribute_name("Author").length
|
12
|
+
end
|
13
|
+
|
14
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/test_helper.rb'
|
2
|
+
|
3
|
+
class AnnotationVersionTest < ActiveSupport::TestCase
|
4
|
+
|
5
|
+
def test_annotation_version_class_loaded
|
6
|
+
assert_kind_of Annotation::Version, Annotation::Version.new
|
7
|
+
end
|
8
|
+
|
9
|
+
def test_versioning_on_update
|
10
|
+
ann = annotations(:bh_title_1)
|
11
|
+
orig_value_id = ann.value_id
|
12
|
+
orig_content = ann.value_content
|
13
|
+
new_content = "Harry Potter IIIIIII"
|
14
|
+
|
15
|
+
# Check number of versions
|
16
|
+
assert_equal 1, ann.versions.length
|
17
|
+
|
18
|
+
# Update the value and check that a version has been created
|
19
|
+
|
20
|
+
ann.value = new_content
|
21
|
+
ann.version_creator = users(:john)
|
22
|
+
|
23
|
+
assert ann.valid?
|
24
|
+
|
25
|
+
assert ann.save
|
26
|
+
|
27
|
+
assert_equal 2, ann.versions.length
|
28
|
+
assert_equal new_content, ann.value_content
|
29
|
+
assert_equal 2, ann.versions.latest.version
|
30
|
+
assert_equal new_content, ann.versions.latest.value_content
|
31
|
+
assert_equal 1, ann.versions.latest.previous.version
|
32
|
+
assert_equal orig_content, ann.versions.latest.previous.value_content
|
33
|
+
assert_equal orig_value_id, ann.versions.latest.previous.value_id
|
34
|
+
assert_equal users(:john).id, ann.version_creator_id
|
35
|
+
assert_equal users(:john).id, ann.versions.latest.version_creator_id
|
36
|
+
assert_equal nil, ann.versions.latest.previous.version_creator_id
|
37
|
+
end
|
38
|
+
|
39
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/test_helper.rb'
|
2
|
+
require 'annotations_controller'
|
3
|
+
require 'action_controller/test_process'
|
4
|
+
|
5
|
+
# Manually override the rescue_action in the controller to raise the exception back.
|
6
|
+
class AnnotationsController; def rescue_action(e) raise e end; end
|
7
|
+
|
8
|
+
class AnnotationsControllerTest < ActionController::TestCase
|
9
|
+
def setup
|
10
|
+
ActionController::Routing::Routes.draw do |map|
|
11
|
+
Annotations.map_routes(map)
|
12
|
+
end
|
13
|
+
|
14
|
+
@controller = AnnotationsController.new
|
15
|
+
@request = ActionController::TestRequest.new
|
16
|
+
@response = ActionController::TestResponse.new
|
17
|
+
end
|
18
|
+
|
19
|
+
def test_current_user_is available
|
20
|
+
assert_not_nil @controller.current_user
|
21
|
+
end
|
22
|
+
|
23
|
+
def test_index
|
24
|
+
get :index
|
25
|
+
assert_response :success
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1 @@
|
|
1
|
+
<%= pluralize @annotations.length, "annotation" -%>
|