triannon-client 0.4.2 → 0.5.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.
Files changed (128) hide show
  1. checksums.yaml +4 -4
  2. data/.env_example +16 -2
  3. data/.rspec +1 -0
  4. data/README.md +49 -18
  5. data/Rakefile +15 -2
  6. data/lib/triannon-client.rb +12 -6
  7. data/lib/triannon-client/configuration.rb +26 -14
  8. data/lib/triannon-client/triannon_client.rb +139 -44
  9. data/spec/fixtures/vcr_cassettes/{TriannonClient/GET_annotation_by_ID_/_get_annotation/with_content_type/gets_an_open_annotation_by_ID_with_content_type_application/x-turtle_.yml → CRUD/create_annotation.yml} +192 -132
  10. data/spec/fixtures/vcr_cassettes/TriannonClientAUTH/with_authentication/behaves_like_authenticate/-_authenticate_returns_true.yml +343 -0
  11. data/spec/fixtures/vcr_cassettes/TriannonClientCREATE/_post_annotation/with_authentication/behaves_like_create_annotations/POST_401_response_retries_and_logs_RestClient_Exception_message.yml +170 -0
  12. data/spec/fixtures/vcr_cassettes/TriannonClientCREATE/_post_annotation/with_authentication/behaves_like_create_annotations/POST_403_response_does_not_retry_and_logs_RestClient_Exception_message.yml +170 -0
  13. data/spec/fixtures/vcr_cassettes/TriannonClientCREATE/_post_annotation/with_authentication/behaves_like_create_annotations/POST_500_response_does_not_retry_and_logs_RestClient_Exception_message.yml +170 -0
  14. data/spec/fixtures/vcr_cassettes/{TriannonClient/_get_annotations/returns_an_annotation_list_with_an_annotation_created_by_a_prior_POST.yml → TriannonClientCREATE/_post_annotation/with_authentication/behaves_like_create_annotations/does_not_raise_an_error_when_submitting_a_valid_open_annotation.yml} +203 -319
  15. data/spec/fixtures/vcr_cassettes/TriannonClientCREATE/_post_annotation/with_authentication/behaves_like_create_annotations/logs_RuntimeError_message.yml +170 -0
  16. data/spec/fixtures/vcr_cassettes/TriannonClientCREATE/_post_annotation/with_authentication/behaves_like_create_annotations/returns_a_RestClient_Response_object.yml +170 -0
  17. data/spec/fixtures/vcr_cassettes/{TriannonClient/_post_annotation → TriannonClientCREATE/_post_annotation/without_authentication/behaves_like_create_annotations}/does_not_raise_an_error_when_submitting_a_valid_open_annotation.yml +29 -27
  18. data/spec/fixtures/vcr_cassettes/TriannonClientCREATE/clear_annotations.yml +590 -0
  19. data/spec/fixtures/vcr_cassettes/TriannonClientDELETE/_delete_annotation/with_authentication/behaves_like_delete_annotations/returns_TRUE_when_deleting_an_annotation_that_does_NOT_exist.yml +349 -0
  20. data/spec/fixtures/vcr_cassettes/TriannonClientDELETE/_delete_annotation/with_authentication/behaves_like_delete_annotations/returns_TRUE_when_deleting_an_annotation_that_exists.yml +332 -0
  21. data/spec/fixtures/vcr_cassettes/TriannonClientDELETE/_delete_annotation/with_authentication/behaves_like_delete_annotations/validates_the_annotation_ID.yml +288 -0
  22. data/spec/fixtures/vcr_cassettes/{TriannonClient/_delete_annotation/returns_TRUE_when_deleting_an_open_annotation_that_does_NOT_exist.yml → TriannonClientDELETE/_delete_annotation/without_authentication/behaves_like_delete_annotations/returns_TRUE_when_deleting_an_annotation_that_does_NOT_exist.yml} +13 -9
  23. data/spec/fixtures/vcr_cassettes/TriannonClientDELETE/_delete_annotation/without_authentication/behaves_like_delete_annotations/returns_TRUE_when_deleting_an_annotation_that_exists.yml +127 -0
  24. data/spec/fixtures/vcr_cassettes/{TriannonClient/_delete_annotation → TriannonClientDELETE/_delete_annotation/without_authentication/behaves_like_delete_annotations}/validates_the_annotation_ID.yml +7 -5
  25. data/spec/fixtures/vcr_cassettes/TriannonClientDELETE/clear_annotations.yml +594 -0
  26. data/spec/fixtures/vcr_cassettes/{TriannonClient → TriannonClientREAD/GET}/_get_annotations/returns_an_RDF_Graph.yml +30 -23
  27. data/spec/fixtures/vcr_cassettes/{TriannonClient → TriannonClientREAD/GET}/_get_annotations/returns_an_RDF_Graph_that_contains_an_AnnotationList.yml +30 -23
  28. data/spec/fixtures/vcr_cassettes/TriannonClientREAD/GET/_get_annotations/returns_an_annotation_list_with_an_annotation_created_by_a_prior_POST.yml +302 -0
  29. data/spec/fixtures/vcr_cassettes/{TriannonClient/GET_annotation_by_ID_/_get_annotation/with_content_type/requests_an_open_annotation_by_ID_with_content_type_application/n-quads_.yml → TriannonClientREAD/GET/_get_iiif_annotation/returns_an_RDF_Graph_of_an_open_annotation.yml} +25 -78
  30. data/spec/fixtures/vcr_cassettes/{TriannonClient/GET_annotation_by_ID_/_get_annotation/with_content_type/requests_an_open_annotation_by_ID_with_content_type_application/n-triples_.yml → TriannonClientREAD/GET/_get_oa_annotation/returns_an_RDF_Graph_of_an_open_annotation.yml} +25 -78
  31. data/spec/fixtures/vcr_cassettes/TriannonClientREAD/GET/_response2graph/accepts_a_RestClient_Response_instance.yml +2399 -0
  32. data/spec/fixtures/vcr_cassettes/TriannonClientREAD/GET/annotation_by_ID/using_custom_content_type/cannot_get_an_open_annotation_by_ID_with_content_type_application/csvm_json_.yml +1231 -0
  33. data/spec/fixtures/vcr_cassettes/TriannonClientREAD/GET/annotation_by_ID/using_custom_content_type/cannot_get_an_open_annotation_by_ID_with_content_type_application/n-quads_.yml +1231 -0
  34. data/spec/fixtures/vcr_cassettes/TriannonClientREAD/GET/annotation_by_ID/using_custom_content_type/cannot_get_an_open_annotation_by_ID_with_content_type_application/n-triples_.yml +1231 -0
  35. data/spec/fixtures/vcr_cassettes/TriannonClientREAD/GET/annotation_by_ID/using_custom_content_type/cannot_get_an_open_annotation_by_ID_with_content_type_application/rdf_json_.yml +1231 -0
  36. data/spec/fixtures/vcr_cassettes/TriannonClientREAD/GET/annotation_by_ID/using_custom_content_type/cannot_get_an_open_annotation_by_ID_with_content_type_application/rdf_n3_.yml +1231 -0
  37. data/spec/fixtures/vcr_cassettes/TriannonClientREAD/GET/annotation_by_ID/using_custom_content_type/cannot_get_an_open_annotation_by_ID_with_content_type_application/trig_.yml +1231 -0
  38. data/spec/fixtures/vcr_cassettes/TriannonClientREAD/GET/annotation_by_ID/using_custom_content_type/cannot_get_an_open_annotation_by_ID_with_content_type_application/trix_.yml +1231 -0
  39. data/spec/fixtures/vcr_cassettes/TriannonClientREAD/GET/annotation_by_ID/using_custom_content_type/cannot_get_an_open_annotation_by_ID_with_content_type_application/turtle_.yml +1231 -0
  40. data/spec/fixtures/vcr_cassettes/TriannonClientREAD/GET/annotation_by_ID/using_custom_content_type/cannot_get_an_open_annotation_by_ID_with_content_type_application/x-ld_json_.yml +1231 -0
  41. data/spec/fixtures/vcr_cassettes/TriannonClientREAD/GET/annotation_by_ID/using_custom_content_type/cannot_get_an_open_annotation_by_ID_with_content_type_application/x-trig_.yml +1231 -0
  42. data/spec/fixtures/vcr_cassettes/TriannonClientREAD/GET/annotation_by_ID/using_custom_content_type/cannot_get_an_open_annotation_by_ID_with_content_type_text/csv_.yml +1231 -0
  43. data/spec/fixtures/vcr_cassettes/TriannonClientREAD/GET/annotation_by_ID/using_custom_content_type/cannot_get_an_open_annotation_by_ID_with_content_type_text/n3_.yml +1231 -0
  44. data/spec/fixtures/vcr_cassettes/TriannonClientREAD/GET/annotation_by_ID/using_custom_content_type/cannot_get_an_open_annotation_by_ID_with_content_type_text/plain_.yml +1231 -0
  45. data/spec/fixtures/vcr_cassettes/TriannonClientREAD/GET/annotation_by_ID/using_custom_content_type/cannot_get_an_open_annotation_by_ID_with_content_type_text/rdf_n3_.yml +1231 -0
  46. data/spec/fixtures/vcr_cassettes/TriannonClientREAD/GET/annotation_by_ID/using_custom_content_type/cannot_get_an_open_annotation_by_ID_with_content_type_text/rdf_turtle_.yml +1231 -0
  47. data/spec/fixtures/vcr_cassettes/TriannonClientREAD/GET/annotation_by_ID/using_custom_content_type/cannot_get_an_open_annotation_by_ID_with_content_type_text/tab-separated-values_.yml +1231 -0
  48. data/spec/fixtures/vcr_cassettes/TriannonClientREAD/GET/annotation_by_ID/using_custom_content_type/cannot_get_an_open_annotation_by_ID_with_content_type_text/x-nquads_.yml +1231 -0
  49. data/spec/fixtures/vcr_cassettes/{TriannonClient/GET_annotation_by_ID_/_get_annotation/with_content_type/requests_an_open_annotation_by_ID_with_content_type_application → TriannonClientREAD/GET/annotation_by_ID/using_custom_content_type/gets_an_open_annotation_by_ID_with_content_type_application}/ld_json_.yml +25 -78
  50. data/spec/fixtures/vcr_cassettes/TriannonClientREAD/GET/annotation_by_ID/using_custom_content_type/gets_an_open_annotation_by_ID_with_content_type_application/rdf_xml_.yml +68 -0
  51. data/spec/fixtures/vcr_cassettes/TriannonClientREAD/GET/annotation_by_ID/using_custom_content_type/gets_an_open_annotation_by_ID_with_content_type_application/x-turtle_.yml +69 -0
  52. data/spec/fixtures/vcr_cassettes/TriannonClientREAD/GET/annotation_by_ID/using_custom_content_type/gets_an_open_annotation_by_ID_with_content_type_text/turtle_.yml +69 -0
  53. data/spec/fixtures/vcr_cassettes/{TriannonClient/GET_annotation_by_ID_/_get_annotation/without_content_type → TriannonClientREAD/GET/annotation_by_ID/using_default_content_type}/checks_the_annotation_ID.yml +25 -78
  54. data/spec/fixtures/vcr_cassettes/TriannonClientREAD/GET/annotation_by_ID/using_default_content_type/returns_an_EMPTY_RDF_graph_with_a_valid_ID_for_NO_annotation_on_the_server.yml +186 -0
  55. data/spec/fixtures/vcr_cassettes/{TriannonClient/GET_annotation_by_ID_/_get_annotation/with_content_type/requests_an_open_annotation_by_ID_with_content_type_application/rdf_json_.yml → TriannonClientREAD/GET/annotation_by_ID/using_default_content_type/returns_an_RDF_graph_with_a_valid_ID_for_an_annotation_on_the_server.yml} +25 -78
  56. data/spec/fixtures/vcr_cassettes/TriannonClientREAD/clear_annotations.yml +648 -0
  57. data/spec/fixtures/vcr_cassettes/{TriannonClient/GET_annotation_by_ID_/_get_annotation/with_content_type/gets_an_open_annotation_by_ID_with_content_type_application/rdf_xml_.yml → TriannonClientREAD/create_annotation.yml} +192 -131
  58. data/spec/lib/triannon-client/configuration_spec.rb +83 -27
  59. data/spec/lib/triannon-client/triannon_client_auth_spec.rb +61 -0
  60. data/spec/lib/triannon-client/triannon_client_class_spec.rb +104 -0
  61. data/spec/lib/triannon-client/triannon_client_create_spec.rb +119 -0
  62. data/spec/lib/triannon-client/triannon_client_delete_spec.rb +117 -0
  63. data/spec/lib/triannon-client/triannon_client_read_spec.rb +342 -0
  64. data/spec/spec_helper.rb +140 -4
  65. data/triannon-client.gemspec +1 -1
  66. metadata +112 -153
  67. data/spec/fixtures/vcr_cassettes/TriannonClient/GET_annotation_by_ID_/_get_annotation/with_content_type/cannot_get_an_open_annotation_by_ID_with_content_type_application/n-quads_.yml +0 -3995
  68. data/spec/fixtures/vcr_cassettes/TriannonClient/GET_annotation_by_ID_/_get_annotation/with_content_type/cannot_get_an_open_annotation_by_ID_with_content_type_application/n-triples_.yml +0 -3995
  69. data/spec/fixtures/vcr_cassettes/TriannonClient/GET_annotation_by_ID_/_get_annotation/with_content_type/cannot_get_an_open_annotation_by_ID_with_content_type_application/rdf_json_.yml +0 -3995
  70. data/spec/fixtures/vcr_cassettes/TriannonClient/GET_annotation_by_ID_/_get_annotation/with_content_type/cannot_get_an_open_annotation_by_ID_with_content_type_application/rdf_n3_.yml +0 -3995
  71. data/spec/fixtures/vcr_cassettes/TriannonClient/GET_annotation_by_ID_/_get_annotation/with_content_type/cannot_get_an_open_annotation_by_ID_with_content_type_application/trig_.yml +0 -3995
  72. data/spec/fixtures/vcr_cassettes/TriannonClient/GET_annotation_by_ID_/_get_annotation/with_content_type/cannot_get_an_open_annotation_by_ID_with_content_type_application/trix_.yml +0 -3995
  73. data/spec/fixtures/vcr_cassettes/TriannonClient/GET_annotation_by_ID_/_get_annotation/with_content_type/cannot_get_an_open_annotation_by_ID_with_content_type_application/turtle_.yml +0 -3995
  74. data/spec/fixtures/vcr_cassettes/TriannonClient/GET_annotation_by_ID_/_get_annotation/with_content_type/cannot_get_an_open_annotation_by_ID_with_content_type_application/x-ld_json_.yml +0 -3995
  75. data/spec/fixtures/vcr_cassettes/TriannonClient/GET_annotation_by_ID_/_get_annotation/with_content_type/cannot_get_an_open_annotation_by_ID_with_content_type_application/x-trig_.yml +0 -3995
  76. data/spec/fixtures/vcr_cassettes/TriannonClient/GET_annotation_by_ID_/_get_annotation/with_content_type/cannot_get_an_open_annotation_by_ID_with_content_type_text/n3_.yml +0 -3995
  77. data/spec/fixtures/vcr_cassettes/TriannonClient/GET_annotation_by_ID_/_get_annotation/with_content_type/cannot_get_an_open_annotation_by_ID_with_content_type_text/rdf_n3_.yml +0 -3995
  78. data/spec/fixtures/vcr_cassettes/TriannonClient/GET_annotation_by_ID_/_get_annotation/with_content_type/cannot_get_an_open_annotation_by_ID_with_content_type_text/rdf_turtle_.yml +0 -3995
  79. data/spec/fixtures/vcr_cassettes/TriannonClient/GET_annotation_by_ID_/_get_annotation/with_content_type/cannot_get_an_open_annotation_by_ID_with_content_type_text/x-nquads_.yml +0 -3995
  80. data/spec/fixtures/vcr_cassettes/TriannonClient/GET_annotation_by_ID_/_get_annotation/with_content_type/gets_an_open_annotation_by_ID_with_content_type_application/ld_json_.yml +0 -4946
  81. data/spec/fixtures/vcr_cassettes/TriannonClient/GET_annotation_by_ID_/_get_annotation/with_content_type/gets_an_open_annotation_by_ID_with_content_type_text/turtle_.yml +0 -2566
  82. data/spec/fixtures/vcr_cassettes/TriannonClient/GET_annotation_by_ID_/_get_annotation/with_content_type/requests_an_open_annotation_by_ID_with_content_type_application/rdf_n3_.yml +0 -2502
  83. data/spec/fixtures/vcr_cassettes/TriannonClient/GET_annotation_by_ID_/_get_annotation/with_content_type/requests_an_open_annotation_by_ID_with_content_type_application/rdf_xml_.yml +0 -2502
  84. data/spec/fixtures/vcr_cassettes/TriannonClient/GET_annotation_by_ID_/_get_annotation/with_content_type/requests_an_open_annotation_by_ID_with_content_type_application/trig_.yml +0 -2502
  85. data/spec/fixtures/vcr_cassettes/TriannonClient/GET_annotation_by_ID_/_get_annotation/with_content_type/requests_an_open_annotation_by_ID_with_content_type_application/trix_.yml +0 -2502
  86. data/spec/fixtures/vcr_cassettes/TriannonClient/GET_annotation_by_ID_/_get_annotation/with_content_type/requests_an_open_annotation_by_ID_with_content_type_application/turtle_.yml +0 -2502
  87. data/spec/fixtures/vcr_cassettes/TriannonClient/GET_annotation_by_ID_/_get_annotation/with_content_type/requests_an_open_annotation_by_ID_with_content_type_application/x-ld_json_.yml +0 -2502
  88. data/spec/fixtures/vcr_cassettes/TriannonClient/GET_annotation_by_ID_/_get_annotation/with_content_type/requests_an_open_annotation_by_ID_with_content_type_application/x-trig_.yml +0 -2502
  89. data/spec/fixtures/vcr_cassettes/TriannonClient/GET_annotation_by_ID_/_get_annotation/with_content_type/requests_an_open_annotation_by_ID_with_content_type_application/x-turtle_.yml +0 -2502
  90. data/spec/fixtures/vcr_cassettes/TriannonClient/GET_annotation_by_ID_/_get_annotation/with_content_type/requests_an_open_annotation_by_ID_with_content_type_text/n3_.yml +0 -2502
  91. data/spec/fixtures/vcr_cassettes/TriannonClient/GET_annotation_by_ID_/_get_annotation/with_content_type/requests_an_open_annotation_by_ID_with_content_type_text/rdf_n3_.yml +0 -2502
  92. data/spec/fixtures/vcr_cassettes/TriannonClient/GET_annotation_by_ID_/_get_annotation/with_content_type/requests_an_open_annotation_by_ID_with_content_type_text/rdf_turtle_.yml +0 -2502
  93. data/spec/fixtures/vcr_cassettes/TriannonClient/GET_annotation_by_ID_/_get_annotation/with_content_type/requests_an_open_annotation_by_ID_with_content_type_text/turtle_.yml +0 -2502
  94. data/spec/fixtures/vcr_cassettes/TriannonClient/GET_annotation_by_ID_/_get_annotation/with_content_type/requests_an_open_annotation_by_ID_with_content_type_text/x-nquads_.yml +0 -2502
  95. data/spec/fixtures/vcr_cassettes/TriannonClient/GET_annotation_by_ID_/_get_annotation/without_content_type/logs_exceptions.yml +0 -2502
  96. data/spec/fixtures/vcr_cassettes/TriannonClient/GET_annotation_by_ID_/_get_annotation/without_content_type/raises_an_argument_error_with_a_nil_ID.yml +0 -2502
  97. data/spec/fixtures/vcr_cassettes/TriannonClient/GET_annotation_by_ID_/_get_annotation/without_content_type/raises_an_argument_error_with_an_empty_string_ID.yml +0 -2502
  98. data/spec/fixtures/vcr_cassettes/TriannonClient/GET_annotation_by_ID_/_get_annotation/without_content_type/raises_an_argument_error_with_an_integer_ID.yml +0 -2502
  99. data/spec/fixtures/vcr_cassettes/TriannonClient/GET_annotation_by_ID_/_get_annotation/without_content_type/requests_an_open_annotation_by_ID_accepting_a_default_JSON-LD_content.yml +0 -2502
  100. data/spec/fixtures/vcr_cassettes/TriannonClient/GET_annotation_by_ID_/_get_annotation/without_content_type/returns_an_EMPTY_RDF_graph_for_a_500_server_response.yml +0 -2502
  101. data/spec/fixtures/vcr_cassettes/TriannonClient/GET_annotation_by_ID_/_get_annotation/without_content_type/returns_an_EMPTY_RDF_graph_with_a_valid_ID_for_NO_annotation_on_the_server.yml +0 -2561
  102. data/spec/fixtures/vcr_cassettes/TriannonClient/GET_annotation_by_ID_/_get_annotation/without_content_type/returns_an_RDF_graph_with_a_valid_ID_for_an_annotation_on_the_server.yml +0 -4946
  103. data/spec/fixtures/vcr_cassettes/TriannonClient/GET_annotation_by_ID_/_get_iiif_annotation/requests_an_open_annotation_by_ID_using_a_IIIF_profile.yml +0 -2502
  104. data/spec/fixtures/vcr_cassettes/TriannonClient/GET_annotation_by_ID_/_get_iiif_annotation/returns_an_RDF_Graph_of_an_open_annotation.yml +0 -2746
  105. data/spec/fixtures/vcr_cassettes/TriannonClient/GET_annotation_by_ID_/_get_oa_annotation/requests_an_open_annotation_by_ID_using_an_OA_profile.yml +0 -2502
  106. data/spec/fixtures/vcr_cassettes/TriannonClient/GET_annotation_by_ID_/_get_oa_annotation/returns_an_RDF_Graph_of_an_open_annotation.yml +0 -4946
  107. data/spec/fixtures/vcr_cassettes/TriannonClient/_delete_annotation/does_not_log_exceptions_for_missing_annotations_404_responses_.yml +0 -64
  108. data/spec/fixtures/vcr_cassettes/TriannonClient/_delete_annotation/does_not_log_exceptions_for_missing_annotations_410_responses_.yml +0 -64
  109. data/spec/fixtures/vcr_cassettes/TriannonClient/_delete_annotation/logs_exceptions.yml +0 -64
  110. data/spec/fixtures/vcr_cassettes/TriannonClient/_delete_annotation/returns_FALSE_for_a_500_response_to_a_DELETE_request.yml +0 -64
  111. data/spec/fixtures/vcr_cassettes/TriannonClient/_delete_annotation/returns_TRUE_for_a_200_response_to_a_DELETE_request.yml +0 -64
  112. data/spec/fixtures/vcr_cassettes/TriannonClient/_delete_annotation/returns_TRUE_for_a_202_response_to_a_DELETE_request.yml +0 -64
  113. data/spec/fixtures/vcr_cassettes/TriannonClient/_delete_annotation/returns_TRUE_for_a_204_response_to_a_DELETE_request.yml +0 -64
  114. data/spec/fixtures/vcr_cassettes/TriannonClient/_delete_annotation/returns_TRUE_for_a_404_response_to_a_DELETE_request.yml +0 -64
  115. data/spec/fixtures/vcr_cassettes/TriannonClient/_delete_annotation/returns_TRUE_for_a_410_response_to_a_DELETE_request.yml +0 -64
  116. data/spec/fixtures/vcr_cassettes/TriannonClient/_delete_annotation/returns_TRUE_when_deleting_an_open_annotation_that_exists.yml +0 -2549
  117. data/spec/fixtures/vcr_cassettes/TriannonClient/_post_annotation/logs_exceptions.yml +0 -5355
  118. data/spec/fixtures/vcr_cassettes/TriannonClient/_post_annotation/logs_exceptions_for_RestClient_Exception.yml +0 -5355
  119. data/spec/fixtures/vcr_cassettes/TriannonClient/_post_annotation/returns_a_RestClient_Response_object.yml +0 -2502
  120. data/spec/fixtures/vcr_cassettes/TriannonClient/response_processing_utilities/_annotation_id/returns_a_String_ID_from_the_RDF_URI_of_an_annotation.yml +0 -2502
  121. data/spec/fixtures/vcr_cassettes/TriannonClient/response_processing_utilities/_annotation_id/returns_a_String_ID_that_is_not_empty.yml +0 -2502
  122. data/spec/fixtures/vcr_cassettes/TriannonClient/response_processing_utilities/_annotation_uris/returns_an_RDF_URI_that_is_a_valid_URI.yml +0 -2551
  123. data/spec/fixtures/vcr_cassettes/TriannonClient/response_processing_utilities/_annotation_uris/returns_an_array_of_RDF_URI_from_an_RDF_Graph_of_an_annotation.yml +0 -2502
  124. data/spec/fixtures/vcr_cassettes/TriannonClient/response_processing_utilities/_response2graph/accepts_a_RestClient_Response_instance.yml +0 -4898
  125. data/spec/fixtures/vcr_cassettes/TriannonClient/response_processing_utilities/_response2graph/raises_ArgumentError_when_given_an_empty_String.yml +0 -2502
  126. data/spec/fixtures/vcr_cassettes/TriannonClient/response_processing_utilities/_response2graph/raises_ArgumentError_when_given_nil.yml +0 -2502
  127. data/spec/fixtures/vcr_cassettes/TriannonClient/response_processing_utilities/_response2graph/returns_an_RDF_Graph.yml +0 -2502
  128. data/spec/lib/triannon-client/triannon_client_spec.rb +0 -546
@@ -1,546 +0,0 @@
1
- require 'spec_helper'
2
-
3
- # ::TriannonClient::TriannonClient class specs
4
-
5
- describe TriannonClient, :vcr do
6
-
7
- let(:tc) { TriannonClient::TriannonClient.new }
8
- # Note: not using `let` approach for these methods because it
9
- # makes it very difficult to delete any annotations created by
10
- # the `tc.post_annotation`; so the `create_annotation` and the
11
- # `delete_annotation` methods are used in several before/after
12
- # blocks within describe blocks, as required.
13
- # let(:post_response) { tc.post_annotation(@oa_jsonld) }
14
- # let(:anno_graph) { tc.response2graph(post_response) }
15
- # let(:anno_uri) { tc.annotation_uri(anno_graph) }
16
- # let(:anno_id) { tc.annotation_id(anno_uri) }
17
-
18
- before :all do
19
- Dotenv.load
20
- @oa_jsonld = '{"@context":"http://iiif.io/api/presentation/2/context.json","@graph":[{"@id":"_:g70349699654640","@type":["dctypes:Text","cnt:ContentAsText"],"chars":"I love this!","format":"text/plain","language":"en"},{"@type":"oa:Annotation","motivation":"oa:commenting","on":"http://purl.stanford.edu/kq131cs7229","resource":"_:g70349699654640"}]}'
21
- clear_annotations
22
- end
23
-
24
- def clear_annotations
25
- client = TriannonClient::TriannonClient.new
26
- annos = client.get_annotations
27
- q = [nil, RDF.type, RDF::Vocab::OA.Annotation]
28
- anno_ids = annos.query(q).each_subject.collect {|s| tc.annotation_id(s)}
29
- anno_ids.each {|id| client.delete_annotation(id) }
30
- end
31
-
32
- def create_annotation
33
- r = tc.post_annotation(@oa_jsonld)
34
- g = tc.response2graph(r)
35
- uri = tc.annotation_uris(g).first
36
- id = tc.annotation_id(uri)
37
- {
38
- response: r,
39
- graph: g,
40
- uri: uri,
41
- id: id
42
- }
43
- end
44
-
45
- def delete_annotation(id)
46
- tc.delete_annotation(id)
47
- end
48
-
49
- def graph_has_statements(graph)
50
- expect(graph).to be_instance_of RDF::Graph
51
- expect(graph).not_to be_empty
52
- expect(graph.size).to be > 2
53
- end
54
-
55
- def graph_is_empty(graph)
56
- expect(graph).to be_instance_of RDF::Graph
57
- expect(graph).to be_empty
58
- end
59
-
60
- def graph_contains_open_annotation(graph, uri)
61
- result = graph.query([nil, RDF.type, RDF::Vocab::OA.Annotation])
62
- expect(result.size).to be > 0
63
- expect(result.each_subject.collect{|s| s}).to include(uri)
64
- end
65
-
66
- describe 'has constants:' do
67
- it 'CONTENT_TYPES' do
68
- const = TriannonClient::TriannonClient::CONTENT_TYPES
69
- expect(const).to be_instance_of Array
70
- expect(const).to include('application/ld+json')
71
- end
72
- it 'PROFILE_TYPE_IIIF' do
73
- const = TriannonClient::TriannonClient::PROFILE_IIIF
74
- expect(const).to be_instance_of String
75
- expect(const).to include('http://iiif.io/api/presentation/2/context.json')
76
- end
77
- it 'PROFILE_TYPE_OA' do
78
- const = TriannonClient::TriannonClient::PROFILE_OA
79
- expect(const).to be_instance_of String
80
- expect(const).to include('http://www.w3.org/ns/oa-context-20130208.json')
81
- end
82
- it 'CONTENT_TYPE_IIIF' do
83
- const = TriannonClient::TriannonClient::CONTENT_TYPE_IIIF
84
- expect(const).to be_instance_of String
85
- expect(const).to include('application/ld+json')
86
- expect(const).to include('http://iiif.io/api/presentation/2/context.json')
87
- end
88
- it 'CONTENT_TYPE_OA' do
89
- const = TriannonClient::TriannonClient::CONTENT_TYPE_OA
90
- expect(const).to be_instance_of String
91
- expect(const).to include('application/ld+json')
92
- expect(const).to include('http://www.w3.org/ns/oa-context-20130208.json')
93
- end
94
- it 'JSONLD_TYPE' do
95
- const = TriannonClient::TriannonClient::JSONLD_TYPE
96
- expect(const).to be_instance_of String
97
- expect(const).to eql('application/ld+json')
98
- end
99
- end
100
-
101
- describe 'has public methods:' do
102
- it 'delete_annotation' do
103
- expect(tc).to respond_to(:delete_annotation)
104
- end
105
- it 'get_annotations' do
106
- expect(tc).to respond_to(:get_annotations)
107
- end
108
- it 'get_annotation' do
109
- expect(tc).to respond_to(:get_annotation)
110
- end
111
- it 'get_iiif_annotation' do
112
- expect(tc).to respond_to(:get_iiif_annotation)
113
- end
114
- it 'get_oa_annotation' do
115
- expect(tc).to respond_to(:get_oa_annotation)
116
- end
117
- it 'site' do
118
- expect(tc).to respond_to(:site)
119
- end
120
- # utilities
121
- it 'response2graph' do
122
- expect(tc).to respond_to(:response2graph)
123
- end
124
- it 'annotation_id' do
125
- expect(tc).to respond_to(:annotation_id)
126
- end
127
- it 'annotation_uris' do
128
- expect(tc).to respond_to(:annotation_uris)
129
- end
130
- end
131
-
132
- describe 'has private methods:' do
133
- it 'check_id' do
134
- expect(tc).not_to respond_to(:check_id)
135
- end
136
- it 'check_content_type' do
137
- expect(tc).not_to respond_to(:check_content_type)
138
- end
139
- end
140
-
141
- describe "#delete_annotation" do
142
- def test_delete_for_response_code(anno_id, status, response)
143
- allow_any_instance_of(RestClient::Response).to receive(:code).and_return(status)
144
- expect(tc.delete_annotation(anno_id)).to be response
145
- end
146
- it "returns FALSE for a 500 response to a DELETE request" do
147
- test_delete_for_response_code('500_is_false', 500, false)
148
- end
149
- it "returns TRUE for a 200 response to a DELETE request" do
150
- test_delete_for_response_code('200_is_true', 200, true)
151
- end
152
- it "returns TRUE for a 202 response to a DELETE request" do
153
- test_delete_for_response_code('202_is_true', 202, true)
154
- end
155
- it "returns TRUE for a 204 response to a DELETE request" do
156
- test_delete_for_response_code('204_is_true', 204, true)
157
- end
158
- it "returns TRUE for a 404 response to a DELETE request" do
159
- test_delete_for_response_code('404_is_true', 404, true)
160
- end
161
- it "returns TRUE for a 410 response to a DELETE request" do
162
- test_delete_for_response_code('410_is_true', 410, true)
163
- end
164
- it 'validates the annotation ID' do
165
- expect(tc).to receive(:check_id)
166
- tc.delete_annotation('checking_anno_id')
167
- end
168
- it 'quits after detecting an invalid annotation ID' do
169
- expect_any_instance_of(RestClient::Resource).not_to receive(:delete)
170
- tc.delete_annotation('') rescue nil
171
- tc.delete_annotation(nil) rescue nil
172
- end
173
- it 'uses RestClient::Resource.delete to DELETE a valid annotation ID' do
174
- expect_any_instance_of(RestClient::Resource).to receive(:delete)
175
- tc.delete_annotation(SecureRandom.uuid)
176
- end
177
- it 'returns TRUE when deleting an open annotation that exists' do
178
- anno = create_annotation
179
- expect( tc.delete_annotation(anno[:id]) ).to be true
180
- graph = tc.get_annotation(anno[:id])
181
- graph_is_empty(graph)
182
- end
183
- it 'returns TRUE when deleting an open annotation that does NOT exist' do
184
- id = 'anno_does_not_exist'
185
- graph = tc.get_annotation(id)
186
- graph_is_empty(graph)
187
- expect( tc.delete_annotation(id) ).to be true
188
- end
189
- it 'logs exceptions' do
190
- allow_any_instance_of(RestClient::Response).to receive(:code).and_return(450)
191
- allow_any_instance_of(RestClient::Response).to receive(:body).and_return('delete_logs_exceptions')
192
- expect(TriannonClient.configuration.logger).to receive(:error).with(/delete_logs_exceptions/)
193
- tc.delete_annotation('delete_logs_exceptions')
194
- end
195
- it 'does not log exceptions for missing annotations (404 responses)' do
196
- allow_any_instance_of(RestClient::Response).to receive(:code).and_return(404)
197
- allow_any_instance_of(RestClient::Response).to receive(:body).and_return('delete_does_not_log_404_exceptions')
198
- expect(TriannonClient.configuration.logger).not_to receive(:error)
199
- tc.delete_annotation('delete_does_not_log_404_exceptions')
200
- end
201
- it 'does not log exceptions for missing annotations (410 responses)' do
202
- allow_any_instance_of(RestClient::Response).to receive(:code).and_return(410)
203
- allow_any_instance_of(RestClient::Response).to receive(:body).and_return('delete_does_not_log_410_exceptions')
204
- expect(TriannonClient.configuration.logger).not_to receive(:error)
205
- tc.delete_annotation('delete_does_not_log_410_exceptions')
206
- end
207
- end
208
-
209
- describe "#get_annotations" do
210
- it 'returns an RDF::Graph' do
211
- graph = tc.get_annotations
212
- graph_has_statements(graph)
213
- end
214
- it 'returns an RDF::Graph that contains an AnnotationList' do
215
- graph = tc.get_annotations
216
- anno_list_uri = RDF::URI.parse('http://iiif.io/api/presentation/2#AnnotationList')
217
- result = graph.query([nil, nil, anno_list_uri])
218
- expect(result.size).to eql(1)
219
- end
220
- it 'returns an annotation list with an annotation created by a prior POST' do
221
- anno = create_annotation
222
- graph = tc.get_annotations
223
- graph_contains_open_annotation(graph, anno[:uri])
224
- delete_annotation(anno[:id])
225
- end
226
- end
227
-
228
- describe "GET annotation by ID:" do
229
- before(:example) do
230
- # create a new annotation and call all the response processing utils.
231
- @anno = create_annotation
232
- end
233
- after(:example) do
234
- delete_annotation(@anno[:id]) # cleanup after create_annotation
235
- end
236
-
237
- describe "#get_annotation" do
238
- context 'with content_type' do
239
- # Content types could be supported for RDF::Format.content_types.keys,
240
- # but not all of them are supported. The supported content types for
241
- # triannon are defined in
242
- # https://github.com/sul-dlss/triannon/blob/master/config/initializers/mime_types.rb
243
- # https://github.com/sul-dlss/triannon/blob/master/app/controllers/triannon/annotations_controller.rb
244
- # https://github.com/sul-dlss/triannon/blob/master/app/controllers/triannon/search_controller.rb
245
- # The default content type is "application/ld+json" and, at the time of
246
- # writing, triannon also supports:
247
- # turtle as: ["application/x-turtle", "text/turtle"]
248
- # rdf+xml as: ["application/rdf+xml", "text/rdf+xml", "text/rdf"]
249
- # json as: ["application/json", "text/x-json", "application/jsonrequest"]
250
- # xml as: ["application/xml", "text/xml", "application/x-xml"]
251
- # html
252
- def request_anno_with_content_type(content_type)
253
- expect_any_instance_of(RestClient::Resource).to receive(:get).with(hash_including(:accept => content_type) )
254
- tc.get_annotation(@anno[:id], content_type)
255
- end
256
- def gets_anno_with_content_type(content_type)
257
- graph = tc.get_annotation(@anno[:id], content_type)
258
- graph_has_statements(graph)
259
- graph_contains_open_annotation(graph, @anno[:uri])
260
- end
261
- def cannot_get_anno_with_content_type(content_type)
262
- graph = tc.get_annotation(@anno[:id], content_type)
263
- graph_is_empty(graph)
264
- end
265
- # "text/plain",
266
- # "text/html",
267
- # "application/xhtml+xml",
268
- it 'requests an open annotation by ID, with content type "application/ld+json"' do
269
- request_anno_with_content_type("application/ld+json")
270
- end
271
- it 'gets an open annotation by ID, with content type "application/ld+json"' do
272
- gets_anno_with_content_type("application/ld+json")
273
- end
274
- it 'requests an open annotation by ID, with content type "application/x-ld+json"' do
275
- request_anno_with_content_type("application/x-ld+json")
276
- end
277
- it 'cannot get an open annotation by ID, with content type "application/x-ld+json"' do
278
- cannot_get_anno_with_content_type("application/x-ld+json")
279
- end
280
- it 'requests an open annotation by ID, with content type "application/rdf+json"' do
281
- request_anno_with_content_type("application/rdf+json")
282
- end
283
- it 'cannot get an open annotation by ID, with content type "application/rdf+json"' do
284
- cannot_get_anno_with_content_type("application/rdf+json")
285
- end
286
- it 'requests an open annotation by ID, with content type "application/rdf+xml"' do
287
- request_anno_with_content_type("application/rdf+xml")
288
- end
289
- it 'gets an open annotation by ID, with content type "application/rdf+xml"' do
290
- gets_anno_with_content_type("application/rdf+xml")
291
- end
292
- it 'requests an open annotation by ID, with content type "text/turtle"' do
293
- request_anno_with_content_type("text/turtle")
294
- end
295
- it 'gets an open annotation by ID, with content type "text/turtle"' do
296
- gets_anno_with_content_type("text/turtle")
297
- end
298
- it 'requests an open annotation by ID, with content type "text/rdf+turtle"' do
299
- request_anno_with_content_type("text/rdf+turtle")
300
- end
301
- it 'cannot get an open annotation by ID, with content type "text/rdf+turtle"' do
302
- cannot_get_anno_with_content_type("text/rdf+turtle")
303
- end
304
- it 'requests an open annotation by ID, with content type "application/turtle"' do
305
- request_anno_with_content_type("application/turtle")
306
- end
307
- it 'cannot get an open annotation by ID, with content type "application/turtle"' do
308
- cannot_get_anno_with_content_type("application/turtle")
309
- end
310
- it 'requests an open annotation by ID, with content type "application/x-turtle"' do
311
- request_anno_with_content_type("application/x-turtle")
312
- end
313
- it 'gets an open annotation by ID, with content type "application/x-turtle"' do
314
- gets_anno_with_content_type("application/x-turtle")
315
- end
316
- it 'requests an open annotation by ID, with content type "application/n-triples"' do
317
- request_anno_with_content_type("application/n-triples")
318
- end
319
- it 'cannot get an open annotation by ID, with content type "application/n-triples"' do
320
- cannot_get_anno_with_content_type("application/n-triples")
321
- end
322
- it 'requests an open annotation by ID, with content type "application/rdf+n3"' do
323
- request_anno_with_content_type("application/rdf+n3")
324
- end
325
- it 'cannot get an open annotation by ID, with content type "application/rdf+n3"' do
326
- cannot_get_anno_with_content_type("application/rdf+n3")
327
- end
328
- it 'requests an open annotation by ID, with content type "text/n3"' do
329
- request_anno_with_content_type("text/n3")
330
- end
331
- it 'cannot get an open annotation by ID, with content type "text/n3"' do
332
- cannot_get_anno_with_content_type("text/n3")
333
- end
334
- it 'requests an open annotation by ID, with content type "text/rdf+n3"' do
335
- request_anno_with_content_type("text/rdf+n3")
336
- end
337
- it 'cannot get an open annotation by ID, with content type "text/rdf+n3"' do
338
- cannot_get_anno_with_content_type("text/rdf+n3")
339
- end
340
- it 'requests an open annotation by ID, with content type "application/n-quads"' do
341
- request_anno_with_content_type("application/n-quads")
342
- end
343
- it 'cannot get an open annotation by ID, with content type "application/n-quads"' do
344
- cannot_get_anno_with_content_type("application/n-quads")
345
- end
346
- it 'requests an open annotation by ID, with content type "text/x-nquads"' do
347
- request_anno_with_content_type("text/x-nquads")
348
- end
349
- it 'cannot get an open annotation by ID, with content type "text/x-nquads"' do
350
- cannot_get_anno_with_content_type("text/x-nquads")
351
- end
352
- it 'requests an open annotation by ID, with content type "application/trig"' do
353
- request_anno_with_content_type("application/trig")
354
- end
355
- it 'cannot get an open annotation by ID, with content type "application/trig"' do
356
- cannot_get_anno_with_content_type("application/trig")
357
- end
358
- it 'requests an open annotation by ID, with content type "application/x-trig"' do
359
- request_anno_with_content_type("application/x-trig")
360
- end
361
- it 'cannot get an open annotation by ID, with content type "application/x-trig"' do
362
- cannot_get_anno_with_content_type("application/x-trig")
363
- end
364
- it 'requests an open annotation by ID, with content type "application/trix"' do
365
- request_anno_with_content_type("application/trix")
366
- end
367
- it 'cannot get an open annotation by ID, with content type "application/trix"' do
368
- cannot_get_anno_with_content_type("application/trix")
369
- end
370
- end
371
- context 'without content_type' do
372
- it 'requests an open annotation by ID, accepting a default JSON-LD content' do
373
- graph_contains_open_annotation(@anno[:graph], @anno[:uri])
374
- content_type = TriannonClient::TriannonClient::JSONLD_TYPE
375
- expect_any_instance_of(RestClient::Resource).to receive(:get).with(hash_including(:accept => content_type) )
376
- tc.get_annotation(@anno[:id])
377
- end
378
- it 'checks the annotation ID' do
379
- expect(tc).to receive(:check_id) # tested by #create_annotation
380
- graph_has_statements(@anno[:graph]) # check #create_annotation worked
381
- end
382
- it 'raises an argument error with a nil ID' do
383
- expect{tc.get_annotation(nil)}.to raise_error(ArgumentError)
384
- end
385
- it 'raises an argument error with an integer ID' do
386
- expect{tc.get_annotation(0)}.to raise_error(ArgumentError)
387
- end
388
- it 'raises an argument error with an empty string ID' do
389
- expect{tc.get_annotation('')}.to raise_error(ArgumentError)
390
- end
391
- it 'returns an RDF graph with a valid ID for an annotation on the server' do
392
- graph = tc.get_annotation(@anno[:id])
393
- graph_has_statements(graph)
394
- graph_contains_open_annotation(@anno[:graph], @anno[:uri])
395
- end
396
- it 'returns an EMPTY RDF graph with a valid ID for NO annotation on the server' do
397
- id = SecureRandom.uuid
398
- graph = tc.get_annotation(id)
399
- graph_is_empty(graph)
400
- end
401
- it 'returns an EMPTY RDF graph for a 500 server response' do
402
- response = double
403
- allow(response).to receive(:is_a?).and_return(RestClient::Response)
404
- allow(response).to receive(:headers).and_return({content_type: 'application/ld+json'})
405
- allow(response).to receive(:code).and_return(500)
406
- allow_any_instance_of(RestClient::Resource).to receive(:get).and_return(response)
407
- graph = tc.get_annotation(@anno[:id])
408
- graph_is_empty(graph)
409
- end
410
- it 'logs exceptions' do
411
- allow_any_instance_of(RestClient::Resource).to receive(:get).and_raise('get_exception')
412
- expect(TriannonClient.configuration.logger).to receive(:error).with(/get_exception/)
413
- tc.get_annotation('raise_get_exception')
414
- end
415
- end
416
- end
417
-
418
- describe "#get_iiif_annotation" do
419
- # the mime type is fixed for this method
420
- it 'requests an open annotation by ID, using a IIIF profile' do
421
- graph_contains_open_annotation(@anno[:graph], @anno[:uri])
422
- content_type = TriannonClient::TriannonClient::CONTENT_TYPE_IIIF
423
- expect(tc).to receive(:get_annotation).with(@anno[:id], content_type)
424
- tc.get_iiif_annotation(@anno[:id])
425
- end
426
- it 'returns an RDF::Graph of an open annotation' do
427
- graph = tc.get_iiif_annotation(@anno[:id])
428
- graph_has_statements(graph)
429
- graph_contains_open_annotation(@anno[:graph], @anno[:uri])
430
- end
431
- end
432
-
433
- describe "#get_oa_annotation" do
434
- # the mime type is fixed for this method
435
- it 'requests an open annotation by ID, using an OA profile' do
436
- graph_contains_open_annotation(@anno[:graph], @anno[:uri])
437
- content_type = TriannonClient::TriannonClient::CONTENT_TYPE_OA
438
- expect(tc).to receive(:get_annotation).with(@anno[:id], content_type)
439
- tc.get_oa_annotation(@anno[:id])
440
- end
441
- it 'returns an RDF::Graph of an open annotation' do
442
- graph = tc.get_oa_annotation(@anno[:id])
443
- graph_has_statements(graph)
444
- graph_contains_open_annotation(@anno[:graph], @anno[:uri])
445
- end
446
- end
447
-
448
- end
449
-
450
- describe "#post_annotation" do
451
- it 'does not raise an error when submitting a valid open annotation' do
452
- response = nil
453
- expect do
454
- response = tc.post_annotation(@oa_jsonld)
455
- end.not_to raise_error
456
- # Double check the POST by deleting the annotation.
457
- # If the POST was successful, the DELETE should work too.
458
- graph = tc.response2graph(response)
459
- uri = tc.annotation_uris(graph).first
460
- id = tc.annotation_id(uri)
461
- expect(tc.delete_annotation(id)).to be true
462
- end
463
- it 'returns a RestClient::Response object' do
464
- # The response behaves primarily as a String, so it can not be tested
465
- # as an instance of RestClient::Response, but it can be tested to respond
466
- # to RestClient::Response methods.
467
- anno = create_annotation
468
- r = anno[:response]
469
- expect(r.is_a? RestClient::Response).to be true
470
- expect(r).to respond_to(:code)
471
- expect(r).to respond_to(:body)
472
- expect(r).to respond_to(:headers)
473
- delete_annotation(anno[:id]) # cleanup after create_annotation
474
- end
475
- it 'logs exceptions for RestClient::Exception' do
476
- exception_response = double()
477
- allow(exception_response).to receive(:code).and_return(500)
478
- allow(exception_response).to receive(:body).and_return('post_logs_exceptions')
479
- allow_any_instance_of(RestClient::Exception).to receive(:response).and_return(exception_response)
480
- expect(TriannonClient.configuration.logger).to receive(:error).with(/post_logs_exceptions/)
481
- tc.post_annotation('post_logs_exceptions')
482
- end
483
- it 'logs exceptions' do
484
- exception_response = double()
485
- allow(exception_response).to receive(:code).and_return(500)
486
- allow(exception_response).to receive(:body).and_return('post_logs_exceptions')
487
- allow_any_instance_of(RestClient::Exception).to receive(:response).and_return(exception_response)
488
- expect(TriannonClient.configuration.logger).to receive(:error).with(/post_logs_exceptions/)
489
- tc.post_annotation('post_logs_exceptions')
490
- end
491
- end
492
-
493
-
494
- describe 'response processing utilities' do
495
-
496
- before(:example) do
497
- # create a new annotation and call all the response processing utils.
498
- @anno = create_annotation
499
- end
500
- after(:example) do
501
- delete_annotation(@anno[:id]) # cleanup after create_annotation
502
- end
503
-
504
- describe '#response2graph' do
505
- it 'accepts a RestClient::Response instance' do
506
- r = @anno[:response]
507
- expect{tc.response2graph(r)}.not_to raise_error
508
- end
509
- it 'raises ArgumentError when given nil' do
510
- expect{tc.response2graph(nil)}.to raise_error(ArgumentError)
511
- end
512
- it 'raises ArgumentError when given an empty String' do
513
- expect{tc.response2graph('')}.to raise_error(ArgumentError)
514
- end
515
- it 'returns an RDF::Graph' do
516
- expect(@anno[:graph]).to be_instance_of RDF::Graph
517
- end
518
- end
519
-
520
- describe "#annotation_uris" do
521
- it "returns an array of RDF::URI from an RDF::Graph of an annotation" do
522
- expect(@anno[:graph]).to be_instance_of RDF::Graph
523
- expect(tc.annotation_uris(@anno[:graph])).to be_instance_of Array
524
- expect(@anno[:uri]).to be_instance_of RDF::URI
525
- end
526
- it "returns an RDF::URI that is a valid URI" do
527
- expect(@anno[:uri]).to match(/\A#{URI::regexp}\z/)
528
- delete_annotation(@anno[:id]) # cleanup after create_annotation
529
- end
530
- end
531
-
532
- describe "#annotation_id" do
533
- it "returns a String ID from the RDF::URI of an annotation" do
534
- expect(@anno[:uri]).to be_instance_of RDF::URI
535
- expect(@anno[:id]).to be_instance_of String
536
- end
537
- it "returns a String ID that is not empty" do
538
- expect(@anno[:id]).to be_instance_of String
539
- expect(@anno[:id].empty?).to be false
540
- end
541
- end
542
-
543
- end
544
-
545
- end
546
-