my_annotations 0.5.0 → 0.5.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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" -%>
|