ro-bundle 0.1.0
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.
- checksums.yaml +15 -0
- data/.gitignore +11 -0
- data/.ruby-env +1 -0
- data/.ruby-gemset +2 -0
- data/.ruby-version +2 -0
- data/.travis.yml +11 -0
- data/Changes.rdoc +129 -0
- data/Gemfile +11 -0
- data/Licence.rdoc +29 -0
- data/Rakefile +29 -0
- data/ReadMe.rdoc +57 -0
- data/bin/dir2ro +48 -0
- data/bin/ro-bundle-info +45 -0
- data/bin/verify-ro-bundle +27 -0
- data/bin/zip2ro +57 -0
- data/lib/ro-bundle.rb +45 -0
- data/lib/ro-bundle/exceptions.rb +30 -0
- data/lib/ro-bundle/file.rb +323 -0
- data/lib/ro-bundle/ro/agent.rb +73 -0
- data/lib/ro-bundle/ro/aggregate.rb +107 -0
- data/lib/ro-bundle/ro/annotation.rb +89 -0
- data/lib/ro-bundle/ro/directory.rb +120 -0
- data/lib/ro-bundle/ro/manifest.rb +338 -0
- data/lib/ro-bundle/ro/provenance.rb +153 -0
- data/lib/ro-bundle/util.rb +57 -0
- data/lib/ro-bundle/version.rb +13 -0
- data/ro-bundle.gemspec +43 -0
- data/test/data/HelloAnyone.robundle +0 -0
- data/test/data/empty-manifest.json +1 -0
- data/test/data/example3-manifest.json +40 -0
- data/test/data/invalid-manifest.json +5 -0
- data/test/data/invalid-manifest.robundle +0 -0
- data/test/helpers/fake_manifest.rb +23 -0
- data/test/helpers/fake_provenance.rb +32 -0
- data/test/helpers/list_tests.rb +22 -0
- data/test/tc_add_annotation.rb +571 -0
- data/test/tc_agent.rb +63 -0
- data/test/tc_aggregate.rb +116 -0
- data/test/tc_annotation.rb +84 -0
- data/test/tc_create.rb +170 -0
- data/test/tc_manifest.rb +221 -0
- data/test/tc_provenance.rb +121 -0
- data/test/tc_read.rb +66 -0
- data/test/tc_remove.rb +140 -0
- data/test/tc_util.rb +64 -0
- data/test/ts_ro_bundle.rb +28 -0
- metadata +217 -0
data/test/tc_agent.rb
ADDED
@@ -0,0 +1,63 @@
|
|
1
|
+
#------------------------------------------------------------------------------
|
2
|
+
# Copyright (c) 2014 The University of Manchester, UK.
|
3
|
+
#
|
4
|
+
# BSD Licenced. See LICENCE.rdoc for details.
|
5
|
+
#
|
6
|
+
# Author: Robert Haines
|
7
|
+
#------------------------------------------------------------------------------
|
8
|
+
|
9
|
+
require 'test/unit'
|
10
|
+
require "ro-bundle"
|
11
|
+
|
12
|
+
class TestAgent < Test::Unit::TestCase
|
13
|
+
|
14
|
+
def setup
|
15
|
+
@name = "Robert Haines"
|
16
|
+
@uri = "https://github.com/hainesr"
|
17
|
+
@orcid = "http://orcid.org/0000-0002-9538-7919"
|
18
|
+
|
19
|
+
@json = { :name => @name, :uri => @uri, :orcid => @orcid }
|
20
|
+
end
|
21
|
+
|
22
|
+
def test_create_from_json_hash
|
23
|
+
agent = ROBundle::Agent.new(@json)
|
24
|
+
|
25
|
+
assert_equal @name, agent.name
|
26
|
+
assert_equal @uri, agent.uri
|
27
|
+
assert_equal @orcid, agent.orcid
|
28
|
+
end
|
29
|
+
|
30
|
+
def test_create_from_empty_json_hash
|
31
|
+
agent = ROBundle::Agent.new({})
|
32
|
+
|
33
|
+
assert_nil agent.name
|
34
|
+
assert_nil agent.uri
|
35
|
+
assert_nil agent.orcid
|
36
|
+
end
|
37
|
+
|
38
|
+
def test_create_from_parameters
|
39
|
+
agent = ROBundle::Agent.new(@name, @uri, @orcid)
|
40
|
+
|
41
|
+
assert_equal @name, agent.name
|
42
|
+
assert_equal @uri, agent.uri
|
43
|
+
assert_equal @orcid, agent.orcid
|
44
|
+
end
|
45
|
+
|
46
|
+
def test_create_from_parameters_with_uris
|
47
|
+
agent = ROBundle::Agent.new(@name, URI.parse(@uri), URI.parse(@orcid))
|
48
|
+
|
49
|
+
assert_equal @name, agent.name
|
50
|
+
assert_equal @uri, agent.uri
|
51
|
+
assert_equal @orcid, agent.orcid
|
52
|
+
end
|
53
|
+
|
54
|
+
def test_json_output
|
55
|
+
agent = ROBundle::Agent.new(@json)
|
56
|
+
json = JSON.parse(JSON.generate(agent))
|
57
|
+
|
58
|
+
assert_equal @name, json["name"]
|
59
|
+
assert_equal @uri, json["uri"]
|
60
|
+
assert_equal @orcid, json["orcid"]
|
61
|
+
end
|
62
|
+
|
63
|
+
end
|
@@ -0,0 +1,116 @@
|
|
1
|
+
#------------------------------------------------------------------------------
|
2
|
+
# Copyright (c) 2014 The University of Manchester, UK.
|
3
|
+
#
|
4
|
+
# BSD Licenced. See LICENCE.rdoc for details.
|
5
|
+
#
|
6
|
+
# Author: Robert Haines
|
7
|
+
#------------------------------------------------------------------------------
|
8
|
+
|
9
|
+
|
10
|
+
require 'test/unit'
|
11
|
+
require "ro-bundle"
|
12
|
+
|
13
|
+
class TestAggregate < Test::Unit::TestCase
|
14
|
+
|
15
|
+
def test_simple_file
|
16
|
+
assert_nothing_raised(ROBundle::InvalidAggregateError) do
|
17
|
+
file = "/good.txt"
|
18
|
+
type = "text/plain"
|
19
|
+
agg = ROBundle::Aggregate.new(file, type)
|
20
|
+
|
21
|
+
assert_nil agg.uri
|
22
|
+
assert_equal file, agg.file
|
23
|
+
assert_equal type, agg.mediatype
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
def test_simple_uri
|
28
|
+
assert_nothing_raised(ROBundle::InvalidAggregateError) do
|
29
|
+
uri = "http://example.com/good.txt"
|
30
|
+
agg = ROBundle::Aggregate.new(uri)
|
31
|
+
|
32
|
+
assert_nil agg.file
|
33
|
+
assert_nil agg.mediatype
|
34
|
+
assert_equal uri, agg.uri
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
def test_simple_uri_object
|
39
|
+
assert_nothing_raised(ROBundle::InvalidAggregateError) do
|
40
|
+
uri = URI.parse("http://example.com/good.txt")
|
41
|
+
agg = ROBundle::Aggregate.new(uri)
|
42
|
+
|
43
|
+
assert_nil agg.file
|
44
|
+
assert_nil agg.mediatype
|
45
|
+
assert_equal uri.to_s, agg.uri
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
def test_bad_aggregates
|
50
|
+
assert_raise(ROBundle::InvalidAggregateError) do
|
51
|
+
ROBundle::Aggregate.new([])
|
52
|
+
end
|
53
|
+
|
54
|
+
assert_raise(ROBundle::InvalidAggregateError) do
|
55
|
+
ROBundle::Aggregate.new({})
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
def test_complex_file
|
60
|
+
assert_nothing_raised(ROBundle::InvalidAggregateError) do
|
61
|
+
file = "/good.txt"
|
62
|
+
type = "text/plain"
|
63
|
+
|
64
|
+
json = {
|
65
|
+
:file => file,
|
66
|
+
:mediatype => type,
|
67
|
+
:createdOn => "2013-02-12T19:37:32.939Z",
|
68
|
+
:createdBy => { "name" => "Robert Haines" }
|
69
|
+
}
|
70
|
+
|
71
|
+
agg = ROBundle::Aggregate.new(json)
|
72
|
+
|
73
|
+
assert_nil agg.uri
|
74
|
+
assert_equal file, agg.file
|
75
|
+
assert_equal type, agg.mediatype
|
76
|
+
assert agg.created_on.instance_of?(Time)
|
77
|
+
assert agg.created_by.instance_of?(ROBundle::Agent)
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
def test_complex_uri
|
82
|
+
assert_nothing_raised(ROBundle::InvalidAggregateError) do
|
83
|
+
uri = "http://example.com/good.txt"
|
84
|
+
|
85
|
+
json = {
|
86
|
+
:uri => uri
|
87
|
+
}
|
88
|
+
|
89
|
+
agg = ROBundle::Aggregate.new(json)
|
90
|
+
|
91
|
+
assert_nil agg.file
|
92
|
+
assert_nil agg.mediatype
|
93
|
+
assert_equal uri, agg.uri
|
94
|
+
end
|
95
|
+
end
|
96
|
+
|
97
|
+
def test_json_output_file
|
98
|
+
file = "/good.txt"
|
99
|
+
type = "text/plain"
|
100
|
+
time = "2013-02-12T19:37:32.939Z"
|
101
|
+
json = {
|
102
|
+
:file => file,
|
103
|
+
:mediatype => type,
|
104
|
+
:createdOn => time,
|
105
|
+
:createdBy => { :name => "Robert Haines" }
|
106
|
+
}
|
107
|
+
|
108
|
+
agg = ROBundle::Aggregate.new(json)
|
109
|
+
json = JSON.parse(JSON.generate(agg))
|
110
|
+
|
111
|
+
assert_equal file, json["file"]
|
112
|
+
assert_equal type, json["mediatype"]
|
113
|
+
assert_equal time, json["createdOn"]
|
114
|
+
end
|
115
|
+
|
116
|
+
end
|
@@ -0,0 +1,84 @@
|
|
1
|
+
#------------------------------------------------------------------------------
|
2
|
+
# Copyright (c) 2014 The University of Manchester, UK.
|
3
|
+
#
|
4
|
+
# BSD Licenced. See LICENCE.rdoc for details.
|
5
|
+
#
|
6
|
+
# Author: Robert Haines
|
7
|
+
#------------------------------------------------------------------------------
|
8
|
+
|
9
|
+
require 'test/unit'
|
10
|
+
require "ro-bundle"
|
11
|
+
|
12
|
+
class TestAnnotation < Test::Unit::TestCase
|
13
|
+
|
14
|
+
def setup
|
15
|
+
@target = [ "/", "/file.txt" ]
|
16
|
+
@content = "http://www.example.com/example.txt"
|
17
|
+
@id = UUID.generate(:urn)
|
18
|
+
@creator = "Robert Haines"
|
19
|
+
@time = "2014-08-20T11:30:00+01:00"
|
20
|
+
|
21
|
+
@json = {
|
22
|
+
:about => @target,
|
23
|
+
:content => @content,
|
24
|
+
:annotation => @id,
|
25
|
+
:createdBy => { :name => @creator },
|
26
|
+
:createdOn => @time
|
27
|
+
}
|
28
|
+
end
|
29
|
+
|
30
|
+
def test_create
|
31
|
+
an = ROBundle::Annotation.new(@target)
|
32
|
+
|
33
|
+
assert_equal @target, an.target
|
34
|
+
assert_nil an.content
|
35
|
+
assert_not_nil an.annotation_id
|
36
|
+
end
|
37
|
+
|
38
|
+
def test_create_with_content
|
39
|
+
an = ROBundle::Annotation.new(@target, @content)
|
40
|
+
|
41
|
+
assert_equal @target, an.target
|
42
|
+
assert_equal @content, an.content
|
43
|
+
assert_not_nil an.annotation_id
|
44
|
+
end
|
45
|
+
|
46
|
+
def test_create_from_json
|
47
|
+
an = ROBundle::Annotation.new(@json)
|
48
|
+
|
49
|
+
assert_equal @target, an.target
|
50
|
+
assert_equal @content, an.content
|
51
|
+
assert_equal @id, an.annotation_id
|
52
|
+
assert an.created_on.instance_of?(Time)
|
53
|
+
assert an.created_by.instance_of?(ROBundle::Agent)
|
54
|
+
end
|
55
|
+
|
56
|
+
def test_change_content
|
57
|
+
an = ROBundle::Annotation.new(@json)
|
58
|
+
new_content = "/file.txt"
|
59
|
+
an.content = new_content
|
60
|
+
|
61
|
+
assert_equal new_content, an.content
|
62
|
+
end
|
63
|
+
|
64
|
+
def test_generate_annotation_id
|
65
|
+
an = ROBundle::Annotation.new(@target)
|
66
|
+
id = an.annotation_id
|
67
|
+
|
68
|
+
assert id.instance_of?(String)
|
69
|
+
assert id.start_with?("urn:uuid:")
|
70
|
+
assert_same id, an.annotation_id
|
71
|
+
end
|
72
|
+
|
73
|
+
def test_json_output
|
74
|
+
agent = ROBundle::Annotation.new(@json)
|
75
|
+
json = JSON.parse(JSON.generate(agent))
|
76
|
+
|
77
|
+
assert_equal @target, json["about"]
|
78
|
+
assert_equal @content, json["content"]
|
79
|
+
assert_equal @id, json["annotation"]
|
80
|
+
assert_equal @time, json["createdOn"]
|
81
|
+
assert_equal @creator, json["createdBy"]["name"]
|
82
|
+
end
|
83
|
+
|
84
|
+
end
|
data/test/tc_create.rb
ADDED
@@ -0,0 +1,170 @@
|
|
1
|
+
#------------------------------------------------------------------------------
|
2
|
+
# Copyright (c) 2014 The University of Manchester, UK.
|
3
|
+
#
|
4
|
+
# BSD Licenced. See LICENCE.rdoc for details.
|
5
|
+
#
|
6
|
+
# Author: Robert Haines
|
7
|
+
#------------------------------------------------------------------------------
|
8
|
+
|
9
|
+
require "test/unit"
|
10
|
+
require "tmpdir"
|
11
|
+
require "ro-bundle"
|
12
|
+
|
13
|
+
require "helpers/list_tests"
|
14
|
+
|
15
|
+
class TestCreation < Test::Unit::TestCase
|
16
|
+
|
17
|
+
def test_create_empty_bundle
|
18
|
+
Dir.mktmpdir do |dir|
|
19
|
+
filename = File.join(dir, "test.bundle")
|
20
|
+
|
21
|
+
assert_nothing_raised do
|
22
|
+
ROBundle::File.create(filename) do |b|
|
23
|
+
assert(b.on_disk?)
|
24
|
+
refute(b.in_memory?)
|
25
|
+
refute b.commit_required?
|
26
|
+
|
27
|
+
assert(b.find_entry("mimetype").local_header_offset == 0)
|
28
|
+
assert_equal("application/vnd.wf4ever.robundle+zip", b.mimetype)
|
29
|
+
|
30
|
+
# Try and get something from the manifest before it exists
|
31
|
+
assert_nothing_raised(Errno::ENOENT) do
|
32
|
+
b.id
|
33
|
+
end
|
34
|
+
|
35
|
+
# Manifest has been accessed so has been populated with defaults.
|
36
|
+
assert b.commit_required?
|
37
|
+
|
38
|
+
b.file.open(".ro/manifest.json", "w") do |m|
|
39
|
+
m.puts "{ }"
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
assert_nothing_raised(ZipContainer::MalformedContainerError, ZipContainer::ZipError) do
|
45
|
+
ROBundle::File.verify!(filename)
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
def test_add_file_aggregates
|
51
|
+
Dir.mktmpdir do |dir|
|
52
|
+
filename = File.join(dir, "test.bundle")
|
53
|
+
|
54
|
+
entry1 = "test1.json"
|
55
|
+
entry2 = "test2.json"
|
56
|
+
entry3 = "test3.json"
|
57
|
+
|
58
|
+
assert_nothing_raised do
|
59
|
+
ROBundle::File.create(filename) do |b|
|
60
|
+
assert b.aggregates.empty?
|
61
|
+
assert_nil b.find_entry(entry1)
|
62
|
+
assert b.commit_required?
|
63
|
+
|
64
|
+
agg = b.add(entry1, $man_ex3, :aggregate => false)
|
65
|
+
assert b.aggregates.empty?
|
66
|
+
assert_not_nil b.find_entry(entry1)
|
67
|
+
assert b.commit_required?
|
68
|
+
assert_nil agg
|
69
|
+
|
70
|
+
agg = b.add(entry2, $man_ex3)
|
71
|
+
assert b.aggregate?(entry2)
|
72
|
+
assert_not_nil b.find_entry(entry2)
|
73
|
+
assert agg.instance_of?(ROBundle::Aggregate)
|
74
|
+
|
75
|
+
b.add_aggregate(entry3, $man_ex3)
|
76
|
+
assert b.aggregate?(entry3)
|
77
|
+
assert_not_nil b.find_entry(entry3)
|
78
|
+
|
79
|
+
new_agg = ROBundle::Aggregate.new("/#{entry1}")
|
80
|
+
b.add_aggregate(new_agg)
|
81
|
+
assert b.aggregate?(entry1)
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
ROBundle::File.open(filename) do |b|
|
86
|
+
refute b.aggregates.empty?
|
87
|
+
refute b.commit_required?
|
88
|
+
|
89
|
+
assert b.aggregate?(entry1)
|
90
|
+
assert_not_nil b.find_entry(entry1)
|
91
|
+
|
92
|
+
assert b.aggregate?(entry2)
|
93
|
+
assert_not_nil b.find_entry(entry2)
|
94
|
+
|
95
|
+
assert b.aggregate?(entry3)
|
96
|
+
assert_not_nil b.find_entry(entry3)
|
97
|
+
end
|
98
|
+
end
|
99
|
+
end
|
100
|
+
|
101
|
+
def test_add_uri_aggregates
|
102
|
+
Dir.mktmpdir do |dir|
|
103
|
+
filename = File.join(dir, "test.bundle")
|
104
|
+
|
105
|
+
entry1 = "http://www.example.com/example"
|
106
|
+
entry2 = URI.parse(entry1)
|
107
|
+
|
108
|
+
assert_nothing_raised do
|
109
|
+
ROBundle::File.create(filename) do |b|
|
110
|
+
agg = b.add_aggregate(entry1)
|
111
|
+
assert b.aggregate?(entry1)
|
112
|
+
assert_nil b.find_entry(entry1)
|
113
|
+
assert agg.instance_of?(ROBundle::Aggregate)
|
114
|
+
|
115
|
+
b.add_aggregate(entry2)
|
116
|
+
assert b.aggregate?(entry2)
|
117
|
+
assert_nil b.find_entry(entry2)
|
118
|
+
end
|
119
|
+
end
|
120
|
+
|
121
|
+
ROBundle::File.open(filename) do |b|
|
122
|
+
refute b.aggregates.empty?
|
123
|
+
refute b.commit_required?
|
124
|
+
|
125
|
+
assert b.aggregate?(entry1)
|
126
|
+
assert_nil b.find_entry(entry1)
|
127
|
+
|
128
|
+
assert b.aggregate?(entry2)
|
129
|
+
assert_nil b.find_entry(entry2)
|
130
|
+
end
|
131
|
+
end
|
132
|
+
end
|
133
|
+
|
134
|
+
def test_add_history
|
135
|
+
Dir.mktmpdir do |dir|
|
136
|
+
filename = File.join(dir, "test.bundle")
|
137
|
+
|
138
|
+
entry1 = "test1.json"
|
139
|
+
entry2 = ".ro/test2.json"
|
140
|
+
|
141
|
+
assert_nothing_raised do
|
142
|
+
ROBundle::File.create(filename) do |b|
|
143
|
+
assert b.history.empty?
|
144
|
+
assert_nil b.find_entry(entry1)
|
145
|
+
|
146
|
+
b.add(entry1, $man_ex3, :aggregate => false)
|
147
|
+
assert_not_nil b.find_entry(entry1)
|
148
|
+
|
149
|
+
b.add_history(entry2, $man_ex3)
|
150
|
+
assert_not_nil b.find_entry(entry2)
|
151
|
+
assert entry_in_history_list(entry2, b.history)
|
152
|
+
|
153
|
+
b.add_history(entry1)
|
154
|
+
assert entry_in_history_list(entry1, b.history)
|
155
|
+
end
|
156
|
+
end
|
157
|
+
|
158
|
+
ROBundle::File.open(filename) do |b|
|
159
|
+
refute b.history.empty?
|
160
|
+
|
161
|
+
assert entry_in_history_list(entry1, b.history)
|
162
|
+
assert_not_nil b.find_entry(entry1)
|
163
|
+
|
164
|
+
assert_not_nil b.find_entry(entry2)
|
165
|
+
assert entry_in_history_list(entry2, b.history)
|
166
|
+
end
|
167
|
+
end
|
168
|
+
end
|
169
|
+
|
170
|
+
end
|
data/test/tc_manifest.rb
ADDED
@@ -0,0 +1,221 @@
|
|
1
|
+
#------------------------------------------------------------------------------
|
2
|
+
# Copyright (c) 2014 The University of Manchester, UK.
|
3
|
+
#
|
4
|
+
# BSD Licenced. See LICENCE.rdoc for details.
|
5
|
+
#
|
6
|
+
# Author: Robert Haines
|
7
|
+
#------------------------------------------------------------------------------
|
8
|
+
|
9
|
+
require 'test/unit'
|
10
|
+
require "ro-bundle"
|
11
|
+
require "helpers/fake_manifest"
|
12
|
+
|
13
|
+
class TestManifest < Test::Unit::TestCase
|
14
|
+
|
15
|
+
def setup
|
16
|
+
@manifest = FakeManifest.new($man_ex3)
|
17
|
+
end
|
18
|
+
|
19
|
+
def test_top_level
|
20
|
+
assert @manifest.context.instance_of?(Array)
|
21
|
+
|
22
|
+
assert_equal("/", @manifest.id)
|
23
|
+
|
24
|
+
assert @manifest.created_on.instance_of?(Time)
|
25
|
+
assert_nil @manifest.authored_on
|
26
|
+
|
27
|
+
creator = @manifest.created_by
|
28
|
+
assert creator.instance_of?(ROBundle::Agent)
|
29
|
+
|
30
|
+
authors = @manifest.authored_by
|
31
|
+
assert authors.instance_of?(Array)
|
32
|
+
|
33
|
+
history = @manifest.history
|
34
|
+
assert history.instance_of?(Array)
|
35
|
+
history.each do |h|
|
36
|
+
assert h.instance_of?(String)
|
37
|
+
end
|
38
|
+
|
39
|
+
aggregates = @manifest.aggregates
|
40
|
+
assert aggregates.instance_of?(Array)
|
41
|
+
aggregates.each do |a|
|
42
|
+
assert a.instance_of?(ROBundle::Aggregate)
|
43
|
+
end
|
44
|
+
|
45
|
+
annotations = @manifest.annotations
|
46
|
+
assert annotations.instance_of?(Array)
|
47
|
+
annotations.each do |a|
|
48
|
+
assert a.instance_of?(ROBundle::Annotation)
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
def test_ensure_copied_lists
|
53
|
+
%w(authored_by history aggregates annotations).map(&:to_sym).each do |m|
|
54
|
+
list = @manifest.send(m)
|
55
|
+
list << "new item"
|
56
|
+
assert_not_equal list, @manifest.send(m)
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
def test_change_context
|
61
|
+
old = @manifest.context
|
62
|
+
context = "http://example.com/context"
|
63
|
+
@manifest.add_context(context)
|
64
|
+
|
65
|
+
assert @manifest.context.include?(context)
|
66
|
+
assert @manifest.context.include?(old[0])
|
67
|
+
assert_equal old[0], @manifest.context[1]
|
68
|
+
assert @manifest.edited?
|
69
|
+
end
|
70
|
+
|
71
|
+
def test_change_id
|
72
|
+
old = @manifest.id
|
73
|
+
@manifest.id = "/new"
|
74
|
+
|
75
|
+
assert_equal "/new", @manifest.id
|
76
|
+
assert_not_equal old, @manifest.id
|
77
|
+
assert @manifest.edited?
|
78
|
+
end
|
79
|
+
|
80
|
+
def test_remove_annotation_by_object
|
81
|
+
remove = @manifest.annotations[0]
|
82
|
+
assert_equal 3, @manifest.annotations.length
|
83
|
+
|
84
|
+
@manifest.remove_annotation(remove)
|
85
|
+
assert_equal 1, @manifest.annotations.length
|
86
|
+
assert @manifest.edited?
|
87
|
+
|
88
|
+
@manifest.remove_annotation(remove)
|
89
|
+
assert_equal 1, @manifest.annotations.length
|
90
|
+
assert @manifest.edited?
|
91
|
+
end
|
92
|
+
|
93
|
+
def test_remove_annotation_by_id
|
94
|
+
id = "urn:uuid:d67466b4-3aeb-4855-8203-90febe71abdf"
|
95
|
+
assert_equal 3, @manifest.annotations.length
|
96
|
+
|
97
|
+
@manifest.remove_annotation(id)
|
98
|
+
assert_equal 1, @manifest.annotations.length
|
99
|
+
assert @manifest.edited?
|
100
|
+
|
101
|
+
@manifest.remove_annotation(id)
|
102
|
+
assert_equal 1, @manifest.annotations.length
|
103
|
+
assert @manifest.edited?
|
104
|
+
end
|
105
|
+
|
106
|
+
def test_remove_annotation_by_about
|
107
|
+
about = "/folder/soup.jpeg"
|
108
|
+
assert_equal 3, @manifest.annotations.length
|
109
|
+
|
110
|
+
@manifest.remove_annotation(about)
|
111
|
+
assert_equal 1, @manifest.annotations.length
|
112
|
+
assert @manifest.edited?
|
113
|
+
|
114
|
+
@manifest.remove_annotation(about)
|
115
|
+
assert_equal 1, @manifest.annotations.length
|
116
|
+
assert @manifest.edited?
|
117
|
+
end
|
118
|
+
|
119
|
+
def test_remove_non_existent_annotations
|
120
|
+
about = "not-here!"
|
121
|
+
id = about
|
122
|
+
assert_equal 3, @manifest.annotations.length
|
123
|
+
|
124
|
+
@manifest.remove_annotation(about)
|
125
|
+
assert_equal 3, @manifest.annotations.length
|
126
|
+
refute @manifest.edited?
|
127
|
+
|
128
|
+
@manifest.remove_annotation(id)
|
129
|
+
assert_equal 3, @manifest.annotations.length
|
130
|
+
refute @manifest.edited?
|
131
|
+
end
|
132
|
+
|
133
|
+
def test_remove_aggregate_by_object
|
134
|
+
remove = @manifest.aggregates[0]
|
135
|
+
assert_equal 4, @manifest.aggregates.length
|
136
|
+
assert_equal 3, @manifest.annotations.length
|
137
|
+
|
138
|
+
@manifest.remove_aggregate(remove)
|
139
|
+
assert_equal 3, @manifest.aggregates.length
|
140
|
+
assert_equal 1, @manifest.annotations.length
|
141
|
+
assert @manifest.edited?
|
142
|
+
|
143
|
+
@manifest.remove_aggregate(remove)
|
144
|
+
assert_equal 3, @manifest.aggregates.length
|
145
|
+
assert_equal 1, @manifest.annotations.length
|
146
|
+
assert @manifest.edited?
|
147
|
+
end
|
148
|
+
|
149
|
+
def test_remove_aggregate_by_file
|
150
|
+
remove = "/folder/soup.jpeg"
|
151
|
+
assert_equal 4, @manifest.aggregates.length
|
152
|
+
assert_equal 3, @manifest.annotations.length
|
153
|
+
|
154
|
+
@manifest.remove_aggregate(remove)
|
155
|
+
assert_equal 3, @manifest.aggregates.length
|
156
|
+
assert_equal 1, @manifest.annotations.length
|
157
|
+
assert @manifest.edited?
|
158
|
+
|
159
|
+
@manifest.remove_aggregate(remove)
|
160
|
+
assert_equal 3, @manifest.aggregates.length
|
161
|
+
assert_equal 1, @manifest.annotations.length
|
162
|
+
assert @manifest.edited?
|
163
|
+
end
|
164
|
+
|
165
|
+
def test_remove_aggregate_by_uri
|
166
|
+
remove = "http://example.com/blog/"
|
167
|
+
assert_equal 4, @manifest.aggregates.length
|
168
|
+
assert_equal 3, @manifest.annotations.length
|
169
|
+
|
170
|
+
@manifest.remove_aggregate(remove)
|
171
|
+
assert_equal 3, @manifest.aggregates.length
|
172
|
+
assert_equal 3, @manifest.annotations.length
|
173
|
+
assert @manifest.edited?
|
174
|
+
|
175
|
+
@manifest.remove_aggregate(remove)
|
176
|
+
assert_equal 3, @manifest.aggregates.length
|
177
|
+
assert_equal 3, @manifest.annotations.length
|
178
|
+
assert @manifest.edited?
|
179
|
+
end
|
180
|
+
|
181
|
+
def test_remove_non_existent_aggregates
|
182
|
+
file = "not-here!"
|
183
|
+
uri = "http://example.com/not-here"
|
184
|
+
assert_equal 4, @manifest.aggregates.length
|
185
|
+
|
186
|
+
@manifest.remove_aggregate(file)
|
187
|
+
assert_equal 4, @manifest.aggregates.length
|
188
|
+
refute @manifest.edited?
|
189
|
+
|
190
|
+
@manifest.remove_aggregate(uri)
|
191
|
+
assert_equal 4, @manifest.aggregates.length
|
192
|
+
refute @manifest.edited?
|
193
|
+
end
|
194
|
+
|
195
|
+
def test_empty_manifest
|
196
|
+
manifest = FakeManifest.new($man_empty)
|
197
|
+
|
198
|
+
assert manifest.context.instance_of?(Array)
|
199
|
+
assert manifest.edited?
|
200
|
+
|
201
|
+
assert_equal("/", manifest.id)
|
202
|
+
|
203
|
+
assert_nil manifest.created_on
|
204
|
+
assert_nil manifest.authored_on
|
205
|
+
assert_nil manifest.created_by
|
206
|
+
assert manifest.authored_by.instance_of?(Array)
|
207
|
+
|
208
|
+
assert manifest.history.instance_of?(Array)
|
209
|
+
assert manifest.aggregates.instance_of?(Array)
|
210
|
+
assert manifest.annotations.instance_of?(Array)
|
211
|
+
end
|
212
|
+
|
213
|
+
def test_invalid_manifest
|
214
|
+
manifest = FakeManifest.new($man_invalid)
|
215
|
+
|
216
|
+
assert_raises(JSON::ParserError) do
|
217
|
+
assert manifest.context.instance_of?(Array)
|
218
|
+
end
|
219
|
+
end
|
220
|
+
|
221
|
+
end
|