krikri-spec 0.0.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.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 6c90100ad41d132172efa4c7b439ad6d3f7d718e
4
+ data.tar.gz: 91d6e0a071fc07e6c7ada9b30cc26746806f832d
5
+ SHA512:
6
+ metadata.gz: efa17e2c29eb457298abfea52916951f090ed7f3029504f16c6f955f79899ba6f8f17ad16501811191b17a91000e6c377f665fbe880af73a1e818c99eade49cd
7
+ data.tar.gz: 640d3bc1484d119795ca63c7c1bc1730146af9e56a0b7a5bf759abb4ce3025addf13937fbbd86cb332996d2d78308b32be7f3833391cb1268731255e698e3298
@@ -0,0 +1,71 @@
1
+ Krikri::Spec
2
+ ============
3
+
4
+ [![Build Status](https://travis-ci.org/dpla/krikri-spec.svg?branch=develop)](https://travis-ci.org/dpla/krikri-spec)
5
+
6
+ RSpec extensions and shared examples for Krikri.
7
+
8
+ Shared Examples
9
+ ----------------
10
+
11
+ Shared examples are included as linters for Krikri contracts. Use the shared
12
+ examples within individual spec files by invoking them in place:
13
+
14
+ ```ruby
15
+ require 'krikri/spec/harvester'
16
+
17
+ describe MyHarvester do
18
+ it_behaves_like 'a harvester'
19
+ end
20
+ ```
21
+
22
+ Matchers
23
+ --------
24
+
25
+ Matchers for some common patterns within specs for Krikri apps are provided.
26
+ You can include them in your RSpec enviornment with:
27
+
28
+ ```ruby
29
+ require 'krikri/spec
30
+
31
+ RSpec.configure do |conf|
32
+ conf.include(Krikri::Spec::Matchers)
33
+ end
34
+ ```
35
+
36
+ Development
37
+ -----------
38
+
39
+ When working on the Krikri gem, it is often useful to work directly against a
40
+ local copy of the `Krikri::Spec` examples. To do this, you can add a local path
41
+ to your Krikri Gemfile:
42
+
43
+ ```ruby
44
+ # Gemfile
45
+
46
+ gem 'krikri-spec', path: '../krikri-spec'
47
+ ```
48
+
49
+ Or run against the `develop` branch on GitHub:
50
+
51
+ ```ruby
52
+ # Gemfile
53
+
54
+ gem 'krikri-spec', github: 'dpla/krikri-spec', branch: 'develop'
55
+ ```
56
+
57
+ Contribution Guidelines
58
+ -----------------------
59
+ Please observe the following guidelines:
60
+
61
+ - Write tests for your contributions.
62
+ - Document methods you add using YARD annotations.
63
+ - Follow the included style guidelines (i.e. run `rubocop` before committing).
64
+ - Use well formed commit messages.
65
+
66
+ Copyright & License
67
+ --------------------
68
+
69
+ - Copyright Digital Public Library of America, 2016
70
+ - License: MIT
71
+
@@ -0,0 +1,38 @@
1
+ ##
2
+ # `Krikri::Spec` offers RSpec extensions and shared examples for the Krikri
3
+ # metadata aggregation engine.
4
+ #
5
+ # Shared examples must be required explictly for specs that use them. This helps
6
+ # with clarity of shared example use, and avoids namespace pollution for
7
+ # `it_behaves_like` directives.
8
+ #
9
+ # @example using a shared example
10
+ # require 'krikri/spec/harvester'
11
+ #
12
+ # describe MyHarvester do
13
+ # it_behaves_like 'a harvester'
14
+ # end
15
+ #
16
+ #
17
+ # RSpec matchers are included for common checks within Krikri based
18
+ # applications.
19
+ #
20
+ # @example using a custom matcher
21
+ # require 'krikri/spec'
22
+ #
23
+ # RSpec.configure { |conf| conf.include(Krikri::Spec::Matchers) }
24
+ #
25
+ # describe SomeModel do
26
+ # it 'is an exactMatch for moomin' do
27
+ # moomin = RDF::URI('http://example.com/moomin')
28
+ #
29
+ # expect(subject).to be_exact_match_with moomin
30
+ # end
31
+ # end
32
+ #
33
+ # @see http://www.rubydoc.info/gems/krikri
34
+ # @see http://rspec.info/
35
+ module Krikri::Spec
36
+ autoload :Matchers, 'krikri/spec/matchers'
37
+ autoload :VERSION, 'krikri/spec/version'
38
+ end
@@ -0,0 +1,136 @@
1
+ require 'krikri/spec/software_agent'
2
+
3
+ shared_examples 'a harvester' do
4
+ opts = { uri: 'http://example.org/endpoint' }
5
+ it_behaves_like 'a software agent', opts
6
+
7
+ let(:harvester) { subject }
8
+ let(:name) { :test_harvester }
9
+
10
+ it { expect(described_class.queue_name.to_s).to eq 'harvest' }
11
+
12
+ it 'is a harvester' do
13
+ expect(harvester).to be_a Krikri::Harvester
14
+ end
15
+
16
+ it 'raises an error if no uri is given' do
17
+ expect { described_class.new }.to raise_error KeyError
18
+ end
19
+
20
+ xit 'has a record count' do
21
+ expect(harvester.count).to be_a Integer
22
+ end
23
+
24
+ describe '#record_ids' do
25
+ it 'can get its record ids' do
26
+ expect(harvester.record_ids).to be_a Enumerator
27
+ end
28
+
29
+ it 'gives ids as strings' do
30
+ harvester.record_ids.each { |i| expect(i).to be_a String }
31
+ end
32
+ end
33
+
34
+ describe 'local_name creation' do
35
+ before { harvester.name = name }
36
+
37
+ let(:gen_id) { 'my_id' }
38
+
39
+ it 'mints md5 identifiers with #records' do
40
+ expect(Krikri::Md5Minter).to receive(:create)
41
+ .with(harvester.record_ids.first,
42
+ harvester.name)
43
+ .and_return(gen_id)
44
+
45
+ expect(harvester.records.first.local_name).to eq gen_id
46
+ end
47
+
48
+ it 'mints md5 identifiers with #get_record' do
49
+ expect(Krikri::Md5Minter).to receive(:create)
50
+ .with(harvester.record_ids.first, harvester.name)
51
+ .and_return(gen_id)
52
+ expect(harvester.get_record(harvester.record_ids.first).local_name)
53
+ .to eq gen_id
54
+ end
55
+ end
56
+
57
+ describe '.expected_opts' do
58
+ it 'returns a hash with key and options' do
59
+ expect(described_class.expected_opts)
60
+ .to match a_hash_including(:key => an_instance_of(Symbol),
61
+ :opts => an_instance_of(Hash))
62
+ end
63
+ end
64
+
65
+ describe '#records' do
66
+ it 'returns a record enumerator' do
67
+ expect(subject.records).to be_a Enumerator
68
+ end
69
+
70
+ it 'returns OriginalRecords' do
71
+ subject.records.each { |r| expect(r).to be_a Krikri::OriginalRecord }
72
+ end
73
+
74
+ context 'after first harvest' do
75
+ it 'builds same record' do
76
+ r = subject.records.first
77
+ r.save
78
+ expect(subject.records.first).to be == r
79
+ end
80
+
81
+ it 'idempotent reharvests' do
82
+ subject.records.each(&:save)
83
+ records = subject.records
84
+ records_2 = subject.records
85
+ loop do
86
+ r1 = records.next
87
+ r2 = records_2.next
88
+ expect(r1).to be == r2
89
+ end
90
+ end
91
+ end
92
+ end
93
+
94
+ describe '#get_record' do
95
+ it 'gets an individual record' do
96
+ expect(harvester.get_record(harvester.record_ids.first))
97
+ .to be_a Krikri::OriginalRecord
98
+ end
99
+
100
+ it 'escapes identifiers' do
101
+ expect(subject.records.first.local_name).not_to include(':')
102
+ end
103
+
104
+ it 'returns a normalized record' do
105
+ expect(harvester.get_record(harvester.record_ids.first).content)
106
+ .to eq harvester.records.first.content
107
+ end
108
+ end
109
+
110
+ describe '#run' do
111
+ before do
112
+ allow(harvester).to receive(:records)
113
+ .and_return [double('Original Record 1'),
114
+ double('Record 2')]
115
+ end
116
+
117
+ let(:activity_uri) { RDF::URI('http://example.org/prov/activity/1') }
118
+
119
+ it 'processes the OriginalRecords' do
120
+ harvester.records.each do |r|
121
+ expect(harvester).to receive(:process_record).with(r, activity_uri)
122
+ .and_return(true)
123
+ end
124
+ harvester.run(activity_uri)
125
+ end
126
+ end
127
+
128
+ describe '#name' do
129
+ it 'has name accessors' do
130
+ harvester.name = name
131
+ expect(subject).to have_attributes(:name => name)
132
+ end
133
+ end
134
+
135
+ it_behaves_like 'a software agent', uri: 'http://example.org/endpoint'
136
+ end
@@ -0,0 +1,35 @@
1
+ require 'rspec/matchers'
2
+
3
+ module Krikri::Spec
4
+ ##
5
+ # Defines matchers for Krikri
6
+ #
7
+ # @see http://rubygems.org/gems/rspec
8
+ # @see http://www.rubydoc.info/gems/rspec-expectations/RSpec/Matchers
9
+ module Matchers
10
+ # @!group ActiveTriples Matchers
11
+
12
+ ##
13
+ # Match on the `skos:exactMatch` relation.
14
+ RSpec::Matchers.define :be_exact_match_with do |expected|
15
+ match do |actual|
16
+ exact_match = RDF::URI('http://www.w3.org/2004/02/skos/core#exactMatch')
17
+ !actual.first([actual, exact_match, expected]).nil?
18
+ end
19
+ end
20
+
21
+ ##
22
+ # Match on the `dpla:providedLabel` relation.
23
+ RSpec::Matchers.define :have_provided_label do |expected|
24
+ match do |actual|
25
+ provided_label = RDF::URI('http://dp.la/about/map/providedLabel')
26
+ pattern = [actual, provided_label, nil]
27
+
28
+ expect(actual.query(pattern).map(&:object)).to include(expected)
29
+ true
30
+ end
31
+ end
32
+
33
+ # @!endgroup
34
+ end
35
+ end
@@ -0,0 +1,73 @@
1
+
2
+ shared_examples 'a software agent' do |args|
3
+ subject { args.nil? ? described_class.new : described_class.new(args) }
4
+ let(:agent_class) { described_class }
5
+
6
+ it 'represents its agent name as the correct string, as a class' do
7
+ expect(agent_class.agent_name)
8
+ .to eq agent_class.to_s
9
+ end
10
+
11
+ it 'represents its agent name as the correct string, as an instance' do
12
+ expect(subject.agent_name).to eq agent_class.to_s
13
+ end
14
+
15
+ describe '.agent_name' do
16
+ it { expect(agent_class.agent_name).to be_a String }
17
+ end
18
+
19
+ describe '.queue_name' do
20
+ it { expect(agent_class.queue_name).to respond_to :to_s }
21
+
22
+ it 'is lowercase' do
23
+ expect(agent_class.queue_name).to eq agent_class.queue_name.downcase
24
+ end
25
+ end
26
+
27
+ describe '#agent_name' do
28
+ it { expect(subject.agent_name).to be_a String }
29
+ end
30
+
31
+ describe '#run' do
32
+ it 'accepts one or no arguments' do
33
+ expect(subject.method(:run).arity).to satisfy { |v| v == -1 || v == 0 }
34
+ end
35
+ end
36
+
37
+ describe '#enqueue' do
38
+ let(:queue_name) { described_class.queue_name.to_s }
39
+
40
+ it 'accepts options hash as first arg' do
41
+ expect(agent_class.enqueue({})).to be true
42
+ end
43
+
44
+ it 'accepts options hash as second arg' do
45
+ expect(agent_class.enqueue('my_queue', {})).to be true
46
+ end
47
+
48
+ it 'throws an error if too many args are given' do
49
+ expect { agent_class.enqueue('my_queue', {}, :abc) }
50
+ .to raise_error ArgumentError
51
+ end
52
+
53
+ it 'throws an error if second arg is not options hash' do
54
+ expect { agent_class.enqueue(:my_queue, :abc) }
55
+ .to raise_error ArgumentError
56
+ end
57
+
58
+ it 'enqueues a job' do
59
+ expect { agent_class.enqueue(args) }
60
+ .to change { Resque.size(queue_name) }.by(1)
61
+ end
62
+
63
+ it 'creates a new activity when it enqueues a job' do
64
+ expect { agent_class.enqueue(args) }
65
+ .to change { Krikri::Activity.count }.by(1)
66
+ end
67
+
68
+ it 'logs queue creation' do
69
+ expect(Rails.logger).to receive(:info).exactly(2).times
70
+ agent_class.enqueue(args)
71
+ end
72
+ end
73
+ end
@@ -0,0 +1,5 @@
1
+ module Krikri
2
+ module Spec
3
+ VERSION = '0.0.1'.freeze
4
+ end
5
+ end
@@ -0,0 +1,14 @@
1
+ require 'bundler/setup'
2
+
3
+ require 'krikri/spec'
4
+
5
+ RSpec.configure do |config|
6
+ config.color = true
7
+ config.formatter = :progress
8
+ config.mock_with :rspec
9
+
10
+ config.include FactoryGirl::Syntax::Methods
11
+
12
+ config.filter_run focus: true
13
+ config.run_all_when_everything_filtered = true
14
+ end
metadata ADDED
@@ -0,0 +1,100 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: krikri-spec
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Audrey Altman
8
+ - Mark Breedlove
9
+ - Tom Johnson
10
+ - Mark Matienzo
11
+ - Scott Williams
12
+ autorequire:
13
+ bindir: bin
14
+ cert_chain: []
15
+ date: 2016-06-10 00:00:00.000000000 Z
16
+ dependencies:
17
+ - !ruby/object:Gem::Dependency
18
+ name: krikri
19
+ requirement: !ruby/object:Gem::Requirement
20
+ requirements:
21
+ - - ">="
22
+ - !ruby/object:Gem::Version
23
+ version: '0'
24
+ type: :runtime
25
+ prerelease: false
26
+ version_requirements: !ruby/object:Gem::Requirement
27
+ requirements:
28
+ - - ">="
29
+ - !ruby/object:Gem::Version
30
+ version: '0'
31
+ - !ruby/object:Gem::Dependency
32
+ name: yard
33
+ requirement: !ruby/object:Gem::Requirement
34
+ requirements:
35
+ - - ">="
36
+ - !ruby/object:Gem::Version
37
+ version: '0'
38
+ type: :development
39
+ prerelease: false
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ requirements:
42
+ - - ">="
43
+ - !ruby/object:Gem::Version
44
+ version: '0'
45
+ - !ruby/object:Gem::Dependency
46
+ name: rspec
47
+ requirement: !ruby/object:Gem::Requirement
48
+ requirements:
49
+ - - "~>"
50
+ - !ruby/object:Gem::Version
51
+ version: '3.2'
52
+ type: :development
53
+ prerelease: false
54
+ version_requirements: !ruby/object:Gem::Requirement
55
+ requirements:
56
+ - - "~>"
57
+ - !ruby/object:Gem::Version
58
+ version: '3.2'
59
+ description: Sharable test suite components for apps based on the Krikri engine.
60
+ email:
61
+ - tech@dp.la
62
+ executables: []
63
+ extensions: []
64
+ extra_rdoc_files: []
65
+ files:
66
+ - README.md
67
+ - lib/krikri/spec.rb
68
+ - lib/krikri/spec/harvester.rb
69
+ - lib/krikri/spec/matchers.rb
70
+ - lib/krikri/spec/software_agent.rb
71
+ - lib/krikri/spec/version.rb
72
+ - spec/spec_helper.rb
73
+ homepage: http://github.com/dpla/krikri-spec
74
+ licenses:
75
+ - MIT
76
+ metadata: {}
77
+ post_install_message:
78
+ rdoc_options: []
79
+ require_paths:
80
+ - lib
81
+ required_ruby_version: !ruby/object:Gem::Requirement
82
+ requirements:
83
+ - - ">="
84
+ - !ruby/object:Gem::Version
85
+ version: '0'
86
+ required_rubygems_version: !ruby/object:Gem::Requirement
87
+ requirements:
88
+ - - ">="
89
+ - !ruby/object:Gem::Version
90
+ version: '0'
91
+ requirements: []
92
+ rubyforge_project:
93
+ rubygems_version: 2.5.1
94
+ signing_key:
95
+ specification_version: 4
96
+ summary: Shared tests for Krikri's metadata aggregation, enhancement, and quality
97
+ control functionality.
98
+ test_files:
99
+ - spec/spec_helper.rb
100
+ has_rdoc: