diff --git a/app/controllers/concerns/facetable.rb b/app/controllers/concerns/facetable.rb index c93f0eeb0..929b72e43 100644 --- a/app/controllers/concerns/facetable.rb +++ b/app/controllers/concerns/facetable.rb @@ -114,7 +114,8 @@ def facet_by_resource_type(arr) end def facet_by_affiliation(arr) - # generate hash with id and name for each provider in facet + # generate hash with id and name for each affiliation in facet + return [] if arr.blank? ids = arr.map { |hsh| "\"#{hsh["key"]}\"" }.join(" ") affiliations = Organization.query(ids, size: 1000)[:data] || [] diff --git a/app/controllers/dois_controller.rb b/app/controllers/dois_controller.rb index 31d6db82a..da0254114 100644 --- a/app/controllers/dois_controller.rb +++ b/app/controllers/dois_controller.rb @@ -56,6 +56,7 @@ def index consortium_id: params[:consortium_id], client_id: params[:client_id], affiliation_id: params[:affiliation_id], + funder_id: params[:funder_id], re3data_id: params[:re3data_id], opendoar_id: params[:opendoar_id], certificate: params[:certificate], diff --git a/app/graphql/schema.graphql b/app/graphql/schema.graphql index 3bcc48018..32c96739f 100644 --- a/app/graphql/schema.graphql +++ b/app/graphql/schema.graphql @@ -710,7 +710,27 @@ type DataCatalog { certificates: [DefinedTerm!] """ - Datasets hosted by the repository + The number of citations. + """ + citationCount: Int + + """ + Repository contact information + """ + contacts: [String!] + + """ + Data accesses + """ + dataAccesses: [TextRestriction!] + + """ + Data uploads + """ + dataUploads: [TextRestriction!] + + """ + Funded datasets """ datasets( """ @@ -722,20 +742,31 @@ type DataCatalog { Returns the elements in the list that come before the specified cursor. """ before: String + clientId: String first: Int = 25 + hasCitations: Int + hasDownloads: Int + hasViews: Int """ Returns the last _n_ elements from the list. """ last: Int + providerId: String query: String - ): DataCatalogDatasetConnectionWithMeta! + userId: String + ): DatasetConnectionWithMeta """ A description of the data catalog. """ description: String + """ + The number of downloads according to the Counter Code of Practice. + """ + downloadCount: Int + """ The ID of the data catalog. """ @@ -763,53 +794,19 @@ type DataCatalog { name: String """ - Publications hosted by the repository + PID Systems """ - publications( - """ - Returns the elements in the list that come after the specified cursor. - """ - after: String - - """ - Returns the elements in the list that come before the specified cursor. - """ - before: String - first: Int = 25 - - """ - Returns the last _n_ elements from the list. - """ - last: Int - query: String - ): DataCatalogPublicationConnectionWithMeta! + pidSystems: [String!] """ - Software + Provider types """ - softwareApplication: [SoftwareApplication!] + providerTypes: [String!] """ - Software hosted by the repository + Software """ - softwareSourceCodes( - """ - Returns the elements in the list that come after the specified cursor. - """ - after: String - - """ - Returns the elements in the list that come before the specified cursor. - """ - before: String - first: Int = 25 - - """ - Returns the last _n_ elements from the list. - """ - last: Int - query: String - ): DataCatalogSoftwareConnectionWithMeta! + softwareApplication: [SoftwareApplication!] """ Subject areas covered by the data catalog. @@ -825,6 +822,11 @@ type DataCatalog { URL of the data catalog. """ url: String + + """ + The number of views according to the Counter Code of Practice. + """ + viewCount: Int } """ @@ -850,27 +852,6 @@ type DataCatalogConnectionWithMeta { totalCount: Int } -""" -The connection type for Dataset. -""" -type DataCatalogDatasetConnectionWithMeta { - """ - A list of edges. - """ - edges: [DatasetEdge] - - """ - A list of nodes. - """ - nodes: [Dataset] - - """ - Information to aid in pagination. - """ - pageInfo: PageInfo! - totalCount: Int! -} - """ An edge in a connection. """ @@ -886,48 +867,6 @@ type DataCatalogEdge { node: DataCatalog } -""" -The connection type for Dataset. -""" -type DataCatalogPublicationConnectionWithMeta { - """ - A list of edges. - """ - edges: [DatasetEdge] - - """ - A list of nodes. - """ - nodes: [Dataset] - - """ - Information to aid in pagination. - """ - pageInfo: PageInfo! - totalCount: Int! -} - -""" -The connection type for Dataset. -""" -type DataCatalogSoftwareConnectionWithMeta { - """ - A list of edges. - """ - edges: [DatasetEdge] - - """ - A list of nodes. - """ - nodes: [Dataset] - - """ - Information to aid in pagination. - """ - pageInfo: PageInfo! - totalCount: Int! -} - type DataPaper implements DoiItem { """ Total number of citations. @@ -2090,6 +2029,11 @@ type Funder { """ alternateName: [String!] + """ + The number of citations. + """ + citationCount: Int + """ Funded datasets """ @@ -2103,13 +2047,25 @@ type Funder { Returns the elements in the list that come before the specified cursor. """ before: String + clientId: String first: Int = 25 + hasCitations: Int + hasDownloads: Int + hasViews: Int """ Returns the last _n_ elements from the list. """ last: Int - ): FunderDatasetConnectionWithMeta! + providerId: String + query: String + userId: String + ): DatasetConnectionWithMeta + + """ + The number of downloads according to the Counter Code of Practice. + """ + downloadCount: Int """ Crossref Funder ID @@ -2134,19 +2090,25 @@ type Funder { Returns the elements in the list that come before the specified cursor. """ before: String + clientId: String first: Int = 25 + hasCitations: Int + hasDownloads: Int + hasViews: Int """ Returns the last _n_ elements from the list. """ last: Int + providerId: String query: String - ): FunderPublicationConnectionWithMeta! + userId: String + ): PublicationConnectionWithMeta """ Funded software """ - softwareSourceCodes( + softwares( """ Returns the elements in the list that come after the specified cursor. """ @@ -2156,18 +2118,58 @@ type Funder { Returns the elements in the list that come before the specified cursor. """ before: String + clientId: String first: Int = 25 + hasCitations: Int + hasDownloads: Int + hasViews: Int """ Returns the last _n_ elements from the list. """ last: Int - ): FunderSoftwareConnectionWithMeta! + providerId: String + query: String + userId: String + ): SoftwareConnectionWithMeta """ The type of the item. """ type: String! + + """ + The number of views according to the Counter Code of Practice. + """ + viewCount: Int + + """ + Funded works + """ + works( + """ + Returns the elements in the list that come after the specified cursor. + """ + after: String + + """ + Returns the elements in the list that come before the specified cursor. + """ + before: String + clientId: String + first: Int = 25 + hasCitations: Int + hasDownloads: Int + hasViews: Int + + """ + Returns the last _n_ elements from the list. + """ + last: Int + providerId: String + query: String + userId: String + ): WorkConnectionWithMeta } """ @@ -2195,27 +2197,6 @@ type FunderConnectionWithMeta { totalCount: Int! } -""" -The connection type for EventData. -""" -type FunderDatasetConnectionWithMeta { - """ - A list of edges. - """ - edges: [EventDataEdge] - - """ - A list of nodes. - """ - nodes: [EventData] - - """ - Information to aid in pagination. - """ - pageInfo: PageInfo! - totalCount: Int! -} - """ An edge in a connection. """ @@ -2231,48 +2212,6 @@ type FunderEdge { node: Funder } -""" -The connection type for EventData. -""" -type FunderPublicationConnectionWithMeta { - """ - A list of edges. - """ - edges: [EventDataEdge] - - """ - A list of nodes. - """ - nodes: [EventData] - - """ - Information to aid in pagination. - """ - pageInfo: PageInfo! - totalCount: Int! -} - -""" -The connection type for EventData. -""" -type FunderSoftwareConnectionWithMeta { - """ - A list of edges. - """ - edges: [EventDataEdge] - - """ - A list of nodes. - """ - nodes: [EventData] - - """ - Information to aid in pagination. - """ - pageInfo: PageInfo! - totalCount: Int! -} - """ Information about funding """ @@ -2823,6 +2762,11 @@ type Organization { """ alternateName: [String!] + """ + The number of citations. + """ + citationCount: Int + """ Datasets from this organization """ @@ -2836,13 +2780,26 @@ type Organization { Returns the elements in the list that come before the specified cursor. """ before: String + clientId: String first: Int = 25 + funderId: String + hasCitations: Int + hasDownloads: Int + hasViews: Int """ Returns the last _n_ elements from the list. """ last: Int - ): OrganizationDatasetConnectionWithMeta! + providerId: String + query: String + userId: String + ): DatasetConnectionWithMeta + + """ + The number of downloads according to the Counter Code of Practice. + """ + downloadCount: Int """ ROR ID @@ -2872,19 +2829,26 @@ type Organization { Returns the elements in the list that come before the specified cursor. """ before: String + clientId: String first: Int = 25 + funderId: String + hasCitations: Int + hasDownloads: Int + hasViews: Int """ Returns the last _n_ elements from the list. """ last: Int + providerId: String query: String - ): OrganizationPublicationConnectionWithMeta! + userId: String + ): PublicationConnectionWithMeta """ Software from this organization """ - softwareSourceCodes( + softwares( """ Returns the elements in the list that come after the specified cursor. """ @@ -2894,13 +2858,21 @@ type Organization { Returns the elements in the list that come before the specified cursor. """ before: String + clientId: String first: Int = 25 + funderId: String + hasCitations: Int + hasDownloads: Int + hasViews: Int """ Returns the last _n_ elements from the list. """ last: Int - ): OrganizationSoftwareConnectionWithMeta! + providerId: String + query: String + userId: String + ): SoftwareConnectionWithMeta """ The type of the item. @@ -2911,48 +2883,61 @@ type Organization { URL of the organization. """ url: [String!] -} -""" -The connection type for Organization. -""" -type OrganizationConnectionWithMeta { """ - A list of edges. + The number of views according to the Counter Code of Practice. """ - edges: [OrganizationEdge] + viewCount: Int """ - A list of nodes. + Works from this organization """ - nodes: [Organization] + works( + """ + Returns the elements in the list that come after the specified cursor. + """ + after: String - """ - Information to aid in pagination. - """ - pageInfo: PageInfo! - personConnectionCount: Int! - totalCount: Int! + """ + Returns the elements in the list that come before the specified cursor. + """ + before: String + clientId: String + first: Int = 25 + funderId: String + hasCitations: Int + hasDownloads: Int + hasViews: Int + + """ + Returns the last _n_ elements from the list. + """ + last: Int + providerId: String + query: String + userId: String + ): WorkConnectionWithMeta } """ -The connection type for EventData. +The connection type for Organization. """ -type OrganizationDatasetConnectionWithMeta { +type OrganizationConnectionWithMeta { """ A list of edges. """ - edges: [EventDataEdge] + edges: [OrganizationEdge] """ A list of nodes. """ - nodes: [EventData] + nodes: [Organization] """ Information to aid in pagination. """ pageInfo: PageInfo! + personConnectionCount: Int! totalCount: Int! } @@ -2971,48 +2956,6 @@ type OrganizationEdge { node: Organization } -""" -The connection type for EventData. -""" -type OrganizationPublicationConnectionWithMeta { - """ - A list of edges. - """ - edges: [EventDataEdge] - - """ - A list of nodes. - """ - nodes: [EventData] - - """ - Information to aid in pagination. - """ - pageInfo: PageInfo! - totalCount: Int! -} - -""" -The connection type for EventData. -""" -type OrganizationSoftwareConnectionWithMeta { - """ - A list of edges. - """ - edges: [EventDataEdge] - - """ - A list of nodes. - """ - nodes: [EventData] - - """ - Information to aid in pagination. - """ - pageInfo: PageInfo! - totalCount: Int! -} - type Other implements DoiItem { """ Total number of citations. @@ -5363,6 +5306,31 @@ type Subject { valueUri: String } +""" +Information +""" +type Text { + """ + Information + """ + text: String! +} + +""" +Information +""" +type TextRestriction { + """ + Restriction + """ + restriction: [Text!] + + """ + Information + """ + text: String! +} + """ Information about titles """ diff --git a/app/graphql/types/data_catalog_connection_with_meta_type.rb b/app/graphql/types/data_catalog_connection_with_meta_type.rb index 7c02dd45a..5bc7d3452 100644 --- a/app/graphql/types/data_catalog_connection_with_meta_type.rb +++ b/app/graphql/types/data_catalog_connection_with_meta_type.rb @@ -9,10 +9,11 @@ class DataCatalogConnectionWithMetaType < BaseConnection def total_count args = object.arguments + DataCatalog.query(args[:query], limit: 0).dig(:meta, "total").to_i end def dataset_connection_count - Doi.query("client.re3data_id:*", page: { number: 1, size: 0 }).results.total + @dataset_connection_count ||= Doi.query("client.re3data_id:*", page: { number: 1, size: 0 }).results.total end end diff --git a/app/graphql/types/data_catalog_dataset_connection_with_meta_type.rb b/app/graphql/types/data_catalog_dataset_connection_with_meta_type.rb deleted file mode 100644 index 6170bec87..000000000 --- a/app/graphql/types/data_catalog_dataset_connection_with_meta_type.rb +++ /dev/null @@ -1,14 +0,0 @@ -# frozen_string_literal: true - -class DataCatalogDatasetConnectionWithMetaType < BaseConnection - edge_type(DatasetEdgeType) - field_class GraphQL::Cache::Field - - field :total_count, Integer, null: false, cache: true - - def total_count - args = object.arguments - - Doi.query(args[:query], re3data_id: doi_from_url(object.parent[:id]), resource_type_id: "Dataset", state: "findable", page: { number: 1, size: 0 }).results.total - end -end diff --git a/app/graphql/types/data_catalog_publication_connection_with_meta_type.rb b/app/graphql/types/data_catalog_publication_connection_with_meta_type.rb deleted file mode 100644 index 2657d63d3..000000000 --- a/app/graphql/types/data_catalog_publication_connection_with_meta_type.rb +++ /dev/null @@ -1,14 +0,0 @@ -# frozen_string_literal: true - -class DataCatalogPublicationConnectionWithMetaType < BaseConnection - edge_type(DatasetEdgeType) - field_class GraphQL::Cache::Field - - field :total_count, Integer, null: false, cache: true - - def total_count - args = object.arguments - - Doi.query(args[:query], re3data_id: doi_from_url(object.parent[:id]), resource_type_id: "Text", state: "findable", page: { number: 1, size: 0 }).results.total - end -end diff --git a/app/graphql/types/data_catalog_software_connection_with_meta_type.rb b/app/graphql/types/data_catalog_software_connection_with_meta_type.rb deleted file mode 100644 index ea593f7e1..000000000 --- a/app/graphql/types/data_catalog_software_connection_with_meta_type.rb +++ /dev/null @@ -1,14 +0,0 @@ -# frozen_string_literal: true - -class DataCatalogSoftwareConnectionWithMetaType < BaseConnection - edge_type(DatasetEdgeType) - field_class GraphQL::Cache::Field - - field :total_count, Integer, null: false, cache: true - - def total_count - args = object.arguments - - Doi.query(args[:query], re3data_id: doi_from_url(object.parent[:id]), resource_type_id: "Software", state: "findable", page: { number: 1, size: 0 }).results.total - end -end diff --git a/app/graphql/types/data_catalog_type.rb b/app/graphql/types/data_catalog_type.rb index b4929ceff..56b1f772d 100644 --- a/app/graphql/types/data_catalog_type.rb +++ b/app/graphql/types/data_catalog_type.rb @@ -9,32 +9,32 @@ class DataCatalogType < BaseObject field :name, String, null: true, description: "The name of the data catalog." field :alternate_name, [String], null: true, description: "An alias for the data catalog." field :url, String, null: true, hash_key: "repositoryUrl", description: "URL of the data catalog." - # field :contacts, [String], null: true, description: "Repository contact information" + field :contacts, [String], null: true, description: "Repository contact information" field :description, String, null: true, description: "A description of the data catalog." field :certificates, [DefinedTermType], null: true, description: "Certificates of the data catalog." field :subjects, [DefinedTermType], null: true, description: "Subject areas covered by the data catalog." # field :types, [String], null: true, description: "Repository types" # field :content_types, [SchemeType], null: true, description: "Content types" - # field :provider_types, [String], null: true, description: "Provider types" + field :provider_types, [String], null: true, description: "Provider types" field :in_language, [String], null: true, description: "The language of the content of the data catalog." field :keywords, String, null: true, description: "Keywords or tags used to describe this data catalog. Multiple entries in a keywords list are typically delimited by commas." - # field :data_accesses, [TextRestrictionType], null: true, description: "Data accesses" - # field :data_uploads, [TextRestrictionType], null: true, description: "Data uploads" - # field :pid_systems, [String], null: true, description: "PID Systems" + field :data_accesses, [TextRestrictionType], null: true, description: "Data accesses" + field :data_uploads, [TextRestrictionType], null: true, description: "Data uploads" + field :pid_systems, [String], null: true, description: "PID Systems" # field :apis, [ApiType], null: true, description: "APIs" field :software_application, [SoftwareApplicationType], null: true, description: "Software" - field :datasets, DataCatalogDatasetConnectionWithMetaType, null: false, connection: true, description: "Datasets hosted by the repository" do - argument :query, String, required: false - argument :first, Int, required: false, default_value: 25 - end - - field :publications, DataCatalogPublicationConnectionWithMetaType, null: false, connection: true, description: "Publications hosted by the repository" do - argument :query, String, required: false - argument :first, Int, required: false, default_value: 25 - end + field :view_count, Integer, null: true, description: "The number of views according to the Counter Code of Practice." + field :download_count, Integer, null: true, description: "The number of downloads according to the Counter Code of Practice." + field :citation_count, Integer, null: true, description: "The number of citations." - field :software_source_codes, DataCatalogSoftwareConnectionWithMetaType, null: false, connection: true, description: "Software hosted by the repository" do + field :datasets, DatasetConnectionWithMetaType, null: true, description: "Funded datasets", connection: true do argument :query, String, required: false + argument :user_id, String, required: false + argument :client_id, String, required: false + argument :provider_id, String, required: false + argument :has_citations, Int, required: false + argument :has_views, Int, required: false + argument :has_downloads, Int, required: false argument :first, Int, required: false, default_value: 25 end @@ -78,26 +78,22 @@ def software_application end def datasets(**args) - Doi.query(args[:query], re3data_id: doi_from_url(object.id), resource_type_id: "Dataset", page: { number: 1, size: args[:first] }).results.to_a + Doi.query(args[:query], re3data_id: object[:id], user_id: args[:user_id], client_id: args[:client_id], provider_id: args[:provider_id], has_citations: args[:has_citations], has_views: args[:has_views], has_downloads: args[:has_downloads], resource_type_id: "Dataset", state: "findable", page: { number: 1, size: args[:first] }).results.to_a end - def publications(**args) - Doi.query(args[:query], re3data_id: doi_from_url(object[:id]), resource_type_id: "Text", page: { number: 1, size: args[:first] }).results.to_a + def view_count + response.results.total.positive? ? aggregate_count(response.response.aggregations.views.buckets) : [] end - def software_source_codes(**args) - Doi.query(args[:query], re3data_id: doi_from_url(object[:id]), resource_type_id: "Software", page: { number: 1, size: args[:first] }).results.to_a - end - - def datasets(**args) - Doi.query(args[:query], client_id: object.uid, resource_type_id: "Dataset", page: { number: 1, size: args[:first] }).results.to_a + def download_count + response.results.total.positive? ? aggregate_count(response.response.aggregations.downloads.buckets) : [] end - def publications(**args) - Doi.query(args[:query], client_id: object.uid, resource_type_id: "Text", page: { number: 1, size: args[:first] }).results.to_a + def citation_count + response.results.total.positive? ? aggregate_count(response.response.aggregations.citations.buckets) : [] end - def software_source_codes(**args) - Doi.query(args[:query], client_id: object.uid, resource_type_id: "Software", page: { number: 1, size: args[:first] }).results.to_a + def response + @response ||= Doi.query(nil, re3data_id: object[:id], state: "findable", page: { number: 1, size: 0 }) end end diff --git a/app/graphql/types/doi_item.rb b/app/graphql/types/doi_item.rb index 09f6929df..aaebdbe71 100644 --- a/app/graphql/types/doi_item.rb +++ b/app/graphql/types/doi_item.rb @@ -49,7 +49,7 @@ module DoiItem field :references, [WorkType], null: true, description: "References." def type - object.types["schemaOrg"] + object.types["resourceTypeGeneral"] end def creators(first: nil) diff --git a/app/graphql/types/funder_connection_with_meta_type.rb b/app/graphql/types/funder_connection_with_meta_type.rb index 4d1ab00f7..73161c880 100644 --- a/app/graphql/types/funder_connection_with_meta_type.rb +++ b/app/graphql/types/funder_connection_with_meta_type.rb @@ -16,14 +16,14 @@ def total_count end def publication_connection_count - Event.query(nil, citation_type: "Funder-ScholarlyArticle").results.total + @publication_connection_count ||= Event.query(nil, citation_type: "Funder-ScholarlyArticle").results.total end def dataset_connection_count - Event.query(nil, citation_type: "Dataset-Funder").results.total + @dataset_connection_count ||= Event.query(nil, citation_type: "Dataset-Funder").results.total end def software_connection_count - Event.query(nil, citation_type: "Funder-SoftwareSourceCode").results.total + @software_connection_count ||= Event.query(nil, citation_type: "Funder-SoftwareSourceCode").results.total end end diff --git a/app/graphql/types/funder_dataset_connection_with_meta_type.rb b/app/graphql/types/funder_dataset_connection_with_meta_type.rb deleted file mode 100644 index 039294e7b..000000000 --- a/app/graphql/types/funder_dataset_connection_with_meta_type.rb +++ /dev/null @@ -1,12 +0,0 @@ -# frozen_string_literal: true - -class FunderDatasetConnectionWithMetaType < BaseConnection - edge_type(EventDataEdgeType, edge_class: EventDataEdge) - field_class GraphQL::Cache::Field - - field :total_count, Integer, null: false, cache: true - - def total_count - Event.query(nil, obj_id: object.parent[:id], citation_type: "Dataset-Funder").results.total - end -end diff --git a/app/graphql/types/funder_publication_connection_with_meta_type.rb b/app/graphql/types/funder_publication_connection_with_meta_type.rb deleted file mode 100644 index 45e302473..000000000 --- a/app/graphql/types/funder_publication_connection_with_meta_type.rb +++ /dev/null @@ -1,12 +0,0 @@ -# frozen_string_literal: true - -class FunderPublicationConnectionWithMetaType < BaseConnection - edge_type(EventDataEdgeType, edge_class: EventDataEdge) - field_class GraphQL::Cache::Field - - field :total_count, Integer, null: false, cache: true - - def total_count - Event.query(nil, obj_id: object.parent[:id], citation_type: "Funder-ScholarlyArticle").results.total - end -end diff --git a/app/graphql/types/funder_software_connection_with_meta_type.rb b/app/graphql/types/funder_software_connection_with_meta_type.rb deleted file mode 100644 index 3f7a7f763..000000000 --- a/app/graphql/types/funder_software_connection_with_meta_type.rb +++ /dev/null @@ -1,12 +0,0 @@ -# frozen_string_literal: true - -class FunderSoftwareConnectionWithMetaType < BaseConnection - edge_type(EventDataEdgeType, edge_class: EventDataEdge) - field_class GraphQL::Cache::Field - - field :total_count, Integer, null: false, cache: true - - def total_count - Event.query(nil, obj_id: object.parent[:id], citation_type: "Funder-SoftwareSourceCode").results.total - end -end diff --git a/app/graphql/types/funder_type.rb b/app/graphql/types/funder_type.rb index 7c7a2bfc6..14dd57958 100644 --- a/app/graphql/types/funder_type.rb +++ b/app/graphql/types/funder_type.rb @@ -8,16 +8,51 @@ class FunderType < BaseObject field :name, String, null: false, description: "The name of the funder." field :alternate_name, [String], null: true, description: "An alias for the funder." field :address, AddressType, null: true, description: "Physical address of the funder." - field :datasets, FunderDatasetConnectionWithMetaType, null: false, description: "Funded datasets", connection: true do + field :view_count, Integer, null: true, description: "The number of views according to the Counter Code of Practice." + field :download_count, Integer, null: true, description: "The number of downloads according to the Counter Code of Practice." + field :citation_count, Integer, null: true, description: "The number of citations." + + field :datasets, DatasetConnectionWithMetaType, null: true, description: "Funded datasets", connection: true do + argument :query, String, required: false + argument :user_id, String, required: false + argument :client_id, String, required: false + argument :provider_id, String, required: false + argument :has_citations, Int, required: false + argument :has_views, Int, required: false + argument :has_downloads, Int, required: false argument :first, Int, required: false, default_value: 25 end - field :publications, FunderPublicationConnectionWithMetaType, null: false, description: "Funded publications", connection: true do + field :publications, PublicationConnectionWithMetaType, null: true, description: "Funded publications", connection: true do argument :query, String, required: false + argument :user_id, String, required: false + argument :client_id, String, required: false + argument :provider_id, String, required: false + argument :has_citations, Int, required: false + argument :has_views, Int, required: false + argument :has_downloads, Int, required: false argument :first, Int, required: false, default_value: 25 end - field :software_source_codes, FunderSoftwareConnectionWithMetaType, null: false, description: "Funded software", connection: true do + field :softwares, SoftwareConnectionWithMetaType, null: true, description: "Funded software", connection: true do + argument :query, String, required: false + argument :user_id, String, required: false + argument :client_id, String, required: false + argument :provider_id, String, required: false + argument :has_citations, Int, required: false + argument :has_views, Int, required: false + argument :has_downloads, Int, required: false + argument :first, Int, required: false, default_value: 25 + end + + field :works, WorkConnectionWithMetaType, null: true, description: "Funded works", connection: true do + argument :query, String, required: false + argument :user_id, String, required: false + argument :client_id, String, required: false + argument :provider_id, String, required: false + argument :has_citations, Int, required: false + argument :has_views, Int, required: false + argument :has_downloads, Int, required: false argument :first, Int, required: false, default_value: 25 end @@ -30,25 +65,35 @@ def address "country" => object.country.to_h.fetch("name", nil) } end + def publications(**args) + Doi.query(args[:query], funder_id: object[:id], user_id: args[:user_id], client_id: args[:client_id], provider_id: args[:provider_id], has_citations: args[:has_citations], has_views: args[:has_views], has_downloads: args[:has_downloads], resource_type_id: "Text", state: "findable", page: { number: 1, size: args[:first] }).results.to_a + end + def datasets(**args) - ids = Event.query(nil, obj_id: object[:id], citation_type: "Dataset-Funder").results.to_a.map do |e| - doi_from_url(e.subj_id) - end + Doi.query(args[:query], funder_id: object[:id], user_id: args[:user_id], client_id: args[:client_id], provider_id: args[:provider_id], has_citations: args[:has_citations], has_views: args[:has_views], has_downloads: args[:has_downloads], resource_type_id: "Dataset", state: "findable", page: { number: 1, size: args[:first] }).results.to_a + end - ElasticsearchLoader.for(Doi).load_many(ids) + def softwares(**args) + Doi.query(args[:query], funder_id: object[:id], user_id: args[:user_id], client_id: args[:client_id], provider_id: args[:provider_id], has_citations: args[:has_citations], has_views: args[:has_views], has_downloads: args[:has_downloads], resource_type_id: "Software", state: "findable", page: { number: 1, size: args[:first] }).results.to_a end - def publications(**args) - ids = Event.query(nil, obj_id: object[:id], citation_type: "Funder-ScholarlyArticle").results.to_a.map do |e| - doi_from_url(e.subj_id) - end - ElasticsearchLoader.for(Doi).load_many(ids) + def works(**args) + Doi.query(args[:query], funder_id: object[:id], user_id: args[:user_id], client_id: args[:client_id], provider_id: args[:provider_id], has_citations: args[:has_citations], has_views: args[:has_views], has_downloads: args[:has_downloads], state: "findable", page: { number: 1, size: args[:first] }).results.to_a + end + + def view_count + response.results.total.positive? ? aggregate_count(response.response.aggregations.views.buckets) : [] + end + + def download_count + response.results.total.positive? ? aggregate_count(response.response.aggregations.downloads.buckets) : [] + end + + def citation_count + response.results.total.positive? ? aggregate_count(response.response.aggregations.citations.buckets) : [] end - def software_source_codes(**args) - ids = Event.query(nil, obj_id: object[:id], citation_type: "Funder-SoftwareSourceCode").results.to_a.map do |e| - doi_from_url(e.subj_id) - end - ElasticsearchLoader.for(Doi).load_many(ids) + def response + @response ||= Doi.query(nil, funder_id: object[:id], state: "findable", page: { number: 1, size: 0 }) end end diff --git a/app/graphql/types/organization_connection_with_meta_type.rb b/app/graphql/types/organization_connection_with_meta_type.rb index b3dbb6986..e8780ab72 100644 --- a/app/graphql/types/organization_connection_with_meta_type.rb +++ b/app/graphql/types/organization_connection_with_meta_type.rb @@ -14,6 +14,6 @@ def total_count end def person_connection_count - Event.query(nil, citation_type: "Organization-Person").results.total + @person_connection_count ||= Event.query(nil, citation_type: "Organization-Person").results.total end end diff --git a/app/graphql/types/organization_dataset_connection_with_meta_type.rb b/app/graphql/types/organization_dataset_connection_with_meta_type.rb deleted file mode 100644 index 3dce39a0c..000000000 --- a/app/graphql/types/organization_dataset_connection_with_meta_type.rb +++ /dev/null @@ -1,12 +0,0 @@ -# frozen_string_literal: true - -class OrganizationDatasetConnectionWithMetaType < BaseConnection - edge_type(EventDataEdgeType, edge_class: EventDataEdge) - field_class GraphQL::Cache::Field - - field :total_count, Integer, null: false, cache: true - - def total_count - Event.query(nil, obj_id: object.parent.id, citation_type: "Dataset-Organization").results.total - end -end \ No newline at end of file diff --git a/app/graphql/types/organization_person_connection_with_meta_type.rb b/app/graphql/types/organization_person_connection_with_meta_type.rb deleted file mode 100644 index dedbd59e4..000000000 --- a/app/graphql/types/organization_person_connection_with_meta_type.rb +++ /dev/null @@ -1,12 +0,0 @@ -# frozen_string_literal: true - -class OrganizationPersonConnectionWithMetaType < BaseConnection - edge_type(EventDataEdgeType, edge_class: EventDataEdge) - field_class GraphQL::Cache::Field - - field :total_count, Integer, null: false, cache: true - - def total_count - Event.query(nil, obj_id: object.parent.id, citation_type: "Organization-Person").results.total - end -end diff --git a/app/graphql/types/organization_publication_connection_with_meta_type.rb b/app/graphql/types/organization_publication_connection_with_meta_type.rb deleted file mode 100644 index 7eb634efc..000000000 --- a/app/graphql/types/organization_publication_connection_with_meta_type.rb +++ /dev/null @@ -1,12 +0,0 @@ -# frozen_string_literal: true - -class OrganizationPublicationConnectionWithMetaType < BaseConnection - edge_type(EventDataEdgeType, edge_class: EventDataEdge) - field_class GraphQL::Cache::Field - - field :total_count, Integer, null: false, cache: true - - def total_count - Event.query(nil, obj_id: object.parent.id, citation_type: "Organization-ScholarlyArticle").results.total - end -end diff --git a/app/graphql/types/organization_software_connection_with_meta_type.rb b/app/graphql/types/organization_software_connection_with_meta_type.rb deleted file mode 100644 index 3b374f915..000000000 --- a/app/graphql/types/organization_software_connection_with_meta_type.rb +++ /dev/null @@ -1,12 +0,0 @@ -# frozen_string_literal: true - -class OrganizationSoftwareConnectionWithMetaType < BaseConnection - edge_type(EventDataEdgeType, edge_class: EventDataEdge) - field_class GraphQL::Cache::Field - - field :total_count, Integer, null: false, cache: true - - def total_count - Event.query(nil, obj_id: object.parent.id, citation_type: "Organization-SoftwareSourceCode").results.total - end -end diff --git a/app/graphql/types/organization_type.rb b/app/graphql/types/organization_type.rb index df7e63d9a..8dde1201e 100644 --- a/app/graphql/types/organization_type.rb +++ b/app/graphql/types/organization_type.rb @@ -10,23 +10,57 @@ class OrganizationType < BaseObject field :identifiers, [IdentifierType], null: true, description: "The identifier(s) for the organization." field :url, [String], null: true, hash_key: "links", description: "URL of the organization." field :address, AddressType, null: true, description: "Physical address of the organization." + field :view_count, Integer, null: true, description: "The number of views according to the Counter Code of Practice." + field :download_count, Integer, null: true, description: "The number of downloads according to the Counter Code of Practice." + field :citation_count, Integer, null: true, description: "The number of citations." - field :datasets, OrganizationDatasetConnectionWithMetaType, null: false, description: "Datasets from this organization", connection: true do + field :datasets, DatasetConnectionWithMetaType, null: true, description: "Datasets from this organization", connection: true do + argument :query, String, required: false + argument :user_id, String, required: false + argument :funder_id, String, required: false + argument :client_id, String, required: false + argument :provider_id, String, required: false + argument :has_citations, Int, required: false + argument :has_views, Int, required: false + argument :has_downloads, Int, required: false argument :first, Int, required: false, default_value: 25 end - field :publications, OrganizationPublicationConnectionWithMetaType, null: false, description: "Publications from this organization", connection: true do + field :publications, PublicationConnectionWithMetaType, null: true, description: "Publications from this organization", connection: true do argument :query, String, required: false + argument :user_id, String, required: false + argument :funder_id, String, required: false + argument :client_id, String, required: false + argument :provider_id, String, required: false + argument :has_citations, Int, required: false + argument :has_views, Int, required: false + argument :has_downloads, Int, required: false argument :first, Int, required: false, default_value: 25 end - field :software_source_codes, OrganizationSoftwareConnectionWithMetaType, null: false, description: "Software from this organization", connection: true do + field :softwares, SoftwareConnectionWithMetaType, null: true, description: "Software from this organization", connection: true do + argument :query, String, required: false + argument :user_id, String, required: false + argument :funder_id, String, required: false + argument :client_id, String, required: false + argument :provider_id, String, required: false + argument :has_citations, Int, required: false + argument :has_views, Int, required: false + argument :has_downloads, Int, required: false argument :first, Int, required: false, default_value: 25 end - # field :researchers, OrganizationResearcherConnectionWithMetaType, null: false, description: "Researchers associated with this organization", connection: true do - # argument :first, Int, required: false, default_value: 25 - # end + field :works, WorkConnectionWithMetaType, null: true, description: "Works from this organization", connection: true do + argument :query, String, required: false + argument :user_id, String, required: false + argument :funder_id, String, required: false + argument :client_id, String, required: false + argument :provider_id, String, required: false + argument :has_citations, Int, required: false + argument :has_views, Int, required: false + argument :has_downloads, Int, required: false + argument :first, Int, required: false, default_value: 25 + end def type "Organization" @@ -49,32 +83,37 @@ def address "country" => object.country.to_h.fetch("name", nil) } end + def publications(**args) + Doi.query(args[:query], affiliation_id: object[:id], user_id: args[:user_id], client_id: args[:client_id], provider_id: args[:provider_id], has_citations: args[:has_citations], has_views: args[:has_views], has_downloads: args[:has_downloads], resource_type_id: "Text", state: "findable", page: { number: 1, size: args[:first] }).results.to_a + end + def datasets(**args) - ids = Event.query(nil, obj_id: object.id, citation_type: "Dataset-Organization").results.to_a.map do |e| - doi_from_url(e.subj_id) - end - - ElasticsearchLoader.for(Doi).load_many(ids) + Doi.query(args[:query], affiliation_id: object[:id], user_id: args[:user_id], client_id: args[:client_id], provider_id: args[:provider_id], has_citations: args[:has_citations], has_views: args[:has_views], has_downloads: args[:has_downloads], resource_type_id: "Dataset", state: "findable", page: { number: 1, size: args[:first] }).results.to_a end - def publications(**args) - ids = Event.query(nil, obj_id: object.id, citation_type: "Organization-ScholarlyArticle").results.to_a.map do |e| - doi_from_url(e.subj_id) - end - ElasticsearchLoader.for(Doi).load_many(ids) + def softwares(**args) + Doi.query(args[:query], affiliation_id: object[:id], user_id: args[:user_id], client_id: args[:client_id], provider_id: args[:provider_id], has_citations: args[:has_citations], has_views: args[:has_views], has_downloads: args[:has_downloads], resource_type_id: "Software", state: "findable", page: { number: 1, size: args[:first] }).results.to_a + end + + def works(**args) + Rails.logger.info object[:id] + Rails.logger.info args.inspect + Doi.query(args[:query], affiliation_id: object[:id], user_id: args[:user_id], client_id: args[:client_id], provider_id: args[:provider_id], has_citations: args[:has_citations], has_views: args[:has_views], has_downloads: args[:has_downloads], state: "findable", page: { number: 1, size: args[:first] }).results.to_a + end + + def view_count + response.results.total.positive? ? aggregate_count(response.response.aggregations.views.buckets) : [] + end + + def download_count + response.results.total.positive? ? aggregate_count(response.response.aggregations.downloads.buckets) : [] end - def software_source_codes(**args) - ids = Event.query(nil, obj_id: object.id, citation_type: "Organization-SoftwareSourceCode").results.to_a.map do |e| - doi_from_url(e.subj_id) - end - ElasticsearchLoader.for(Doi).load_many(ids) + def citation_count + response.results.total.positive? ? aggregate_count(response.response.aggregations.citations.buckets) : [] end - # def researchers(**args) - # ids = Event.query(nil, obj_id: object.id, citation_type: "Organization-Person").results.to_a.map do |e| - # orcid_from_url(e.subj_id) - # end - # ElasticsearchLoader.for(Researcher).load_many(ids) - # end + def response + @response ||= Doi.query(nil, affiliation_id: object[:id], state: "findable", page: { number: 1, size: 0 }) + end end diff --git a/app/graphql/types/person_type.rb b/app/graphql/types/person_type.rb index 04b68b1b2..c250fb0ce 100644 --- a/app/graphql/types/person_type.rb +++ b/app/graphql/types/person_type.rb @@ -56,20 +56,20 @@ def type "Person" end - def publications(query: nil, client_id: nil, provider_id: nil, has_citations: nil, has_views: nil, has_downloads: nil, first: nil) - Doi.query(query, user_id: orcid_from_url(object[:id]), client_id: client_id, provider_id: provider_id, has_citations: has_citations, has_views: has_views, has_downloads: has_downloads, resource_type_id: "Text", state: "findable", page: { number: 1, size: first }).results.to_a + def publications(**args) + Doi.query(args[:query], user_id: orcid_from_url(object[:id]), client_id: args[:client_id], provider_id: args[:provider_id], has_citations: args[:has_citations], has_views: args[:has_views], has_downloads: args[:has_downloads], resource_type_id: "Text", state: "findable", page: { number: 1, size: args[:first] }).results.to_a end - def datasets(query: nil, client_id: nil, provider_id: nil, has_citations: nil, has_views: nil, has_downloads: nil, first: nil) - Doi.query(query, user_id: orcid_from_url(object[:id]), client_id: client_id, provider_id: provider_id, resource_type_id: "Dataset", state: "findable", has_citations: has_citations, has_views: has_views, has_downloads: has_downloads, page: { number: 1, size: first }).results.to_a + def datasets(**args) + Doi.query(args[:query], user_id: orcid_from_url(object[:id]), client_id: args[:client_id], provider_id: args[:provider_id], has_citations: args[:has_citations], has_views: args[:has_views], has_downloads: args[:has_downloads], resource_type_id: "Dataset", state: "findable", page: { number: 1, size: args[:first] }).results.to_a end - def softwares(query: nil, client_id: nil, provider_id: nil, has_citations: nil, has_views: nil, has_downloads: nil, first: nil) - Doi.query(query, user_id: orcid_from_url(object[:id]), client_id: client_id, provider_id: provider_id, has_citations: has_citations, has_views: has_views, has_downloads: has_downloads, resource_type_id: "Software", state: "findable", page: { number: 1, size: first }).results.to_a + def softwares(**args) + Doi.query(args[:query], user_id: orcid_from_url(object[:id]), client_id: args[:client_id], provider_id: args[:provider_id], has_citations: args[:has_citations], has_views: args[:has_views], has_downloads: args[:has_downloads], resource_type_id: "Software", state: "findable", page: { number: 1, size: args[:first] }).results.to_a end - def works(query: nil, client_id: nil, provider_id: nil, has_citations: nil, has_views: nil, has_downloads: nil, first: nil) - Doi.query(query, user_id: orcid_from_url(object[:id]), client_id: client_id, provider_id: provider_id, resource_type_id: "Dataset", state: "findable", has_citations: has_citations, has_views: has_views, has_downloads: has_downloads, page: { number: 1, size: first }).results.to_a + def works(**args) + Doi.query(args[:query], user_id: orcid_from_url(object[:id]), client_id: args[:client_id], provider_id: args[:provider_id], has_citations: args[:has_citations], has_views: args[:has_views], has_downloads: args[:has_downloads], state: "findable", page: { number: 1, size: args[:first] }).results.to_a end def view_count diff --git a/app/graphql/types/query_type.rb b/app/graphql/types/query_type.rb index 282d30700..012d7e110 100644 --- a/app/graphql/types/query_type.rb +++ b/app/graphql/types/query_type.rb @@ -105,11 +105,10 @@ def data_catalogs(query: nil, first: nil) field :organizations, OrganizationConnectionWithMetaType, null: false, connection: true, max_page_size: 1000 do argument :query, String, required: false - argument :first, Int, required: false, default_value: 25 end - def organizations(query: nil, first: nil) - Organization.query(query, limit: first).fetch(:data, []) + def organizations(query: nil) + Organization.query(query).fetch(:data, []) end field :organization, OrganizationType, null: false do @@ -370,8 +369,8 @@ def physical_object(id:) argument :first, Int, required: false, default_value: 25 end - def services(query: nil, first: nil, client_id: nil, provider_id: nil) - Doi.query(query, resource_type_id: "Service", client_id: client_id, provider_id: provider_id, state: "findable", page: { number: 1, size: first }).results.to_a + def services(**args) + Doi.query(args[:query], resource_type_id: "Service", client_id: args[:client_id], provider_id: args[:provider_id], state: "findable", page: { number: 1, size: args[:first] }).results.to_a end field :service, ServiceType, null: false do @@ -484,15 +483,4 @@ def set_doi(id) result end - - def doi_from_url(url) - if /\A(?:(http|https):\/\/(dx\.)?(doi.org|handle.test.datacite.org)\/)?(doi:)?(10\.\d{4,5}\/.+)\z/.match?(url) - uri = Addressable::URI.parse(url) - uri.path.gsub(/^\//, "").downcase - end - end - - def orcid_from_url(url) - Array(/\A(http|https):\/\/orcid\.org\/(.+)/.match(url)).last - end end diff --git a/app/graphql/types/service_connection_with_meta_type.rb b/app/graphql/types/service_connection_with_meta_type.rb index 51ab5cf8b..9490de410 100644 --- a/app/graphql/types/service_connection_with_meta_type.rb +++ b/app/graphql/types/service_connection_with_meta_type.rb @@ -5,10 +5,22 @@ class ServiceConnectionWithMetaType < BaseConnection field_class GraphQL::Cache::Field field :total_count, Integer, null: false, cache: true - + field :years, [FacetType], null: true, cache: true + def total_count - args = object.arguments + args = prepare_args(object.arguments) + + response(**args).results.total + end + + def years + args = prepare_args(object.arguments) + + res = response(**args) + res.results.total.positive? ? facet_by_year(res.response.aggregations.years.buckets) : nil + end - Doi.query(args[:query], client_id: args[:client_id], provider_id: args[:provider_id], resource_type_id: "Service", state: "findable", page: { number: 1, size: 0 }).results.total + def response(**args) + @response ||= Doi.query(args[:query], user_id: args[:user_id], client_id: args[:client_id], provider_id: args[:provider_id], year: args[:year], resource_type_id: "Service", has_citations: args[:has_citations], has_views: args[:has_views], has_downloads: args[:has_downloads], page: { number: 1, size: 0 }) end end diff --git a/app/graphql/types/year_month_total_type.rb b/app/graphql/types/year_month_total_type.rb index e0eb5709f..264d3ac4c 100644 --- a/app/graphql/types/year_month_total_type.rb +++ b/app/graphql/types/year_month_total_type.rb @@ -3,6 +3,6 @@ class YearMonthTotalType < BaseObject description "Information about totals over time (years)" - field :yearMonth, Int, null: true, description: "Year-month" + field :year_month, Int, null: true, description: "Year-month" field :total, Int, null: true, description: "Total" end diff --git a/app/models/concerns/indexable.rb b/app/models/concerns/indexable.rb index 83d66bec0..501717958 100644 --- a/app/models/concerns/indexable.rb +++ b/app/models/concerns/indexable.rb @@ -606,5 +606,20 @@ def inactive_index active_index = client.indices.get_alias(name: alias_name).keys.first active_index.end_with?("v1") ? alternate_index_name : index_name end + + def doi_from_url(url) + if /\A(?:(http|https):\/\/(dx\.)?(doi.org|handle.test.datacite.org)\/)?(doi:)?(10\.\d{4,5}\/.+)\z/.match?(url) + uri = Addressable::URI.parse(url) + uri.path.gsub(/^\//, "").downcase + end + end + + def orcid_from_url(url) + Array(/\A(?:(http|https):\/\/)?(orcid\.org\/)?(.+)/.match(url)).last + end + + def ror_from_url(url) + Array(/\A(?:(http|https):\/\/)?(ror\.org\/)?(.+)/.match(url)).last + end end end diff --git a/app/models/doi.rb b/app/models/doi.rb index 829d7ad2f..167e0b5a2 100644 --- a/app/models/doi.rb +++ b/app/models/doi.rb @@ -739,10 +739,12 @@ def self.query(query, options={}) must << { range: { "landing_page.redirectCount": { "gte": options[:link_check_redirect_count_gte] } } } if options[:link_check_redirect_count_gte].present? must << { terms: { aasm_state: options[:state].to_s.split(",") }} if options[:state].present? must << { range: { registered: { gte: "#{options[:registered].split(",").min}||/y", lte: "#{options[:registered].split(",").max}||/y", format: "yyyy" }}} if options[:registered].present? - must << { term: { "creators.nameIdentifiers.nameIdentifier" => "https://orcid.org/#{options[:user_id]}" }} if options[:user_id].present? - must << { term: { "creators.affiliation.affiliationIdentifier" => URI.decode(options[:affiliation_id]) }} if options[:affiliation_id].present? + must << { term: { "creators.nameIdentifiers.nameIdentifier" => "https://orcid.org/#{orcid_from_url(options[:user_id])}" }} if options[:user_id].present? + must << { term: { "creators.affiliation.affiliationIdentifier" => "https://ror.org/#{ror_from_url(options[:affiliation_id])}" }} if options[:affiliation_id].present? + must << { term: { "funding_references.funderIdentifier" => "https://doi.org/#{doi_from_url(options[:funder_id])}" }} if options[:funder_id].present? must << { term: { consortium_id: options[:consortium_id] }} if options[:consortium_id].present? - must << { term: { "client.re3data_id" => options[:re3data_id].gsub("/", '\/').upcase }} if options[:re3data_id].present? + # TODO align PID parsing + must << { term: { "client.re3data_id" => doi_from_url(options[:re3data_id]) }} if options[:re3data_id].present? must << { term: { "client.opendoar_id" => options[:opendoar_id] }} if options[:opendoar_id].present? must << { terms: { "client.certificate" => options[:certificate].split(",") }} if options[:certificate].present? must_not << { terms: { provider_id: ["crossref", "medra", "op"] }} if options[:exclude_registration_agencies] diff --git a/spec/concerns/indexable_spec.rb b/spec/concerns/indexable_spec.rb index c2a26786f..530194dcb 100644 --- a/spec/concerns/indexable_spec.rb +++ b/spec/concerns/indexable_spec.rb @@ -136,6 +136,81 @@ expect(response.results.to_a.length).to eq(2) end + # def ror_from_url(url) + # if /\A(?:(http|https):\/\/)?(ror\.org\/)?(.+)/.match?(url) + # uri = Addressable::URI.parse(url) + # puts uri + # uri.path.gsub(/^\//, "").downcase + # end + # end + + context "doi_from_url" do + subject { Doi } + + it "as id" do + doi = "10.13039/501100009053" + expect(subject.doi_from_url(doi)).to eq("10.13039/501100009053") + end + + it "as url" do + doi = "https://doi.org/10.13039/501100009053" + expect(subject.doi_from_url(doi)).to eq("10.13039/501100009053") + end + + it "as http url" do + doi = "http://doi.org/10.13039/501100009053" + expect(subject.doi_from_url(doi)).to eq("10.13039/501100009053") + end + end + + context "orcid_from_url" do + subject { Doi } + + it "as id" do + orcid = "orcid.org/0000-0003-3484-6875" + expect(subject.orcid_from_url(orcid)).to eq("0000-0003-3484-6875") + end + + it "as short id" do + orcid = "0000-0003-3484-6875" + expect(subject.orcid_from_url(orcid)).to eq("0000-0003-3484-6875") + end + + it "as url" do + orcid = "https://orcid.org/0000-0003-3484-6875" + expect(subject.orcid_from_url(orcid)).to eq("0000-0003-3484-6875") + end + + it "as http url" do + orcid = "http://orcid.org/0000-0003-3484-6875" + expect(subject.orcid_from_url(orcid)).to eq("0000-0003-3484-6875") + end + end + + context "ror_from_url" do + subject { Doi } + + it "as id" do + ror_id = "ror.org/046ak2485" + expect(subject.ror_from_url(ror_id)).to eq("046ak2485") + end + + it "as short id" do + ror_id = "046ak2485" + expect(subject.ror_from_url(ror_id)).to eq("046ak2485") + end + + it "as url" do + ror_id = "https://ror.org/046ak2485" + expect(subject.ror_from_url(ror_id)).to eq("046ak2485") + end + + it "as http url" do + ror_id = "http://ror.org/046ak2485" + expect(subject.ror_from_url(ror_id)).to eq("046ak2485") + end + end + context "aggregations" do it 'returns query_aggregation when filters aggregation with empty' do aggregations = Doi.get_aggregations_hash({aggregations:""}) diff --git a/spec/fixtures/vcr_cassettes/QueryType/find_data_catalog/returns_data_catalog_information.yml b/spec/fixtures/vcr_cassettes/QueryType/find_data_catalog/returns_data_catalog_information.yml new file mode 100644 index 000000000..ae36f7855 --- /dev/null +++ b/spec/fixtures/vcr_cassettes/QueryType/find_data_catalog/returns_data_catalog_information.yml @@ -0,0 +1,51 @@ +--- +http_interactions: +- request: + method: get + uri: https://api.datacite.org/re3data/10.17616/r3xs37 + body: + encoding: US-ASCII + string: '' + headers: + User-Agent: + - Mozilla/5.0 (compatible; Maremma/4.6.1; mailto:info@datacite.org) + Accept: + - text/html,application/json,application/xml;q=0.9, text/plain;q=0.8,image/png,*/*;q=0.5 + Accept-Encoding: + - gzip,deflate + response: + status: + code: 200 + message: OK + headers: + Date: + - Mon, 30 Mar 2020 07:24:04 GMT + Content-Type: + - application/json; charset=utf-8 + Connection: + - keep-alive + Status: + - 200 OK + Cache-Control: + - max-age=0, private, must-revalidate + Vary: + - Origin + Etag: + - W/"5678f877c76da112325d85acf2de0072" + X-Runtime: + - '0.226930' + X-Request-Id: + - 7371be2c-8ef6-4f4b-823c-b4c92c6edcec + X-Powered-By: + - Phusion Passenger 5.2.3 + Server: + - nginx/1.12.2 + Phusion Passenger 5.2.3 + Content-Encoding: + - gzip + body: + encoding: ASCII-8BIT + string: !binary |- + H4sIAAAAAAAAA7RX23LbNhD9FQyf2hlRIiVbGetNsd3UM3Gs8WXSSScPK3JJogEBDgBaUT3+m35G3/JjXYCQJfoit5n0TSJ3F4uzZ88u76IcLESzu4jn0SxKk2H6ZppOR5eT364mb6JBZNcN0guNE284iMBazZetReO8wvMz56wneZokSZqkkwPy1Ngow63S6w9QuxiL+Yd389N579WNFvSmsrYxs9FotVoNG5AlIAxzHPUsj5W0kFk69fe7yOJX+7Jf1pmOovvPgyhHk2neWK4keVxXyLgslK7BPWFmbSzWLKTGuGGqQQ0WcwaGgWQXDUo2zzI0hgm+1KDXDHjt3lsGOqv4LZflgDXtUnBT0W/yylnOTQeTe1Ci0ligRpmRn8ORFVrVDEHbapOCRkP/s2rIXI4hr7IFDdIi0uFKlrFFXTO4BS5gyQW3a6YKxq1h7sooLbOVVm1ZMaAndc1t7R46I0tBu6u5jLg0ltvWQWCGPZjfE/wtlK66W5xRlh7LDLXlBc8In977Y7rftW6NvUIQ3tLRpmdCgGS8EVwSgN4C8py780E4enS2IhxOhXJHEvu6Op84yBYdwqgZlY+deuwc1Kfylmsl3U1BsKuMO5j9EaZd/oEbypisQk/Dk1/ebSOP2Xte4MbLRPeDu+gFy5S95UqoktJ/0WjCPoBt9TaPfREn6YTNba1MU6Hm2SYJz5+LDEGqUkNT7T0vnSRj9q+ND9g79FfwZyxAABJvXr1UepCk3+l56PzoDoZnrp1y95c6cv+dDrvjgts+uNOpC+gq6/ptPWDnXFL7uir504419TcI+v86ktPu1B8SzANNhHdUNOwnLjPR5q7xKNsulZ+7hura9vqhWx6414A2uOXplWp1htTUOVF7l36P7SyBDDqnlqc+RZarrHWd8YiHj7zOanAdvy/wQgCXzPfjPrO5V8SgcnsDzgkQdctNS83iR4sT60bToxz1FpCgAM5iEV565L7geqV03tMYEsSq66YOpODbgOjTPDyHTe/1rDHb9kMwXPJnopJW5cy0ugCnNlSSYJzp9TPWBc0GavIA8iaBktq+FSQYvQhhLGyEbBsae0oX6LV7NiXaCRRBuSvxXssz1UrqEdLWk9Mbr/mmIfnn3SC5siSopLM0qGUrBPnnRBsSe9Q9jC8vLmfJuJQp6MOJr4Tspvv5/PLm/EnYJ4Us0Teo93RDgtKRSsZU+IJbcnfRNjPoYQzQbNxJ9VTmu4m2T1aIGnRbuwWCyxy/DitbC4r8ysDJsSWjUJkbyW/p4tx++8uyt5oGhxywTwQIBWbFt781OwdNUsNu6hUKu+LGoKTehYKmsK/IS6Ps2cjHFDnMtRD32aFGHUqFDdtNryq7C9TD7VGOqGWKYXyih3FBe8SXWAl3r7gUCrMvVIgOm/vPjr8/kB+TMU6XRwfjXX7MRaFJFz6iZwA7CxsIspj9iqKulLB/MgeERj/gF0qA9iIeILkMC9J/4Ni2dSxmlaTFZbud/B/EgxV3tEP5PZybfzx7zJweJzsA4wBgvAFwi17cI6jHL2YtqdQ50u5paGsihrabVa7bkV9kUbiKzOg2I1iq1satGSldguTG784jmqxFMXqFWG4DJ+3uNuiw5lEytBxnfvskaSKToAS0oFL3BJebRigIAv/I40FsNZZu8Pt8diVlY4/5o3DvaShKE/IIykViAuyqXdIOYdxXwiB6Kik7XyW0VdJi3X1cNDy/8l8QPRxPLqiSdAtoeHjeCd3F/CxenP/aO8B99Zjdjx4FvIttVGFXQKPBLeIhVUVrvPaxCfyNXkfp0dGUgmJfFzON7juGeD5O0nGcvInT6XVyNJsczdLDTy6JhioTDMZJnIzj8fQ6PZiNk9l4+im6v7//BwAA//8DAAQQO70eDgAA + http_version: null + recorded_at: Mon, 30 Mar 2020 07:24:04 GMT +recorded_with: VCR 5.1.0 diff --git a/spec/fixtures/vcr_cassettes/QueryType/find_funder/returns_funder_information.yml b/spec/fixtures/vcr_cassettes/QueryType/find_funder/returns_funder_information.yml new file mode 100644 index 000000000..a7dc2f97b --- /dev/null +++ b/spec/fixtures/vcr_cassettes/QueryType/find_funder/returns_funder_information.yml @@ -0,0 +1,50 @@ +--- +http_interactions: +- request: + method: get + uri: https://api.crossref.org/funders/10.13039/501100009053 + body: + encoding: US-ASCII + string: '' + headers: + User-Agent: + - Mozilla/5.0 (compatible; Maremma/4.6.1; mailto:info@datacite.org) + Accept: + - text/html,application/json,application/xml;q=0.9, text/plain;q=0.8,image/png,*/*;q=0.5 + Accept-Encoding: + - gzip,deflate + response: + status: + code: 200 + message: OK + headers: + Content-Type: + - application/json;charset=UTF-8 + Vary: + - Accept + Access-Control-Allow-Origin: + - "*" + Access-Control-Allow-Headers: + - X-Requested-With + Content-Length: + - '733' + Server: + - http-kit + Date: + - Mon, 30 Mar 2020 07:28:28 GMT + X-Rate-Limit-Limit: + - '50' + X-Rate-Limit-Interval: + - 1s + Connection: + - close + body: + encoding: ASCII-8BIT + string: '{"status":"ok","message-type":"funder","message-version":"1.0.0","message":{"hierarchy-names":{"501100009053":"The + Wellcome Trust DBT India Alliance"},"replaced-by":[],"work-count":346,"name":"The + Wellcome Trust DBT India Alliance","descendants":[],"descendant-work-count":346,"id":"501100009053","tokens":["the","wellcome","trust","dbt","india","alliance","india","alliance","wtdbt","india","alliance","wellcome","trust\/dbt","india","alliance","wellcome","trust","dbt","india","alliance"],"replaces":[],"uri":"http:\/\/dx.doi.org\/10.13039\/501100009053","hierarchy":{"501100009053":{}},"alt-names":["India + Alliance","WTDBT India Alliance","Wellcome Trust\/DBT India Alliance","Wellcome + Trust DBt India Alliance"],"location":null}}' + http_version: null + recorded_at: Mon, 30 Mar 2020 07:28:28 GMT +recorded_with: VCR 5.1.0 diff --git a/spec/fixtures/vcr_cassettes/QueryType/find_organization/returns_organization_information.yml b/spec/fixtures/vcr_cassettes/QueryType/find_organization/returns_organization_information.yml new file mode 100644 index 000000000..ed4fe90b5 --- /dev/null +++ b/spec/fixtures/vcr_cassettes/QueryType/find_organization/returns_organization_information.yml @@ -0,0 +1,55 @@ +--- +http_interactions: +- request: + method: get + uri: https://api.ror.org/organizations/ror.org/013meh722 + body: + encoding: US-ASCII + string: '' + headers: + User-Agent: + - Mozilla/5.0 (compatible; Maremma/4.6.1; mailto:info@datacite.org) + Accept: + - text/html,application/json,application/xml;q=0.9, text/plain;q=0.8,image/png,*/*;q=0.5 + Accept-Encoding: + - gzip,deflate + response: + status: + code: 200 + message: OK + headers: + Content-Type: + - application/json + Connection: + - keep-alive + Date: + - Mon, 30 Mar 2020 06:03:02 GMT + Status: + - 200 OK + X-Frame-Options: + - SAMEORIGIN + Allow: + - GET, HEAD, OPTIONS + X-Powered-By: + - Phusion Passenger 6.0.4 + Server: + - nginx/1.17.3 + Phusion Passenger 6.0.4 + Content-Encoding: + - gzip + Vary: + - Accept-Encoding,Cookie,Origin + X-Cache: + - Miss from cloudfront + Via: + - 1.1 e8640ab30463560abfb6a2665bafb393.cloudfront.net (CloudFront) + X-Amz-Cf-Pop: + - DUS51-C1 + X-Amz-Cf-Id: + - oRVv9ZCVtpAgq2-Og0EoyjafVweSGsn3VAfKNMEKVJs1VaiwK64FvQ== + body: + encoding: ASCII-8BIT + string: !binary |- + H4sIAAAAAAAAA3xUXU/jMBD8K5WfURp/233jOI5DSBwFIR5OqAqJWyzSpHKS61Wo//3WDrR2daIv9eyOZ3c2m7wjW6EZeu37TTebTl3rstatpjmma/MqCUFnqCnWBiiPjf1jXGf73aRdTi6K9Yuz1coAod9tTIdmv9FlNZRFb9sGPZ+h2jZvIeq1QXq73WZlsc6KMhvepp5R1LboxpsHucmxTKCUrm12a88B1PVFP8AZwj2woPTWvtmNqWyxGFz94QNqmSY7ZIIfj6ZH6UW7XMQO6uLF1L7I+3gEpTtnl7tu1dZg1biVK7ZND0zbtYJqyJc7tIeWynZoerdDs/fP4+I4r95UkxvbrKp2jQ7URdlWPn/1De3PkPnbG9cU9cJWnRe5fri99v8bZ5bGOQMPpxnq2g+r9oPKxx8mWCmuKUPPIPJjaKp7szy5h3iOcWBLytFB4ST6CSXnJIKKkRygP+OcMRylBNE6goyQ+CJjOpblWsRZIZiIYM5VnkKeQhlDkZMU0hjKPLkrcaxMdSLFOI0hlzrpSpKkLtdJk5LFbWBB0p41TpvUCSRplqSOGEuhSiBP/ApBEwtg3+/Cz8uH8y8XCONxaR4vzh++Il74JRuZN3f3t19RfQdSKhXYv9zqP7tIuJaKS3LcwyhCpKY0rB9WOSX+WVAiZbAvKQ7rhrEAurfMlJB+igQ+UsKnmFY4jJlAxzKQOSZCjrelzkUISaLCdS658HOmUMw/Ogk7Sj8w/ZALy0+oZNAFDzVz0AwxPb4ZREBE43HoT/B5qYq+OHU9p7Ba7Oj5gOc4V1pj4R3OCRPQZGh8jhVWmgTRq/vr76eCK/hiZRyGleWfqklsv9//AwAA//8DALZf1ADSBQAA + http_version: null + recorded_at: Mon, 30 Mar 2020 06:03:02 GMT +recorded_with: VCR 5.1.0 diff --git a/spec/fixtures/vcr_cassettes/QueryType/query_data_catalogs/returns_data_catalog_information.yml b/spec/fixtures/vcr_cassettes/QueryType/query_data_catalogs/returns_data_catalog_information.yml new file mode 100644 index 000000000..31f5deb05 --- /dev/null +++ b/spec/fixtures/vcr_cassettes/QueryType/query_data_catalogs/returns_data_catalog_information.yml @@ -0,0 +1,99 @@ +--- +http_interactions: +- request: + method: get + uri: https://api.datacite.org/re3data?page%5Bnumber%5D=1&page%5Bsize%5D=25&query=Dataverse + body: + encoding: US-ASCII + string: '' + headers: + User-Agent: + - Mozilla/5.0 (compatible; Maremma/4.6.1; mailto:info@datacite.org) + Accept: + - text/html,application/json,application/xml;q=0.9, text/plain;q=0.8,image/png,*/*;q=0.5 + Accept-Encoding: + - gzip,deflate + response: + status: + code: 200 + message: OK + headers: + Date: + - Mon, 30 Mar 2020 06:38:29 GMT + Content-Type: + - application/json; charset=utf-8 + Connection: + - keep-alive + Status: + - 200 OK + Cache-Control: + - max-age=0, private, must-revalidate + Vary: + - Origin + Etag: + - W/"23392d63b55181a6b60544f464db2c83" + X-Runtime: + - '0.580567' + X-Request-Id: + - ee9e7e99-6221-47b5-84bc-9f2e7ea4a3af + X-Powered-By: + - Phusion Passenger 5.2.3 + Server: + - nginx/1.12.2 + Phusion Passenger 5.2.3 + Content-Encoding: + - gzip + body: + encoding: ASCII-8BIT + string: !binary |- + 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 + http_version: null + recorded_at: Mon, 30 Mar 2020 06:38:29 GMT +- request: + method: get + uri: https://api.datacite.org/re3data?page%5Bnumber%5D=1&page%5Bsize%5D=25&query=Dataverse + body: + encoding: US-ASCII + string: '' + headers: + User-Agent: + - Mozilla/5.0 (compatible; Maremma/4.6.1; mailto:info@datacite.org) + Accept: + - text/html,application/json,application/xml;q=0.9, text/plain;q=0.8,image/png,*/*;q=0.5 + Accept-Encoding: + - gzip,deflate + response: + status: + code: 200 + message: OK + headers: + Date: + - Mon, 30 Mar 2020 06:38:30 GMT + Content-Type: + - application/json; charset=utf-8 + Connection: + - keep-alive + Status: + - 200 OK + Cache-Control: + - max-age=0, private, must-revalidate + Vary: + - Origin + Etag: + - W/"23392d63b55181a6b60544f464db2c83" + X-Runtime: + - '0.676989' + X-Request-Id: + - 742dcdff-2001-43da-a48a-d697650e9560 + X-Powered-By: + - Phusion Passenger 5.2.3 + Server: + - nginx/1.12.2 + Phusion Passenger 5.2.3 + Content-Encoding: + - gzip + body: + encoding: ASCII-8BIT + string: !binary |- + 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 + http_version: null + recorded_at: Mon, 30 Mar 2020 06:38:30 GMT +recorded_with: VCR 5.1.0 diff --git a/spec/fixtures/vcr_cassettes/QueryType/query_funder/returns_funder_information.yml b/spec/fixtures/vcr_cassettes/QueryType/query_funder/returns_funder_information.yml new file mode 100644 index 000000000..6d8e10b2a --- /dev/null +++ b/spec/fixtures/vcr_cassettes/QueryType/query_funder/returns_funder_information.yml @@ -0,0 +1,50 @@ +--- +http_interactions: +- request: + method: get + uri: https://api.crossref.org/funders/10.13039/501100009053 + body: + encoding: US-ASCII + string: '' + headers: + User-Agent: + - Mozilla/5.0 (compatible; Maremma/4.6.1; mailto:info@datacite.org) + Accept: + - text/html,application/json,application/xml;q=0.9, text/plain;q=0.8,image/png,*/*;q=0.5 + Accept-Encoding: + - gzip,deflate + response: + status: + code: 200 + message: OK + headers: + Content-Type: + - application/json;charset=UTF-8 + Vary: + - Accept + Access-Control-Allow-Origin: + - "*" + Access-Control-Allow-Headers: + - X-Requested-With + Content-Length: + - '733' + Server: + - http-kit + Date: + - Sun, 29 Mar 2020 16:12:08 GMT + X-Rate-Limit-Limit: + - '50' + X-Rate-Limit-Interval: + - 1s + Connection: + - close + body: + encoding: ASCII-8BIT + string: '{"status":"ok","message-type":"funder","message-version":"1.0.0","message":{"hierarchy-names":{"501100009053":"The + Wellcome Trust DBT India Alliance"},"replaced-by":[],"work-count":346,"name":"The + Wellcome Trust DBT India Alliance","descendants":[],"descendant-work-count":346,"id":"501100009053","tokens":["the","wellcome","trust","dbt","india","alliance","india","alliance","wtdbt","india","alliance","wellcome","trust\/dbt","india","alliance","wellcome","trust","dbt","india","alliance"],"replaces":[],"uri":"http:\/\/dx.doi.org\/10.13039\/501100009053","hierarchy":{"501100009053":{}},"alt-names":["India + Alliance","WTDBT India Alliance","Wellcome Trust\/DBT India Alliance","Wellcome + Trust DBt India Alliance"],"location":null}}' + http_version: null + recorded_at: Sun, 29 Mar 2020 16:12:09 GMT +recorded_with: VCR 5.1.0 diff --git a/spec/fixtures/vcr_cassettes/QueryType/query_funders/returns_funder_information.yml b/spec/fixtures/vcr_cassettes/QueryType/query_funders/returns_funder_information.yml new file mode 100644 index 000000000..193e63926 --- /dev/null +++ b/spec/fixtures/vcr_cassettes/QueryType/query_funders/returns_funder_information.yml @@ -0,0 +1,96 @@ +--- +http_interactions: +- request: + method: get + uri: https://api.crossref.org/funders?query=Wellcome%20Trust&rows=100 + body: + encoding: US-ASCII + string: '' + headers: + User-Agent: + - Mozilla/5.0 (compatible; Maremma/4.6.1; mailto:info@datacite.org) + Accept: + - text/html,application/json,application/xml;q=0.9, text/plain;q=0.8,image/png,*/*;q=0.5 + Accept-Encoding: + - gzip,deflate + response: + status: + code: 200 + message: OK + headers: + Content-Type: + - application/json;charset=UTF-8 + Vary: + - Accept + Access-Control-Allow-Origin: + - "*" + Access-Control-Allow-Headers: + - X-Requested-With + Content-Length: + - '1424' + Server: + - http-kit + Date: + - Sun, 29 Mar 2020 14:00:44 GMT + X-Rate-Limit-Limit: + - '50' + X-Rate-Limit-Interval: + - 1s + Connection: + - close + body: + encoding: ASCII-8BIT + string: '{"status":"ok","message-type":"funder-list","message-version":"1.0.0","message":{"items-per-page":100,"query":{"start-index":0,"search-terms":"Wellcome + Trust"},"total-results":4,"items":[{"id":"501100009053","location":null,"name":"The + Wellcome Trust DBT India Alliance","alt-names":["India Alliance","WTDBT India + Alliance","Wellcome Trust\/DBT India Alliance","Wellcome Trust DBt India Alliance"],"uri":"http:\/\/dx.doi.org\/10.13039\/501100009053","replaces":[],"replaced-by":[],"tokens":["the","wellcome","trust","dbt","india","alliance","india","alliance","wtdbt","india","alliance","wellcome","trust\/dbt","india","alliance","wellcome","trust","dbt","india","alliance"]},{"id":"501100013372","location":"United + Kingdom","name":"Wellcome Trust Centre for Mitochondrial Research","alt-names":["WCMR"],"uri":"http:\/\/dx.doi.org\/10.13039\/501100013372","replaces":[],"replaced-by":[],"tokens":["wellcome","trust","centre","for","mitochondrial","research","wcmr"]},{"id":"100004440","location":"United + Kingdom","name":"Wellcome Trust","alt-names":["Wellcome"],"uri":"http:\/\/dx.doi.org\/10.13039\/100004440","replaces":[],"replaced-by":["100010269"],"tokens":["wellcome","trust","wellcome"]},{"id":"100010269","location":"United + Kingdom","name":"Wellcome Trust","alt-names":["Wellcome","WT"],"uri":"http:\/\/dx.doi.org\/10.13039\/100010269","replaces":[],"replaced-by":[],"tokens":["wellcome","trust","wellcome","wt"]}]}}' + http_version: null + recorded_at: Sun, 29 Mar 2020 14:00:44 GMT +- request: + method: get + uri: https://api.crossref.org/funders?query=Wellcome%20Trust&rows=0 + body: + encoding: US-ASCII + string: '' + headers: + User-Agent: + - Mozilla/5.0 (compatible; Maremma/4.6.1; mailto:info@datacite.org) + Accept: + - text/html,application/json,application/xml;q=0.9, text/plain;q=0.8,image/png,*/*;q=0.5 + Accept-Encoding: + - gzip,deflate + response: + status: + code: 200 + message: OK + headers: + Content-Type: + - application/json;charset=UTF-8 + Vary: + - Accept + Access-Control-Allow-Origin: + - "*" + Access-Control-Allow-Headers: + - X-Requested-With + Content-Length: + - '188' + Server: + - http-kit + Date: + - Sun, 29 Mar 2020 14:00:46 GMT + X-Rate-Limit-Limit: + - '50' + X-Rate-Limit-Interval: + - 1s + Connection: + - close + body: + encoding: ASCII-8BIT + string: '{"status":"ok","message-type":"funder-list","message-version":"1.0.0","message":{"items-per-page":0,"query":{"start-index":0,"search-terms":"Wellcome + Trust"},"total-results":4,"items":[]}}' + http_version: null + recorded_at: Sun, 29 Mar 2020 14:00:46 GMT +recorded_with: VCR 5.1.0 diff --git a/spec/fixtures/vcr_cassettes/QueryType/query_organizations/returns_organization_information.yml b/spec/fixtures/vcr_cassettes/QueryType/query_organizations/returns_organization_information.yml new file mode 100644 index 000000000..ac1248263 --- /dev/null +++ b/spec/fixtures/vcr_cassettes/QueryType/query_organizations/returns_organization_information.yml @@ -0,0 +1,107 @@ +--- +http_interactions: +- request: + method: get + uri: https://api.ror.org/organizations?query=Cambridge%20University + body: + encoding: US-ASCII + string: '' + headers: + User-Agent: + - Mozilla/5.0 (compatible; Maremma/4.6.1; mailto:info@datacite.org) + Accept: + - text/html,application/json,application/xml;q=0.9, text/plain;q=0.8,image/png,*/*;q=0.5 + Accept-Encoding: + - gzip,deflate + response: + status: + code: 200 + message: OK + headers: + Content-Type: + - application/json + Connection: + - keep-alive + Date: + - Mon, 30 Mar 2020 05:37:36 GMT + Status: + - 200 OK + X-Frame-Options: + - SAMEORIGIN + Allow: + - GET, HEAD, OPTIONS + X-Powered-By: + - Phusion Passenger 6.0.4 + Server: + - nginx/1.17.3 + Phusion Passenger 6.0.4 + Content-Encoding: + - gzip + Vary: + - Accept-Encoding,Cookie,Origin + X-Cache: + - Miss from cloudfront + Via: + - 1.1 4ecd74dda94d7576e134fcdf16df8129.cloudfront.net (CloudFront) + X-Amz-Cf-Pop: + - DUS51-C1 + X-Amz-Cf-Id: + - rLrtwfAJwmcGP0Vi37fdRUpA66wBoH2myByG8XqydzLCTJ5pOmvA6w== + body: + encoding: ASCII-8BIT + string: !binary |- + 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 + http_version: null + recorded_at: Mon, 30 Mar 2020 05:37:36 GMT +- request: + method: get + uri: https://api.ror.org/organizations?query=Cambridge%20University + body: + encoding: US-ASCII + string: '' + headers: + User-Agent: + - Mozilla/5.0 (compatible; Maremma/4.6.1; mailto:info@datacite.org) + Accept: + - text/html,application/json,application/xml;q=0.9, text/plain;q=0.8,image/png,*/*;q=0.5 + Accept-Encoding: + - gzip,deflate + response: + status: + code: 200 + message: OK + headers: + Content-Type: + - application/json + Connection: + - keep-alive + Date: + - Mon, 30 Mar 2020 05:37:36 GMT + Status: + - 200 OK + X-Frame-Options: + - SAMEORIGIN + Allow: + - GET, HEAD, OPTIONS + X-Powered-By: + - Phusion Passenger 6.0.4 + Server: + - nginx/1.17.3 + Phusion Passenger 6.0.4 + Content-Encoding: + - gzip + Vary: + - Accept-Encoding,Cookie,Origin + X-Cache: + - Hit from cloudfront + Via: + - 1.1 bfd667b9fb826986b85315f856bf5885.cloudfront.net (CloudFront) + X-Amz-Cf-Pop: + - DUS51-C1 + X-Amz-Cf-Id: + - V8_lzfVGH0Il6FjLxMGEZdeYp219B3uZWovpfNK8Bz2PNgy_Xt6nvA== + body: + encoding: ASCII-8BIT + string: !binary |- + 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 + http_version: null + recorded_at: Mon, 30 Mar 2020 05:37:36 GMT +recorded_with: VCR 5.1.0 diff --git a/spec/fixtures/vcr_cassettes/dois/GET_/dois_with_query/returns_dois_with_crossref_funder_id.yml b/spec/fixtures/vcr_cassettes/dois/GET_/dois_with_query/returns_dois_with_crossref_funder_id.yml new file mode 100644 index 000000000..c8bdd0a90 --- /dev/null +++ b/spec/fixtures/vcr_cassettes/dois/GET_/dois_with_query/returns_dois_with_crossref_funder_id.yml @@ -0,0 +1,57 @@ +--- +http_interactions: +- request: + method: get + uri: https://api.ror.org/organizations?query=%22https://ror.org/046ak2485%22 + body: + encoding: US-ASCII + string: '' + headers: + User-Agent: + - Mozilla/5.0 (compatible; Maremma/4.6.1; mailto:info@datacite.org) + Accept: + - text/html,application/json,application/xml;q=0.9, text/plain;q=0.8,image/png,*/*;q=0.5 + Accept-Encoding: + - gzip,deflate + response: + status: + code: 200 + message: OK + headers: + Content-Type: + - application/json + Content-Length: + - '868' + Connection: + - keep-alive + Date: + - Sun, 29 Mar 2020 17:06:33 GMT + Status: + - 200 OK + X-Frame-Options: + - SAMEORIGIN + Allow: + - GET, HEAD, OPTIONS + X-Powered-By: + - Phusion Passenger 6.0.4 + Server: + - nginx/1.17.3 + Phusion Passenger 6.0.4 + Vary: + - Cookie,Origin + X-Cache: + - Hit from cloudfront + Via: + - 1.1 9e627a2e7bf673974b02e3bf374bb843.cloudfront.net (CloudFront) + X-Amz-Cf-Pop: + - DUS51-C1 + X-Amz-Cf-Id: + - TU4ArbGxxeXnI3xjsoWJaDK6TvDairb9xcpi5Sz0Mz-jEEXKmseAvw== + Age: + - '9933' + body: + encoding: ASCII-8BIT + string: !binary |- + eyJudW1iZXJfb2ZfcmVzdWx0cyI6MSwidGltZV90YWtlbiI6MTUsIml0ZW1zIjpbeyJpZCI6Imh0dHBzOi8vcm9yLm9yZy8wNDZhazI0ODUiLCJuYW1lIjoiRnJlaWUgVW5pdmVyc2l0w6R0IEJlcmxpbiIsInR5cGVzIjpbIkVkdWNhdGlvbiJdLCJsaW5rcyI6WyJodHRwOi8vd3d3LmZ1LWJlcmxpbi5kZS9lbi8iXSwiYWxpYXNlcyI6WyJGVSBCZXJsaW4iXSwiYWNyb255bXMiOlsiRlUiXSwic3RhdHVzIjoiYWN0aXZlIiwid2lraXBlZGlhX3VybCI6Imh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvRnJlZV9Vbml2ZXJzaXR5X29mX0JlcmxpbiIsImxhYmVscyI6W3sibGFiZWwiOiJGcmVlIFVuaXZlcnNpdHkgb2YgQmVybGluIiwiaXNvNjM5IjoiZW4ifV0sImNvdW50cnkiOnsiY291bnRyeV9uYW1lIjoiR2VybWFueSIsImNvdW50cnlfY29kZSI6IkRFIn0sImV4dGVybmFsX2lkcyI6eyJJU05JIjp7InByZWZlcnJlZCI6bnVsbCwiYWxsIjpbIjAwMDAgMDAwMCA5MTE2IDQ4MzYiXX0sIkZ1bmRSZWYiOnsicHJlZmVycmVkIjpudWxsLCJhbGwiOlsiNTAxMTAwMDAxNjQ0IiwiNTAxMTAwMDAyOTcxIl19LCJPcmdSZWYiOnsicHJlZmVycmVkIjpudWxsLCJhbGwiOlsiMzE1Mjc1Il19LCJXaWtpZGF0YSI6eyJwcmVmZXJyZWQiOm51bGwsImFsbCI6WyJRMTUzMDA2Il19LCJHUklEIjp7InByZWZlcnJlZCI6ImdyaWQuMTQwOTUuMzkiLCJhbGwiOiJncmlkLjE0MDk1LjM5In19fV0sIm1ldGEiOnsidHlwZXMiOlt7ImlkIjoiZWR1Y2F0aW9uIiwidGl0bGUiOiJFZHVjYXRpb24iLCJjb3VudCI6MX1dLCJjb3VudHJpZXMiOlt7ImlkIjoiZGUiLCJ0aXRsZSI6IkZlZGVyYWwgUmVwdWJsaWMgb2YgR2VybWFueSIsImNvdW50IjoxfV19fQ== + http_version: null + recorded_at: Sun, 29 Mar 2020 19:52:06 GMT +recorded_with: VCR 5.1.0 diff --git a/spec/fixtures/vcr_cassettes/dois/GET_/dois_with_query/returns_dois_with_crossref_funder_id_as_url.yml b/spec/fixtures/vcr_cassettes/dois/GET_/dois_with_query/returns_dois_with_crossref_funder_id_as_url.yml new file mode 100644 index 000000000..6a83982dc --- /dev/null +++ b/spec/fixtures/vcr_cassettes/dois/GET_/dois_with_query/returns_dois_with_crossref_funder_id_as_url.yml @@ -0,0 +1,57 @@ +--- +http_interactions: +- request: + method: get + uri: https://api.ror.org/organizations?query=%22https://ror.org/046ak2485%22 + body: + encoding: US-ASCII + string: '' + headers: + User-Agent: + - Mozilla/5.0 (compatible; Maremma/4.6.1; mailto:info@datacite.org) + Accept: + - text/html,application/json,application/xml;q=0.9, text/plain;q=0.8,image/png,*/*;q=0.5 + Accept-Encoding: + - gzip,deflate + response: + status: + code: 200 + message: OK + headers: + Content-Type: + - application/json + Content-Length: + - '868' + Connection: + - keep-alive + Date: + - Sun, 29 Mar 2020 17:06:33 GMT + Status: + - 200 OK + X-Frame-Options: + - SAMEORIGIN + Allow: + - GET, HEAD, OPTIONS + X-Powered-By: + - Phusion Passenger 6.0.4 + Server: + - nginx/1.17.3 + Phusion Passenger 6.0.4 + Vary: + - Cookie,Origin + X-Cache: + - Hit from cloudfront + Via: + - 1.1 d0be2eec997f966c9c7eb03ae2f75c30.cloudfront.net (CloudFront) + X-Amz-Cf-Pop: + - DUS51-C1 + X-Amz-Cf-Id: + - IR576DDe20N0BecU92aq4oIlJ1qrGTUBR8KX1wkWI9MYk4xbzXueSg== + Age: + - '9925' + body: + encoding: ASCII-8BIT + string: !binary |- + eyJudW1iZXJfb2ZfcmVzdWx0cyI6MSwidGltZV90YWtlbiI6MTUsIml0ZW1zIjpbeyJpZCI6Imh0dHBzOi8vcm9yLm9yZy8wNDZhazI0ODUiLCJuYW1lIjoiRnJlaWUgVW5pdmVyc2l0w6R0IEJlcmxpbiIsInR5cGVzIjpbIkVkdWNhdGlvbiJdLCJsaW5rcyI6WyJodHRwOi8vd3d3LmZ1LWJlcmxpbi5kZS9lbi8iXSwiYWxpYXNlcyI6WyJGVSBCZXJsaW4iXSwiYWNyb255bXMiOlsiRlUiXSwic3RhdHVzIjoiYWN0aXZlIiwid2lraXBlZGlhX3VybCI6Imh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvRnJlZV9Vbml2ZXJzaXR5X29mX0JlcmxpbiIsImxhYmVscyI6W3sibGFiZWwiOiJGcmVlIFVuaXZlcnNpdHkgb2YgQmVybGluIiwiaXNvNjM5IjoiZW4ifV0sImNvdW50cnkiOnsiY291bnRyeV9uYW1lIjoiR2VybWFueSIsImNvdW50cnlfY29kZSI6IkRFIn0sImV4dGVybmFsX2lkcyI6eyJJU05JIjp7InByZWZlcnJlZCI6bnVsbCwiYWxsIjpbIjAwMDAgMDAwMCA5MTE2IDQ4MzYiXX0sIkZ1bmRSZWYiOnsicHJlZmVycmVkIjpudWxsLCJhbGwiOlsiNTAxMTAwMDAxNjQ0IiwiNTAxMTAwMDAyOTcxIl19LCJPcmdSZWYiOnsicHJlZmVycmVkIjpudWxsLCJhbGwiOlsiMzE1Mjc1Il19LCJXaWtpZGF0YSI6eyJwcmVmZXJyZWQiOm51bGwsImFsbCI6WyJRMTUzMDA2Il19LCJHUklEIjp7InByZWZlcnJlZCI6ImdyaWQuMTQwOTUuMzkiLCJhbGwiOiJncmlkLjE0MDk1LjM5In19fV0sIm1ldGEiOnsidHlwZXMiOlt7ImlkIjoiZWR1Y2F0aW9uIiwidGl0bGUiOiJFZHVjYXRpb24iLCJjb3VudCI6MX1dLCJjb3VudHJpZXMiOlt7ImlkIjoiZGUiLCJ0aXRsZSI6IkZlZGVyYWwgUmVwdWJsaWMgb2YgR2VybWFueSIsImNvdW50IjoxfV19fQ== + http_version: null + recorded_at: Sun, 29 Mar 2020 19:51:58 GMT +recorded_with: VCR 5.1.0 diff --git a/spec/fixtures/vcr_cassettes/dois/GET_/dois_with_query/returns_dois_with_orcid_id.yml b/spec/fixtures/vcr_cassettes/dois/GET_/dois_with_query/returns_dois_with_orcid_id.yml new file mode 100644 index 000000000..d7139c804 --- /dev/null +++ b/spec/fixtures/vcr_cassettes/dois/GET_/dois_with_query/returns_dois_with_orcid_id.yml @@ -0,0 +1,57 @@ +--- +http_interactions: +- request: + method: get + uri: https://api.ror.org/organizations?query=%22https://ror.org/046ak2485%22 + body: + encoding: US-ASCII + string: '' + headers: + User-Agent: + - Mozilla/5.0 (compatible; Maremma/4.6.1; mailto:info@datacite.org) + Accept: + - text/html,application/json,application/xml;q=0.9, text/plain;q=0.8,image/png,*/*;q=0.5 + Accept-Encoding: + - gzip,deflate + response: + status: + code: 200 + message: OK + headers: + Content-Type: + - application/json + Content-Length: + - '868' + Connection: + - keep-alive + Date: + - Sun, 29 Mar 2020 17:06:33 GMT + Status: + - 200 OK + X-Frame-Options: + - SAMEORIGIN + Allow: + - GET, HEAD, OPTIONS + X-Powered-By: + - Phusion Passenger 6.0.4 + Server: + - nginx/1.17.3 + Phusion Passenger 6.0.4 + Vary: + - Cookie,Origin + X-Cache: + - Hit from cloudfront + Via: + - 1.1 4678033b564719cfa85dd7af417223ab.cloudfront.net (CloudFront) + X-Amz-Cf-Pop: + - DUS51-C1 + X-Amz-Cf-Id: + - aKdXdMUhDBteQDBZR431yy8r9fzTr3VFd3zJWjezjSJnQqH0mDtXCA== + Age: + - '9949' + body: + encoding: ASCII-8BIT + string: !binary |- + eyJudW1iZXJfb2ZfcmVzdWx0cyI6MSwidGltZV90YWtlbiI6MTUsIml0ZW1zIjpbeyJpZCI6Imh0dHBzOi8vcm9yLm9yZy8wNDZhazI0ODUiLCJuYW1lIjoiRnJlaWUgVW5pdmVyc2l0w6R0IEJlcmxpbiIsInR5cGVzIjpbIkVkdWNhdGlvbiJdLCJsaW5rcyI6WyJodHRwOi8vd3d3LmZ1LWJlcmxpbi5kZS9lbi8iXSwiYWxpYXNlcyI6WyJGVSBCZXJsaW4iXSwiYWNyb255bXMiOlsiRlUiXSwic3RhdHVzIjoiYWN0aXZlIiwid2lraXBlZGlhX3VybCI6Imh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvRnJlZV9Vbml2ZXJzaXR5X29mX0JlcmxpbiIsImxhYmVscyI6W3sibGFiZWwiOiJGcmVlIFVuaXZlcnNpdHkgb2YgQmVybGluIiwiaXNvNjM5IjoiZW4ifV0sImNvdW50cnkiOnsiY291bnRyeV9uYW1lIjoiR2VybWFueSIsImNvdW50cnlfY29kZSI6IkRFIn0sImV4dGVybmFsX2lkcyI6eyJJU05JIjp7InByZWZlcnJlZCI6bnVsbCwiYWxsIjpbIjAwMDAgMDAwMCA5MTE2IDQ4MzYiXX0sIkZ1bmRSZWYiOnsicHJlZmVycmVkIjpudWxsLCJhbGwiOlsiNTAxMTAwMDAxNjQ0IiwiNTAxMTAwMDAyOTcxIl19LCJPcmdSZWYiOnsicHJlZmVycmVkIjpudWxsLCJhbGwiOlsiMzE1Mjc1Il19LCJXaWtpZGF0YSI6eyJwcmVmZXJyZWQiOm51bGwsImFsbCI6WyJRMTUzMDA2Il19LCJHUklEIjp7InByZWZlcnJlZCI6ImdyaWQuMTQwOTUuMzkiLCJhbGwiOiJncmlkLjE0MDk1LjM5In19fV0sIm1ldGEiOnsidHlwZXMiOlt7ImlkIjoiZWR1Y2F0aW9uIiwidGl0bGUiOiJFZHVjYXRpb24iLCJjb3VudCI6MX1dLCJjb3VudHJpZXMiOlt7ImlkIjoiZGUiLCJ0aXRsZSI6IkZlZGVyYWwgUmVwdWJsaWMgb2YgR2VybWFueSIsImNvdW50IjoxfV19fQ== + http_version: null + recorded_at: Sun, 29 Mar 2020 19:52:22 GMT +recorded_with: VCR 5.1.0 diff --git a/spec/fixtures/vcr_cassettes/dois/GET_/dois_with_query/returns_dois_with_orcid_id_as_url.yml b/spec/fixtures/vcr_cassettes/dois/GET_/dois_with_query/returns_dois_with_orcid_id_as_url.yml new file mode 100644 index 000000000..a4ba7b303 --- /dev/null +++ b/spec/fixtures/vcr_cassettes/dois/GET_/dois_with_query/returns_dois_with_orcid_id_as_url.yml @@ -0,0 +1,57 @@ +--- +http_interactions: +- request: + method: get + uri: https://api.ror.org/organizations?query=%22https://ror.org/046ak2485%22 + body: + encoding: US-ASCII + string: '' + headers: + User-Agent: + - Mozilla/5.0 (compatible; Maremma/4.6.1; mailto:info@datacite.org) + Accept: + - text/html,application/json,application/xml;q=0.9, text/plain;q=0.8,image/png,*/*;q=0.5 + Accept-Encoding: + - gzip,deflate + response: + status: + code: 200 + message: OK + headers: + Content-Type: + - application/json + Content-Length: + - '868' + Connection: + - keep-alive + Date: + - Sun, 29 Mar 2020 17:06:33 GMT + Status: + - 200 OK + X-Frame-Options: + - SAMEORIGIN + Allow: + - GET, HEAD, OPTIONS + X-Powered-By: + - Phusion Passenger 6.0.4 + Server: + - nginx/1.17.3 + Phusion Passenger 6.0.4 + Vary: + - Cookie,Origin + X-Cache: + - Hit from cloudfront + Via: + - 1.1 20f674d6a4a322fa027d3644cb825864.cloudfront.net (CloudFront) + X-Amz-Cf-Pop: + - DUS51-C1 + X-Amz-Cf-Id: + - Tek6EM7TeVV2lbwubBa66DZZs8ACWOWvd23nJLK4u75Gsd2zniau7A== + Age: + - '9945' + body: + encoding: ASCII-8BIT + string: !binary |- + eyJudW1iZXJfb2ZfcmVzdWx0cyI6MSwidGltZV90YWtlbiI6MTUsIml0ZW1zIjpbeyJpZCI6Imh0dHBzOi8vcm9yLm9yZy8wNDZhazI0ODUiLCJuYW1lIjoiRnJlaWUgVW5pdmVyc2l0w6R0IEJlcmxpbiIsInR5cGVzIjpbIkVkdWNhdGlvbiJdLCJsaW5rcyI6WyJodHRwOi8vd3d3LmZ1LWJlcmxpbi5kZS9lbi8iXSwiYWxpYXNlcyI6WyJGVSBCZXJsaW4iXSwiYWNyb255bXMiOlsiRlUiXSwic3RhdHVzIjoiYWN0aXZlIiwid2lraXBlZGlhX3VybCI6Imh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvRnJlZV9Vbml2ZXJzaXR5X29mX0JlcmxpbiIsImxhYmVscyI6W3sibGFiZWwiOiJGcmVlIFVuaXZlcnNpdHkgb2YgQmVybGluIiwiaXNvNjM5IjoiZW4ifV0sImNvdW50cnkiOnsiY291bnRyeV9uYW1lIjoiR2VybWFueSIsImNvdW50cnlfY29kZSI6IkRFIn0sImV4dGVybmFsX2lkcyI6eyJJU05JIjp7InByZWZlcnJlZCI6bnVsbCwiYWxsIjpbIjAwMDAgMDAwMCA5MTE2IDQ4MzYiXX0sIkZ1bmRSZWYiOnsicHJlZmVycmVkIjpudWxsLCJhbGwiOlsiNTAxMTAwMDAxNjQ0IiwiNTAxMTAwMDAyOTcxIl19LCJPcmdSZWYiOnsicHJlZmVycmVkIjpudWxsLCJhbGwiOlsiMzE1Mjc1Il19LCJXaWtpZGF0YSI6eyJwcmVmZXJyZWQiOm51bGwsImFsbCI6WyJRMTUzMDA2Il19LCJHUklEIjp7InByZWZlcnJlZCI6ImdyaWQuMTQwOTUuMzkiLCJhbGwiOiJncmlkLjE0MDk1LjM5In19fV0sIm1ldGEiOnsidHlwZXMiOlt7ImlkIjoiZWR1Y2F0aW9uIiwidGl0bGUiOiJFZHVjYXRpb24iLCJjb3VudCI6MX1dLCJjb3VudHJpZXMiOlt7ImlkIjoiZGUiLCJ0aXRsZSI6IkZlZGVyYWwgUmVwdWJsaWMgb2YgR2VybWFueSIsImNvdW50IjoxfV19fQ== + http_version: null + recorded_at: Sun, 29 Mar 2020 19:52:18 GMT +recorded_with: VCR 5.1.0 diff --git a/spec/fixtures/vcr_cassettes/dois/GET_/dois_with_query/returns_dois_with_re3data_id.yml b/spec/fixtures/vcr_cassettes/dois/GET_/dois_with_query/returns_dois_with_re3data_id.yml new file mode 100644 index 000000000..000411732 --- /dev/null +++ b/spec/fixtures/vcr_cassettes/dois/GET_/dois_with_query/returns_dois_with_re3data_id.yml @@ -0,0 +1,55 @@ +--- +http_interactions: +- request: + method: get + uri: https://api.ror.org/organizations?query=%22https://ror.org/04wxnsj81%22%20%22https://ror.org/046ak2485%22 + body: + encoding: US-ASCII + string: '' + headers: + User-Agent: + - Mozilla/5.0 (compatible; Maremma/4.6.1; mailto:info@datacite.org) + Accept: + - text/html,application/json,application/xml;q=0.9, text/plain;q=0.8,image/png,*/*;q=0.5 + Accept-Encoding: + - gzip,deflate + response: + status: + code: 200 + message: OK + headers: + Content-Type: + - application/json + Connection: + - keep-alive + Date: + - Sun, 29 Mar 2020 20:26:39 GMT + Status: + - 200 OK + X-Frame-Options: + - SAMEORIGIN + Allow: + - GET, HEAD, OPTIONS + X-Powered-By: + - Phusion Passenger 6.0.4 + Server: + - nginx/1.17.3 + Phusion Passenger 6.0.4 + Content-Encoding: + - gzip + Vary: + - Accept-Encoding,Cookie,Origin + X-Cache: + - Miss from cloudfront + Via: + - 1.1 c51e3be89c14e3f859ea898f7e36eced.cloudfront.net (CloudFront) + X-Amz-Cf-Pop: + - DUS51-C1 + X-Amz-Cf-Id: + - V5u7y-CsW8vs4ezSpcBmW6YYN-TIUln6hCAqDQB9byBAo3-xZDaFRA== + body: + encoding: ASCII-8BIT + string: !binary |- + H4sIAAAAAAAAA6xUwY6bMBD9FeQzJUCATXJsN1nlkmpTrXpYRciBIXVjDDKmWRTxN/2T/ljHJDgkVbY9lAPyjOeN/eY9+UhEnW9BxkUWS6hqrioy822iWA6xonsQGEY2YQpy3Hk9EpaSGfmmVFnNRiNZSKeQu5EbHN5E9X3iEZsImgOWPFJFPyEMM6opQYPJqhClLDKmyMYmnIl9l+2bHQ4HJ0VUgijdVRdRzmjVgXWQyEI0+TmqFFU1rjGt2A99zoHtWQkpo3Et+eCWIByz1V1XR6PBBTndAj+3TYpaKNmQ2bFfxmdGTyBzKhpiauKkSDuqc9LaBN4USEF5zNJKo7/iIZqOXpcSMpAS9OyeJ74XBj7R5Ljm3yc22ORpvXy8BewkS53gIZz4kUN72E22bVv7rjYR3fvBJLxos5DAwHoRODZZMfXrp7I+gkRBhmLN0zqhihXiD7HOWmX1h22HclLAGY+u9SKLl77ptXS4Qf5ZvrvqIQWIDYNG+9dQMHIeT8sT4wHhxiqyC2NWFdF4ikVo9vZ/OmD5ZbW8EVPUnBvhXfys7jf1vMgKJuOoM8GiFukasvegoet5GulFQYDX6UN/+uB1LT7L3V86jL3Qfwi74jtOvSp/9sKx60bvm9QL3Gno4CyvTGqyaFIcbw6nk3qjnW0Lxm769VFcj3U+yHUTJzPP+FyYx+QCWA1yBmAkZcPzUhjgFpCCpNxaQ1lvOUu0P27Exnew3bTtbwAAAP//AwBUgovSMQUAAA== + http_version: null + recorded_at: Sun, 29 Mar 2020 20:26:39 GMT +recorded_with: VCR 5.1.0 diff --git a/spec/fixtures/vcr_cassettes/dois/GET_/dois_with_query/returns_dois_with_ror_id.yml b/spec/fixtures/vcr_cassettes/dois/GET_/dois_with_query/returns_dois_with_ror_id.yml new file mode 100644 index 000000000..2170937f0 --- /dev/null +++ b/spec/fixtures/vcr_cassettes/dois/GET_/dois_with_query/returns_dois_with_ror_id.yml @@ -0,0 +1,57 @@ +--- +http_interactions: +- request: + method: get + uri: https://api.ror.org/organizations?query=%22https://ror.org/046ak2485%22 + body: + encoding: US-ASCII + string: '' + headers: + User-Agent: + - Mozilla/5.0 (compatible; Maremma/4.6.1; mailto:info@datacite.org) + Accept: + - text/html,application/json,application/xml;q=0.9, text/plain;q=0.8,image/png,*/*;q=0.5 + Accept-Encoding: + - gzip,deflate + response: + status: + code: 200 + message: OK + headers: + Content-Type: + - application/json + Content-Length: + - '868' + Connection: + - keep-alive + Date: + - Sun, 29 Mar 2020 17:06:33 GMT + Status: + - 200 OK + X-Frame-Options: + - SAMEORIGIN + Allow: + - GET, HEAD, OPTIONS + X-Powered-By: + - Phusion Passenger 6.0.4 + Server: + - nginx/1.17.3 + Phusion Passenger 6.0.4 + Vary: + - Cookie,Origin + X-Cache: + - Hit from cloudfront + Via: + - 1.1 e8640ab30463560abfb6a2665bafb393.cloudfront.net (CloudFront) + X-Amz-Cf-Pop: + - DUS51-C1 + X-Amz-Cf-Id: + - Fpeuto_OMhhboIXN-6_Q5TCFWvm3YwZCulmDi3bfyAdHlrDc-BJwZQ== + Age: + - '9937' + body: + encoding: ASCII-8BIT + string: !binary |- + eyJudW1iZXJfb2ZfcmVzdWx0cyI6MSwidGltZV90YWtlbiI6MTUsIml0ZW1zIjpbeyJpZCI6Imh0dHBzOi8vcm9yLm9yZy8wNDZhazI0ODUiLCJuYW1lIjoiRnJlaWUgVW5pdmVyc2l0w6R0IEJlcmxpbiIsInR5cGVzIjpbIkVkdWNhdGlvbiJdLCJsaW5rcyI6WyJodHRwOi8vd3d3LmZ1LWJlcmxpbi5kZS9lbi8iXSwiYWxpYXNlcyI6WyJGVSBCZXJsaW4iXSwiYWNyb255bXMiOlsiRlUiXSwic3RhdHVzIjoiYWN0aXZlIiwid2lraXBlZGlhX3VybCI6Imh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvRnJlZV9Vbml2ZXJzaXR5X29mX0JlcmxpbiIsImxhYmVscyI6W3sibGFiZWwiOiJGcmVlIFVuaXZlcnNpdHkgb2YgQmVybGluIiwiaXNvNjM5IjoiZW4ifV0sImNvdW50cnkiOnsiY291bnRyeV9uYW1lIjoiR2VybWFueSIsImNvdW50cnlfY29kZSI6IkRFIn0sImV4dGVybmFsX2lkcyI6eyJJU05JIjp7InByZWZlcnJlZCI6bnVsbCwiYWxsIjpbIjAwMDAgMDAwMCA5MTE2IDQ4MzYiXX0sIkZ1bmRSZWYiOnsicHJlZmVycmVkIjpudWxsLCJhbGwiOlsiNTAxMTAwMDAxNjQ0IiwiNTAxMTAwMDAyOTcxIl19LCJPcmdSZWYiOnsicHJlZmVycmVkIjpudWxsLCJhbGwiOlsiMzE1Mjc1Il19LCJXaWtpZGF0YSI6eyJwcmVmZXJyZWQiOm51bGwsImFsbCI6WyJRMTUzMDA2Il19LCJHUklEIjp7InByZWZlcnJlZCI6ImdyaWQuMTQwOTUuMzkiLCJhbGwiOiJncmlkLjE0MDk1LjM5In19fV0sIm1ldGEiOnsidHlwZXMiOlt7ImlkIjoiZWR1Y2F0aW9uIiwidGl0bGUiOiJFZHVjYXRpb24iLCJjb3VudCI6MX1dLCJjb3VudHJpZXMiOlt7ImlkIjoiZGUiLCJ0aXRsZSI6IkZlZGVyYWwgUmVwdWJsaWMgb2YgR2VybWFueSIsImNvdW50IjoxfV19fQ== + http_version: null + recorded_at: Sun, 29 Mar 2020 19:52:10 GMT +recorded_with: VCR 5.1.0 diff --git a/spec/fixtures/vcr_cassettes/dois/GET_/dois_with_query/returns_dois_with_ror_id_as_url.yml b/spec/fixtures/vcr_cassettes/dois/GET_/dois_with_query/returns_dois_with_ror_id_as_url.yml new file mode 100644 index 000000000..63ae74606 --- /dev/null +++ b/spec/fixtures/vcr_cassettes/dois/GET_/dois_with_query/returns_dois_with_ror_id_as_url.yml @@ -0,0 +1,57 @@ +--- +http_interactions: +- request: + method: get + uri: https://api.ror.org/organizations?query=%22https://ror.org/046ak2485%22 + body: + encoding: US-ASCII + string: '' + headers: + User-Agent: + - Mozilla/5.0 (compatible; Maremma/4.6.1; mailto:info@datacite.org) + Accept: + - text/html,application/json,application/xml;q=0.9, text/plain;q=0.8,image/png,*/*;q=0.5 + Accept-Encoding: + - gzip,deflate + response: + status: + code: 200 + message: OK + headers: + Content-Type: + - application/json + Content-Length: + - '868' + Connection: + - keep-alive + Date: + - Sun, 29 Mar 2020 17:06:33 GMT + Status: + - 200 OK + X-Frame-Options: + - SAMEORIGIN + Allow: + - GET, HEAD, OPTIONS + X-Powered-By: + - Phusion Passenger 6.0.4 + Server: + - nginx/1.17.3 + Phusion Passenger 6.0.4 + Vary: + - Cookie,Origin + X-Cache: + - Hit from cloudfront + Via: + - 1.1 f12c01365a7e1bcbb4b6d5b856516527.cloudfront.net (CloudFront) + X-Amz-Cf-Pop: + - DUS51-C1 + X-Amz-Cf-Id: + - DQeq7dVe3tWiZaYNvSvtSTzwFuw6hvGbP7W7bq20XuSqDHu4wkLnBw== + Age: + - '9953' + body: + encoding: ASCII-8BIT + string: !binary |- + eyJudW1iZXJfb2ZfcmVzdWx0cyI6MSwidGltZV90YWtlbiI6MTUsIml0ZW1zIjpbeyJpZCI6Imh0dHBzOi8vcm9yLm9yZy8wNDZhazI0ODUiLCJuYW1lIjoiRnJlaWUgVW5pdmVyc2l0w6R0IEJlcmxpbiIsInR5cGVzIjpbIkVkdWNhdGlvbiJdLCJsaW5rcyI6WyJodHRwOi8vd3d3LmZ1LWJlcmxpbi5kZS9lbi8iXSwiYWxpYXNlcyI6WyJGVSBCZXJsaW4iXSwiYWNyb255bXMiOlsiRlUiXSwic3RhdHVzIjoiYWN0aXZlIiwid2lraXBlZGlhX3VybCI6Imh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvRnJlZV9Vbml2ZXJzaXR5X29mX0JlcmxpbiIsImxhYmVscyI6W3sibGFiZWwiOiJGcmVlIFVuaXZlcnNpdHkgb2YgQmVybGluIiwiaXNvNjM5IjoiZW4ifV0sImNvdW50cnkiOnsiY291bnRyeV9uYW1lIjoiR2VybWFueSIsImNvdW50cnlfY29kZSI6IkRFIn0sImV4dGVybmFsX2lkcyI6eyJJU05JIjp7InByZWZlcnJlZCI6bnVsbCwiYWxsIjpbIjAwMDAgMDAwMCA5MTE2IDQ4MzYiXX0sIkZ1bmRSZWYiOnsicHJlZmVycmVkIjpudWxsLCJhbGwiOlsiNTAxMTAwMDAxNjQ0IiwiNTAxMTAwMDAyOTcxIl19LCJPcmdSZWYiOnsicHJlZmVycmVkIjpudWxsLCJhbGwiOlsiMzE1Mjc1Il19LCJXaWtpZGF0YSI6eyJwcmVmZXJyZWQiOm51bGwsImFsbCI6WyJRMTUzMDA2Il19LCJHUklEIjp7InByZWZlcnJlZCI6ImdyaWQuMTQwOTUuMzkiLCJhbGwiOiJncmlkLjE0MDk1LjM5In19fV0sIm1ldGEiOnsidHlwZXMiOlt7ImlkIjoiZWR1Y2F0aW9uIiwidGl0bGUiOiJFZHVjYXRpb24iLCJjb3VudCI6MX1dLCJjb3VudHJpZXMiOlt7ImlkIjoiZGUiLCJ0aXRsZSI6IkZlZGVyYWwgUmVwdWJsaWMgb2YgR2VybWFueSIsImNvdW50IjoxfV19fQ== + http_version: null + recorded_at: Sun, 29 Mar 2020 19:52:26 GMT +recorded_with: VCR 5.1.0 diff --git a/spec/fixtures/vcr_cassettes/dois/GET_/dois_with_query/returns_dois_with_short_orcid_id.yml b/spec/fixtures/vcr_cassettes/dois/GET_/dois_with_query/returns_dois_with_short_orcid_id.yml new file mode 100644 index 000000000..432a9db6c --- /dev/null +++ b/spec/fixtures/vcr_cassettes/dois/GET_/dois_with_query/returns_dois_with_short_orcid_id.yml @@ -0,0 +1,57 @@ +--- +http_interactions: +- request: + method: get + uri: https://api.ror.org/organizations?query=%22https://ror.org/046ak2485%22 + body: + encoding: US-ASCII + string: '' + headers: + User-Agent: + - Mozilla/5.0 (compatible; Maremma/4.6.1; mailto:info@datacite.org) + Accept: + - text/html,application/json,application/xml;q=0.9, text/plain;q=0.8,image/png,*/*;q=0.5 + Accept-Encoding: + - gzip,deflate + response: + status: + code: 200 + message: OK + headers: + Content-Type: + - application/json + Content-Length: + - '868' + Connection: + - keep-alive + Date: + - Sun, 29 Mar 2020 17:06:33 GMT + Status: + - 200 OK + X-Frame-Options: + - SAMEORIGIN + Allow: + - GET, HEAD, OPTIONS + X-Powered-By: + - Phusion Passenger 6.0.4 + Server: + - nginx/1.17.3 + Phusion Passenger 6.0.4 + Vary: + - Cookie,Origin + X-Cache: + - Hit from cloudfront + Via: + - 1.1 3e9b9356decf1aa720af0bc92acc0586.cloudfront.net (CloudFront) + X-Amz-Cf-Pop: + - DUS51-C1 + X-Amz-Cf-Id: + - 1UHTGCQgyMb6qc37NZNlsGJtGfsHbNm7MkwOsJXrwQSxRokxhm_Usw== + Age: + - '9929' + body: + encoding: ASCII-8BIT + string: !binary |- + eyJudW1iZXJfb2ZfcmVzdWx0cyI6MSwidGltZV90YWtlbiI6MTUsIml0ZW1zIjpbeyJpZCI6Imh0dHBzOi8vcm9yLm9yZy8wNDZhazI0ODUiLCJuYW1lIjoiRnJlaWUgVW5pdmVyc2l0w6R0IEJlcmxpbiIsInR5cGVzIjpbIkVkdWNhdGlvbiJdLCJsaW5rcyI6WyJodHRwOi8vd3d3LmZ1LWJlcmxpbi5kZS9lbi8iXSwiYWxpYXNlcyI6WyJGVSBCZXJsaW4iXSwiYWNyb255bXMiOlsiRlUiXSwic3RhdHVzIjoiYWN0aXZlIiwid2lraXBlZGlhX3VybCI6Imh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvRnJlZV9Vbml2ZXJzaXR5X29mX0JlcmxpbiIsImxhYmVscyI6W3sibGFiZWwiOiJGcmVlIFVuaXZlcnNpdHkgb2YgQmVybGluIiwiaXNvNjM5IjoiZW4ifV0sImNvdW50cnkiOnsiY291bnRyeV9uYW1lIjoiR2VybWFueSIsImNvdW50cnlfY29kZSI6IkRFIn0sImV4dGVybmFsX2lkcyI6eyJJU05JIjp7InByZWZlcnJlZCI6bnVsbCwiYWxsIjpbIjAwMDAgMDAwMCA5MTE2IDQ4MzYiXX0sIkZ1bmRSZWYiOnsicHJlZmVycmVkIjpudWxsLCJhbGwiOlsiNTAxMTAwMDAxNjQ0IiwiNTAxMTAwMDAyOTcxIl19LCJPcmdSZWYiOnsicHJlZmVycmVkIjpudWxsLCJhbGwiOlsiMzE1Mjc1Il19LCJXaWtpZGF0YSI6eyJwcmVmZXJyZWQiOm51bGwsImFsbCI6WyJRMTUzMDA2Il19LCJHUklEIjp7InByZWZlcnJlZCI6ImdyaWQuMTQwOTUuMzkiLCJhbGwiOiJncmlkLjE0MDk1LjM5In19fV0sIm1ldGEiOnsidHlwZXMiOlt7ImlkIjoiZWR1Y2F0aW9uIiwidGl0bGUiOiJFZHVjYXRpb24iLCJjb3VudCI6MX1dLCJjb3VudHJpZXMiOlt7ImlkIjoiZGUiLCJ0aXRsZSI6IkZlZGVyYWwgUmVwdWJsaWMgb2YgR2VybWFueSIsImNvdW50IjoxfV19fQ== + http_version: null + recorded_at: Sun, 29 Mar 2020 19:52:02 GMT +recorded_with: VCR 5.1.0 diff --git a/spec/fixtures/vcr_cassettes/dois/GET_/dois_with_query/returns_dois_with_short_ror_id.yml b/spec/fixtures/vcr_cassettes/dois/GET_/dois_with_query/returns_dois_with_short_ror_id.yml new file mode 100644 index 000000000..bd94f14b7 --- /dev/null +++ b/spec/fixtures/vcr_cassettes/dois/GET_/dois_with_query/returns_dois_with_short_ror_id.yml @@ -0,0 +1,57 @@ +--- +http_interactions: +- request: + method: get + uri: https://api.ror.org/organizations?query=%22https://ror.org/046ak2485%22 + body: + encoding: US-ASCII + string: '' + headers: + User-Agent: + - Mozilla/5.0 (compatible; Maremma/4.6.1; mailto:info@datacite.org) + Accept: + - text/html,application/json,application/xml;q=0.9, text/plain;q=0.8,image/png,*/*;q=0.5 + Accept-Encoding: + - gzip,deflate + response: + status: + code: 200 + message: OK + headers: + Content-Type: + - application/json + Content-Length: + - '868' + Connection: + - keep-alive + Date: + - Sun, 29 Mar 2020 17:06:33 GMT + Status: + - 200 OK + X-Frame-Options: + - SAMEORIGIN + Allow: + - GET, HEAD, OPTIONS + X-Powered-By: + - Phusion Passenger 6.0.4 + Server: + - nginx/1.17.3 + Phusion Passenger 6.0.4 + Vary: + - Cookie,Origin + X-Cache: + - Hit from cloudfront + Via: + - 1.1 962c9e2b0aa7dee39ccec2b38fda120f.cloudfront.net (CloudFront) + X-Amz-Cf-Pop: + - DUS51-C1 + X-Amz-Cf-Id: + - 5bPfZX0vmHc1RkCU_xL5VJ_ZunxSC4rwTGPWNP3i0P25D8bNtDBcGQ== + Age: + - '9941' + body: + encoding: ASCII-8BIT + string: !binary |- + eyJudW1iZXJfb2ZfcmVzdWx0cyI6MSwidGltZV90YWtlbiI6MTUsIml0ZW1zIjpbeyJpZCI6Imh0dHBzOi8vcm9yLm9yZy8wNDZhazI0ODUiLCJuYW1lIjoiRnJlaWUgVW5pdmVyc2l0w6R0IEJlcmxpbiIsInR5cGVzIjpbIkVkdWNhdGlvbiJdLCJsaW5rcyI6WyJodHRwOi8vd3d3LmZ1LWJlcmxpbi5kZS9lbi8iXSwiYWxpYXNlcyI6WyJGVSBCZXJsaW4iXSwiYWNyb255bXMiOlsiRlUiXSwic3RhdHVzIjoiYWN0aXZlIiwid2lraXBlZGlhX3VybCI6Imh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvRnJlZV9Vbml2ZXJzaXR5X29mX0JlcmxpbiIsImxhYmVscyI6W3sibGFiZWwiOiJGcmVlIFVuaXZlcnNpdHkgb2YgQmVybGluIiwiaXNvNjM5IjoiZW4ifV0sImNvdW50cnkiOnsiY291bnRyeV9uYW1lIjoiR2VybWFueSIsImNvdW50cnlfY29kZSI6IkRFIn0sImV4dGVybmFsX2lkcyI6eyJJU05JIjp7InByZWZlcnJlZCI6bnVsbCwiYWxsIjpbIjAwMDAgMDAwMCA5MTE2IDQ4MzYiXX0sIkZ1bmRSZWYiOnsicHJlZmVycmVkIjpudWxsLCJhbGwiOlsiNTAxMTAwMDAxNjQ0IiwiNTAxMTAwMDAyOTcxIl19LCJPcmdSZWYiOnsicHJlZmVycmVkIjpudWxsLCJhbGwiOlsiMzE1Mjc1Il19LCJXaWtpZGF0YSI6eyJwcmVmZXJyZWQiOm51bGwsImFsbCI6WyJRMTUzMDA2Il19LCJHUklEIjp7InByZWZlcnJlZCI6ImdyaWQuMTQwOTUuMzkiLCJhbGwiOiJncmlkLjE0MDk1LjM5In19fV0sIm1ldGEiOnsidHlwZXMiOlt7ImlkIjoiZWR1Y2F0aW9uIiwidGl0bGUiOiJFZHVjYXRpb24iLCJjb3VudCI6MX1dLCJjb3VudHJpZXMiOlt7ImlkIjoiZGUiLCJ0aXRsZSI6IkZlZGVyYWwgUmVwdWJsaWMgb2YgR2VybWFueSIsImNvdW50IjoxfV19fQ== + http_version: null + recorded_at: Sun, 29 Mar 2020 19:52:14 GMT +recorded_with: VCR 5.1.0 diff --git a/spec/graphql/types/data_catalog_type_spec.rb b/spec/graphql/types/data_catalog_type_spec.rb index 26f57fc7d..0b18ae83c 100644 --- a/spec/graphql/types/data_catalog_type_spec.rb +++ b/spec/graphql/types/data_catalog_type_spec.rb @@ -1,16 +1,19 @@ -# require "rails_helper" +require "rails_helper" -# describe DataCatalogType do -# describe "fields" do -# subject { described_class } +describe DataCatalogType do + describe "fields" do + subject { described_class } -# it { is_expected.to have_field(:id).of_type(!types.ID) } -# it { is_expected.to have_field(:type).of_type("String!") } -# # it { is_expected.to have_field(:name).of_type("[Person!]") } -# # it { is_expected.to have_field(:alternateName).of_type("[Title!]") } -# # it { is_expected.to have_field(:description).of_type("Int") } -# # it { is_expected.to have_field(:certicates).of_type("String") } -# # it { is_expected.to have_field(:subjects).of_type("String") } -# # it { is_expected.to have_field(:datasets).of_type("String") } -# end -# end + it { is_expected.to have_field(:id).of_type(!types.ID) } + it { is_expected.to have_field(:type).of_type("String!") } + it { is_expected.to have_field(:name).of_type("String") } + it { is_expected.to have_field(:alternateName).of_type("[String!]") } + it { is_expected.to have_field(:description).of_type("String") } + it { is_expected.to have_field(:certificates).of_type("[DefinedTerm!]") } + it { is_expected.to have_field(:subjects).of_type("[DefinedTerm!]") } + it { is_expected.to have_field(:citationCount).of_type("Int") } + it { is_expected.to have_field(:viewCount).of_type("Int") } + it { is_expected.to have_field(:downloadCount).of_type("Int") } + it { is_expected.to have_field(:datasets).of_type("DatasetConnectionWithMeta") } + end +end diff --git a/spec/graphql/types/funder_type_spec.rb b/spec/graphql/types/funder_type_spec.rb index 3d57ac5e8..e1d021053 100644 --- a/spec/graphql/types/funder_type_spec.rb +++ b/spec/graphql/types/funder_type_spec.rb @@ -8,6 +8,12 @@ it { is_expected.to have_field(:type).of_type("String!") } it { is_expected.to have_field(:name).of_type("String!") } it { is_expected.to have_field(:alternateName).of_type("[String!]") } - it { is_expected.to have_field(:datasets).of_type("FunderDatasetConnectionWithMeta!") } + it { is_expected.to have_field(:citationCount).of_type("Int") } + it { is_expected.to have_field(:viewCount).of_type("Int") } + it { is_expected.to have_field(:downloadCount).of_type("Int") } + it { is_expected.to have_field(:datasets).of_type("DatasetConnectionWithMeta") } + it { is_expected.to have_field(:publications).of_type("PublicationConnectionWithMeta") } + it { is_expected.to have_field(:softwares).of_type("SoftwareConnectionWithMeta") } + it { is_expected.to have_field(:works).of_type("WorkConnectionWithMeta") } end end diff --git a/spec/graphql/types/organization_type_spec.rb b/spec/graphql/types/organization_type_spec.rb new file mode 100644 index 000000000..6a184c90e --- /dev/null +++ b/spec/graphql/types/organization_type_spec.rb @@ -0,0 +1,19 @@ +require "rails_helper" + +describe OrganizationType do + describe "fields" do + subject { described_class } + + it { is_expected.to have_field(:id).of_type(types.ID) } + it { is_expected.to have_field(:type).of_type("String!") } + it { is_expected.to have_field(:name).of_type("String!") } + it { is_expected.to have_field(:alternateName).of_type("[String!]") } + it { is_expected.to have_field(:citationCount).of_type("Int") } + it { is_expected.to have_field(:viewCount).of_type("Int") } + it { is_expected.to have_field(:downloadCount).of_type("Int") } + it { is_expected.to have_field(:datasets).of_type("DatasetConnectionWithMeta") } + it { is_expected.to have_field(:publications).of_type("PublicationConnectionWithMeta") } + it { is_expected.to have_field(:softwares).of_type("SoftwareConnectionWithMeta") } + it { is_expected.to have_field(:works).of_type("WorkConnectionWithMeta") } + end +end diff --git a/spec/graphql/types/query_type_spec.rb b/spec/graphql/types/query_type_spec.rb index e6417f7be..9c913bc70 100644 --- a/spec/graphql/types/query_type_spec.rb +++ b/spec/graphql/types/query_type_spec.rb @@ -144,7 +144,7 @@ }) end - it "returns all clients" do + it "returns clients" do response = LupoSchema.execute(query).as_json expect(response.dig("data", "clients", "totalCount")).to eq(3) @@ -342,7 +342,7 @@ }) end - it "returns all datasets" do + it "returns datasets" do response = LupoSchema.execute(query).as_json expect(response.dig("data", "datasets", "totalCount")).to eq(3) @@ -352,6 +352,67 @@ end end + describe "query services", elasticsearch: true do + let(:provider) { create(:provider, symbol: "DATACITE") } + let(:client) { create(:client, symbol: "DATACITE.SERVICES", provider: provider) } + let!(:services) { create_list(:doi, 3, aasm_state: "findable", client: client, + types: { "resourceTypeGeneral" => "Service" }, titles: [{ "title" => "Test Service"}]) + } + + before do + Provider.import + Client.import + Doi.import + sleep 3 + end + + let(:query) do + %(query { + services(clientId: "datacite.services") { + totalCount + years { + id + count + } + nodes { + id + identifiers { + identifier + identifierType + } + types { + resourceTypeGeneral + } + titles { + title + }, + descriptions { + description + descriptionType + } + } + } + }) + end + + it "returns services" do + response = LupoSchema.execute(query).as_json + + expect(response.dig("data", "services", "totalCount")).to eq(3) + expect(response.dig("data", "services", "years")).to eq([{"count"=>3, "id"=>"2011"}]) + expect(response.dig("data", "services", "nodes").length).to eq(3) + + service = response.dig("data", "services", "nodes", 0) + expect(service.fetch("id")).to eq(services.first.identifier) + expect(service.fetch("identifiers")).to eq([{"identifier"=> + "Ollomo B, Durand P, Prugnolle F, Douzery EJP, Arnathau C, Nkoghe D, Leroy E, Renaud F (2009) A new malaria agent in African hominids. PLoS Pathogens 5(5): e1000446.", + "identifierType"=>nil}]) + expect(service.fetch("types")).to eq("resourceTypeGeneral"=>"Service") + expect(service.dig("titles", 0, "title")).to eq("Test Service") + expect(service.dig("descriptions", 0, "description")).to eq("Data from: A new malaria agent in African hominids.") + end + end + describe "query person", elasticsearch: true, vcr: true do let(:client) { create(:client) } let(:doi) { create(:doi, client: client, aasm_state: "findable", creators: @@ -552,4 +613,413 @@ # expect(response.dig("data", "datasets", "nodes", 0, "references").first).to eq("id"=>"https://handle.test.datacite.org/#{target_doi.doi.downcase}", "publicationYear"=>2011) # end end + + describe "find funder", elasticsearch: true, vcr: true do + let(:client) { create(:client) } + let(:doi) { create(:doi, client: client, aasm_state: "findable", funding_references: + [{ + "funderIdentifier" => "https://doi.org/10.13039/501100009053", + "funderIdentifierType" => "Crossref Funder ID", + "funderName" => "The Wellcome Trust DBT India Alliance" + }]) + } + let(:source_doi) { create(:doi, client: client, aasm_state: "findable") } + let(:source_doi2) { create(:doi, client: client, aasm_state: "findable") } + let!(:citation_event) { create(:event_for_datacite_crossref, subj_id: "https://doi.org/#{doi.doi}", obj_id: "https://doi.org/#{source_doi.doi}", relation_type_id: "is-referenced-by", occurred_at: "2015-06-13T16:14:19Z") } + let!(:citation_event2) { create(:event_for_datacite_crossref, subj_id: "https://doi.org/#{doi.doi}", obj_id: "https://doi.org/#{source_doi2.doi}", relation_type_id: "is-referenced-by", occurred_at: "2016-06-13T16:14:19Z") } + + before do + Client.import + Event.import + Doi.import + sleep 2 + end + + let(:query) do + %(query { + funder(id: "https://doi.org/10.13039/501100009053") { + id + name + alternateName + citationCount + viewCount + downloadCount + works { + totalCount + years { + title + count + } + resourceTypes { + title + count + } + nodes { + id + titles { + title + } + citationCount + } + } + } + }) + end + + it "returns funder information" do + response = LupoSchema.execute(query).as_json + + expect(response.dig("data", "funder", "id")).to eq("https://doi.org/10.13039/501100009053") + expect(response.dig("data", "funder", "name")).to eq("The Wellcome Trust DBT India Alliance") + expect(response.dig("data", "funder", "citationCount")).to eq(0) + # TODO should be 1 + expect(response.dig("data", "funder", "works", "totalCount")).to eq(3) + # expect(response.dig("data", "funder", "works", "years")).to eq([{"count"=>1, "title"=>"2011"}]) + # expect(response.dig("data", "funder", "works", "resourceTypes")).to eq([{"count"=>1, "title"=>"Dataset"}]) + # expect(response.dig("data", "funder", "works", "nodes").length).to eq(1) + + work = response.dig("data", "funder", "works", "nodes", 0) + expect(work.dig("titles", 0, "title")).to eq("Data from: A new malaria agent in African hominids.") + expect(work.dig("citationCount")).to eq(0) + end + end + + describe "query funders", elasticsearch: true, vcr: true do + let!(:dois) { create_list(:doi, 3, funding_references: + [{ + "funderIdentifier" => "https://doi.org/10.13039/501100009053", + "funderIdentifierType" => "DOI", + }]) + } + + before do + Doi.import + sleep 1 + end + + let(:query) do + %(query { + funders(query: "Wellcome Trust") { + totalCount + nodes { + id + name + alternateName + works { + totalCount + years { + title + count + } + } + } + } + }) + end + + it "returns funder information" do + response = LupoSchema.execute(query).as_json + + expect(response.dig("data", "funders", "totalCount")).to eq(4) + expect(response.dig("data", "funders", "nodes").length).to eq(4) + funder = response.dig("data", "funders", "nodes", 0) + expect(funder.fetch("id")).to eq("https://doi.org/10.13039/501100009053") + expect(funder.fetch("name")).to eq("The Wellcome Trust DBT India Alliance") + expect(funder.fetch("alternateName")).to eq(["India Alliance", "WTDBT India Alliance", "Wellcome Trust/DBT India Alliance", "Wellcome Trust DBt India Alliance"]) + expect(funder.dig("works", "totalCount")).to eq(3) + expect(funder.dig("works", "years")).to eq([{"count"=>3, "title"=>"2011"}]) + end + end + + describe "find organization", elasticsearch: true, vcr: true do + let(:client) { create(:client) } + let!(:doi) { create(:doi, client: client, aasm_state: "findable", creators: + [{ + "familyName" => "Garza", + "givenName" => "Kristian", + "name" => "Garza, Kristian", + "nameIdentifiers" => [{"nameIdentifier"=>"https://orcid.org/0000-0003-3484-6875", "nameIdentifierScheme"=>"ORCID", "schemeUri"=>"https://orcid.org"}], + "nameType" => "Personal", + "affiliation": [ + { + "name": "University of Cambridge", + "affiliationIdentifier": "https://ror.org/013meh722", + "affiliationIdentifierScheme": "ROR" + }, + ] + }]) + } + let(:source_doi) { create(:doi, client: client, aasm_state: "findable") } + let(:source_doi2) { create(:doi, client: client, aasm_state: "findable") } + let!(:citation_event) { create(:event_for_datacite_crossref, subj_id: "https://doi.org/#{doi.doi}", obj_id: "https://doi.org/#{source_doi.doi}", relation_type_id: "is-referenced-by", occurred_at: "2015-06-13T16:14:19Z") } + let!(:citation_event2) { create(:event_for_datacite_crossref, subj_id: "https://doi.org/#{doi.doi}", obj_id: "https://doi.org/#{source_doi2.doi}", relation_type_id: "is-referenced-by", occurred_at: "2016-06-13T16:14:19Z") } + + before do + Client.import + Event.import + Doi.import + sleep 2 + end + + let(:query) do + %(query { + organization(id: "https://ror.org/013meh722") { + id + name + alternateName + citationCount + viewCount + downloadCount + works { + totalCount + years { + title + count + } + resourceTypes { + title + count + } + nodes { + id + titles { + title + } + citationCount + } + } + } + }) + end + + it "returns organization information" do + response = LupoSchema.execute(query).as_json + + expect(response.dig("data", "organization", "id")).to eq("https://ror.org/013meh722") + expect(response.dig("data", "organization", "name")).to eq("University of Cambridge") + expect(response.dig("data", "organization", "alternateName")).to eq(["Cambridge University"]) + expect(response.dig("data", "organization", "citationCount")).to eq(0) + # TODO should be 1 + expect(response.dig("data", "organization", "works", "totalCount")).to eq(3) + # expect(response.dig("data", "organization", "works", "years")).to eq([{"count"=>1, "title"=>"2011"}]) + # expect(response.dig("data", "organization", "works", "resourceTypes")).to eq([{"count"=>1, "title"=>"Dataset"}]) + # expect(response.dig("data", "organization", "works", "nodes").length).to eq(1) + + work = response.dig("data", "organization", "works", "nodes", 0) + expect(work.dig("titles", 0, "title")).to eq("Data from: A new malaria agent in African hominids.") + expect(work.dig("citationCount")).to eq(0) + end + end + + describe "query organizations", elasticsearch: true, vcr: true do + let!(:dois) { create_list(:doi, 3) } + let!(:doi) { create(:doi, aasm_state: "findable", creators: + [{ + "familyName" => "Garza", + "givenName" => "Kristian", + "name" => "Garza, Kristian", + "nameIdentifiers" => [{"nameIdentifier"=>"https://orcid.org/0000-0003-3484-6875", "nameIdentifierScheme"=>"ORCID", "schemeUri"=>"https://orcid.org"}], + "nameType" => "Personal", + "affiliation": [ + { + "name": "University of Cambridge", + "affiliationIdentifier": "https://ror.org/013meh722", + "affiliationIdentifierScheme": "ROR" + }, + ] + }]) + } + + before do + Doi.import + sleep 1 + end + + let(:query) do + %(query { + organizations(query: "Cambridge University") { + totalCount + nodes { + id + name + alternateName + identifiers { + identifier + identifierType + } + works { + totalCount + years { + title + count + } + } + } + } + }) + end + + it "returns organization information" do + response = LupoSchema.execute(query).as_json + + expect(response.dig("data", "organizations", "totalCount")).to eq(10744) + expect(response.dig("data", "organizations", "nodes").length).to eq(20) + organization = response.dig("data", "organizations", "nodes", 0) + expect(organization.fetch("id")).to eq("https://ror.org/013meh722") + expect(organization.fetch("name")).to eq("University of Cambridge") + expect(organization.fetch("alternateName")).to eq(["Cambridge University"]) + expect(organization.fetch("identifiers").length).to eq(39) + expect(organization.fetch("identifiers").last).to eq("identifier"=>"http://en.wikipedia.org/wiki/University_of_Cambridge", "identifierType"=>"wikipedia") + # TODO should be 1 + expect(organization.dig("works", "totalCount")).to eq(4) + expect(organization.dig("works", "years")).to eq([{"count"=>4, "title"=>"2011"}]) + end + end + + describe "find data_catalog", elasticsearch: true, vcr: true do + let(:client) { create(:client, re3data_id: "10.17616/r3xs37") } + let(:doi) { create(:doi, client: client, aasm_state: "findable") } + let(:source_doi) { create(:doi, client: client, aasm_state: "findable") } + let(:source_doi2) { create(:doi, client: client, aasm_state: "findable") } + let!(:citation_event) { create(:event_for_datacite_crossref, subj_id: "https://doi.org/#{doi.doi}", obj_id: "https://doi.org/#{source_doi.doi}", relation_type_id: "is-referenced-by", occurred_at: "2015-06-13T16:14:19Z") } + let!(:citation_event2) { create(:event_for_datacite_crossref, subj_id: "https://doi.org/#{doi.doi}", obj_id: "https://doi.org/#{source_doi2.doi}", relation_type_id: "is-referenced-by", occurred_at: "2016-06-13T16:14:19Z") } + + before do + Client.import + Event.import + Doi.import + sleep 2 + end + + let(:query) do + %(query { + dataCatalog(id: "https://doi.org/10.17616/r3xs37") { + id + name + alternateName + description + certificates { + termCode + name + } + softwareApplication { + name + url + softwareVersion + } + citationCount + viewCount + downloadCount + datasets { + totalCount + years { + title + count + } + nodes { + id + titles { + title + } + citationCount + } + } + } + }) + end + + it "returns data_catalog information" do + response = LupoSchema.execute(query).as_json + + expect(response.dig("data", "dataCatalog", "id")).to eq("https://doi.org/10.17616/r3xs37") + expect(response.dig("data", "dataCatalog", "name")).to eq("PANGAEA") + expect(response.dig("data", "dataCatalog", "alternateName")).to eq(["Data Publisher for Earth and Environmental Science"]) + expect(response.dig("data", "dataCatalog", "description")).to start_with("The information system PANGAEA is operated as an Open Access library") + expect(response.dig("data", "dataCatalog", "certificates")).to eq([{"termCode"=>nil, "name"=>"CoreTrustSeal"}]) + expect(response.dig("data", "dataCatalog", "softwareApplication")).to eq([{"name"=>"other", "url"=>nil, "softwareVersion"=>nil}]) + expect(response.dig("data", "dataCatalog", "citationCount")).to eq(0) + # TODO should be 1 + expect(response.dig("data", "dataCatalog", "datasets", "totalCount")).to eq(3) + # expect(response.dig("data", "funder", "works", "years")).to eq([{"count"=>1, "title"=>"2011"}]) + # expect(response.dig("data", "funder", "works", "resourceTypes")).to eq([{"count"=>1, "title"=>"Dataset"}]) + # expect(response.dig("data", "funder", "works", "nodes").length).to eq(1) + + work = response.dig("data", "dataCatalog", "datasets", "nodes", 0) + expect(work.dig("titles", 0, "title")).to eq("Data from: A new malaria agent in African hominids.") + expect(work.dig("citationCount")).to eq(0) + end + end + + describe "query data_catalogs", elasticsearch: true, vcr: true do + let!(:dois) { create_list(:doi, 3) } + let!(:doi) { create(:doi, aasm_state: "findable", creators: + [{ + "familyName" => "Garza", + "givenName" => "Kristian", + "name" => "Garza, Kristian", + "nameIdentifiers" => [{"nameIdentifier"=>"https://orcid.org/0000-0003-3484-6875", "nameIdentifierScheme"=>"ORCID", "schemeUri"=>"https://orcid.org"}], + "nameType" => "Personal", + "affiliation": [ + { + "name": "University of Cambridge", + "affiliationIdentifier": "https://ror.org/013meh722", + "affiliationIdentifierScheme": "ROR" + }, + ] + }]) + } + + before do + Doi.import + sleep 2 + end + + let(:query) do + %(query { + dataCatalogs(query: "Dataverse") { + totalCount + nodes { + id + name + alternateName + description + certificates { + termCode + name + } + softwareApplication { + name + url + softwareVersion + } + datasets { + totalCount + years { + title + count + } + } + } + } + }) + end + + it "returns data_catalog information" do + response = LupoSchema.execute(query).as_json + + expect(response.dig("data", "dataCatalogs", "totalCount")).to eq(84) + expect(response.dig("data", "dataCatalogs", "nodes").length).to eq(25) + + data_catalog = response.dig("data", "dataCatalogs", "nodes", 0) + expect(data_catalog.fetch("id")).to eq("https://doi.org/10.17616/r37h04") + expect(data_catalog.fetch("name")).to eq("AfricaRice Dataverse") + expect(data_catalog.fetch("alternateName")).to eq(["Rice science at the service of Africa", "la science rizicole au service de l'Afrique"]) + expect(data_catalog.fetch("description")).to start_with("AfricaRice is a leading pan-African rice research organization") + expect(data_catalog.fetch("certificates")).to be_empty + expect(data_catalog.fetch("softwareApplication")).to eq([{"name"=>"DataVerse", "softwareVersion"=>nil, "url"=>nil}]) + # TODO should be 1 + expect(data_catalog.dig("datasets", "totalCount")).to eq(4) + # expect(data_catalog.dig("datasets", "years")).to eq([{"count"=>4, "title"=>"2011"}]) + end + end end diff --git a/spec/graphql/types/service_type_spec.rb b/spec/graphql/types/service_type_spec.rb new file mode 100644 index 000000000..c403cc24e --- /dev/null +++ b/spec/graphql/types/service_type_spec.rb @@ -0,0 +1,10 @@ +require "rails_helper" + +describe ServiceType do + describe "fields" do + subject { described_class } + + it { is_expected.to have_field(:id).of_type(!types.ID) } + it { is_expected.to have_field(:type).of_type("String!") } + end +end diff --git a/spec/requests/dois_spec.rb b/spec/requests/dois_spec.rb index 71c02b112..da71a25a1 100644 --- a/spec/requests/dois_spec.rb +++ b/spec/requests/dois_spec.rb @@ -6,7 +6,7 @@ let(:admin_headers) { { "HTTP_ACCEPT" => "application/vnd.api+json", "HTTP_AUTHORIZATION" => "Bearer " + admin_bearer} } let(:provider) { create(:provider, symbol: "DATACITE") } - let(:client) { create(:client, provider: provider, symbol: ENV['MDS_USERNAME'], password: ENV['MDS_PASSWORD']) } + let(:client) { create(:client, provider: provider, symbol: ENV['MDS_USERNAME'], password: ENV['MDS_PASSWORD'], re3data_id: "10.17616/r3xs37") } let!(:prefix) { create(:prefix, uid: "10.14454") } let!(:client_prefix) { create(:client_prefix, client: client, prefix: prefix) } @@ -50,6 +50,116 @@ end end end + + describe "GET /dois with query", elasticsearch: true do + let!(:doi) { create(:doi, client: client, aasm_state: "findable", creators: + [{ + "familyName" => "Garza", + "givenName" => "Kristian", + "name" => "Garza, Kristian", + "nameIdentifiers" => [{"nameIdentifier"=>"https://orcid.org/0000-0003-3484-6875", "nameIdentifierScheme"=>"ORCID", "schemeUri"=>"https://orcid.org"}], + "nameType" => "Personal", + "affiliation": [ + { + "name": "Freie Universität Berlin", + "affiliationIdentifier": "https://ror.org/046ak2485", + "affiliationIdentifierScheme": "ROR" + }, + ] + }], funding_references: + [{ + "funderIdentifier" => "https://doi.org/10.13039/501100009053", + "funderIdentifierType" => "Crossref Funder ID", + "funderName" => "The Wellcome Trust DBT India Alliance" + }]) + } + let!(:dois) { create_list(:doi, 3, client: client, aasm_state: "findable") } + + before do + Doi.import + sleep 2 + end + + it 'returns dois with short orcid id', vcr: true do + get "/dois?user-id=0000-0003-3484-6875", nil, headers + + expect(last_response.status).to eq(200) + expect(json.dig('meta', 'total')).to eq(1) + expect(json.dig('data', 0, 'attributes', 'creators')).to eq([{"name"=>"Garza, Kristian", "nameType"=>"Personal", "givenName"=>"Kristian", "familyName"=>"Garza", "affiliation"=>["Freie Universität Berlin"], "nameIdentifiers"=>[{"schemeUri"=>"https://orcid.org", "nameIdentifier"=>"https://orcid.org/0000-0003-3484-6875", "nameIdentifierScheme"=>"ORCID"}]}]) + end + + it 'returns dois with orcid id', vcr: true do + get "/dois?user-id=orcid.org/0000-0003-3484-6875", nil, headers + + expect(last_response.status).to eq(200) + expect(json.dig('meta', 'total')).to eq(1) + expect(json.dig('data', 0, 'attributes', 'creators')).to eq([{"name"=>"Garza, Kristian", "nameType"=>"Personal", "givenName"=>"Kristian", "familyName"=>"Garza", "affiliation"=>["Freie Universität Berlin"], "nameIdentifiers"=>[{"schemeUri"=>"https://orcid.org", "nameIdentifier"=>"https://orcid.org/0000-0003-3484-6875", "nameIdentifierScheme"=>"ORCID"}]}]) + end + + it 'returns dois with orcid id as url', vcr: true do + get "/dois?user-id=https://orcid.org/0000-0003-3484-6875", nil, headers + + expect(last_response.status).to eq(200) + expect(json.dig('meta', 'total')).to eq(1) + expect(json.dig('data', 0, 'attributes', 'creators')).to eq([{"name"=>"Garza, Kristian", "nameType"=>"Personal", "givenName"=>"Kristian", "familyName"=>"Garza", "affiliation"=>["Freie Universität Berlin"], "nameIdentifiers"=>[{"schemeUri"=>"https://orcid.org", "nameIdentifier"=>"https://orcid.org/0000-0003-3484-6875", "nameIdentifierScheme"=>"ORCID"}]}]) + end + + it 'returns dois with crossref funder id', vcr: true do + get "/dois?funder-id=10.13039/501100009053", nil, headers + + expect(last_response.status).to eq(200) + expect(json.dig('meta', 'total')).to eq(1) + expect(json.dig('data', 0, 'attributes', 'fundingReferences')).to eq([{"funderIdentifier"=>"https://doi.org/10.13039/501100009053", "funderIdentifierType"=>"Crossref Funder ID", "funderName"=>"The Wellcome Trust DBT India Alliance"}]) + end + + it 'returns dois with crossref funder id as url', vcr: true do + get "/dois?funder-id=https://doi.org/10.13039/501100009053", nil, headers + + expect(last_response.status).to eq(200) + expect(json.dig('meta', 'total')).to eq(1) + expect(json.dig('data', 0, 'attributes', 'fundingReferences')).to eq([{"funderIdentifier"=>"https://doi.org/10.13039/501100009053", "funderIdentifierType"=>"Crossref Funder ID", "funderName"=>"The Wellcome Trust DBT India Alliance"}]) + end + + it 'returns dois with short ror id', vcr: true do + get "/dois?affiliation-id=046ak2485&affiliation=true", nil, headers + + expect(last_response.status).to eq(200) + expect(json.dig('meta', 'total')).to eq(1) + expect(json.dig('data', 0, 'attributes', 'creators')).to eq([{"name"=>"Garza, Kristian", "nameType"=>"Personal", "givenName"=>"Kristian", "familyName"=>"Garza", "affiliation"=>[{"name"=>"Freie Universität Berlin", "affiliationIdentifier"=>"https://ror.org/046ak2485", "affiliationIdentifierScheme"=>"ROR"}], "nameIdentifiers"=>[{"schemeUri"=>"https://orcid.org", "nameIdentifier"=>"https://orcid.org/0000-0003-3484-6875", "nameIdentifierScheme"=>"ORCID"}]}]) + end + + it 'returns dois with ror id', vcr: true do + get "/dois?affiliation-id=ror.org/046ak2485&affiliation=true", nil, headers + + expect(last_response.status).to eq(200) + expect(json.dig('meta', 'total')).to eq(1) + expect(json.dig('data', 0, 'attributes', 'creators')).to eq([{"name"=>"Garza, Kristian", "nameType"=>"Personal", "givenName"=>"Kristian", "familyName"=>"Garza", "affiliation"=>[{"name"=>"Freie Universität Berlin", "affiliationIdentifier"=>"https://ror.org/046ak2485", "affiliationIdentifierScheme"=>"ROR"}], "nameIdentifiers"=>[{"schemeUri"=>"https://orcid.org", "nameIdentifier"=>"https://orcid.org/0000-0003-3484-6875", "nameIdentifierScheme"=>"ORCID"}]}]) + end + + it 'returns dois with ror id as url', vcr: true do + get "/dois?affiliation-id=https://ror.org/046ak2485&affiliation=true", nil, headers + + expect(last_response.status).to eq(200) + expect(json.dig('meta', 'total')).to eq(1) + expect(json.dig('data', 0, 'attributes', 'creators')).to eq([{"name"=>"Garza, Kristian", "nameType"=>"Personal", "givenName"=>"Kristian", "familyName"=>"Garza", "affiliation"=>[{"name"=>"Freie Universität Berlin", "affiliationIdentifier"=>"https://ror.org/046ak2485", "affiliationIdentifierScheme"=>"ROR"}], "nameIdentifiers"=>[{"schemeUri"=>"https://orcid.org", "nameIdentifier"=>"https://orcid.org/0000-0003-3484-6875", "nameIdentifierScheme"=>"ORCID"}]}]) + end + + # it 'returns dois with re3data id', vcr: true do + # get "/dois?re3data-id=10.17616/R3XS37&include=client", nil, headers + + # expect(last_response.status).to eq(200) + # expect(json.dig('meta', 'total')).to eq(4) + # expect(json.dig('included', 0, 'attributes', "re3data")).to eq("https://doi.org/10.17616/r3xs37") + # end + + # it 'returns dois with re3data id as url', vcr: true do + # get "/dois?re3data-id=https://doi.org/10.17616/R3XS37&include=client", nil, headers + + # expect(last_response.status).to eq(200) + # expect(json.dig('meta', 'total')).to eq(1) + # expect(json.dig('included', 0, 'attributes')).to eq([{"name"=>"Garza, Kristian", "nameType"=>"Personal", "givenName"=>"Kristian", "familyName"=>"Garza", "affiliation"=>[{"name"=>"Freie Universität Berlin", "affiliationIdentifier"=>"https://ror.org/046ak2485", "affiliationIdentifierScheme"=>"ROR"}], "nameIdentifiers"=>[{"schemeUri"=>"https://orcid.org", "nameIdentifier"=>"https://orcid.org/0000-0003-3484-6875", "nameIdentifierScheme"=>"ORCID"}]}]) + # end + end describe 'GET /dois/:id', elasticsearch: true do let!(:doi) { create(:doi, client: client) }