diff --git a/modules/wikis/app/contracts/wikis/adapters/input/page_info_contract.rb b/modules/wikis/app/contracts/wikis/adapters/input/page_info_contract.rb index 6db6b5955018..2e35b418b980 100644 --- a/modules/wikis/app/contracts/wikis/adapters/input/page_info_contract.rb +++ b/modules/wikis/app/contracts/wikis/adapters/input/page_info_contract.rb @@ -34,6 +34,7 @@ module Input class PageInfoContract < DryApplicationContract params do required(:identifier).filled(:string) + optional(:access_token).maybe(:string) end end end diff --git a/modules/wikis/app/models/wikis/adapters/input/page_info.rb b/modules/wikis/app/models/wikis/adapters/input/page_info.rb index acda2d6052a8..30ee75c8fd23 100644 --- a/modules/wikis/app/models/wikis/adapters/input/page_info.rb +++ b/modules/wikis/app/models/wikis/adapters/input/page_info.rb @@ -29,11 +29,11 @@ #++ module Wikis::Adapters::Input - PageInfo = Data.define(:identifier) do + PageInfo = Data.define(:identifier, :access_token) do private_class_method :new - def self.build(identifier:, contract: PageInfoContract.new) - contract.call(identifier:).to_monad.fmap { new(**it.to_h) } + def self.build(identifier:, access_token: nil, contract: PageInfoContract.new) + contract.call(identifier:, access_token:).to_monad.fmap { new(**it.to_h) } end end end diff --git a/modules/wikis/app/models/wikis/adapters/input/user_query.rb b/modules/wikis/app/models/wikis/adapters/input/user.rb similarity index 96% rename from modules/wikis/app/models/wikis/adapters/input/user_query.rb rename to modules/wikis/app/models/wikis/adapters/input/user.rb index d567bb919de2..a43884431af5 100644 --- a/modules/wikis/app/models/wikis/adapters/input/user_query.rb +++ b/modules/wikis/app/models/wikis/adapters/input/user.rb @@ -29,5 +29,5 @@ #++ module Wikis::Adapters::Input - UserQuery = Data.define(:access_token) + User = Data.define(:access_token) end diff --git a/modules/wikis/app/models/wikis/adapters/results/page_info.rb b/modules/wikis/app/models/wikis/adapters/results/page_info.rb index e887846e2402..475a00dcd0a9 100644 --- a/modules/wikis/app/models/wikis/adapters/results/page_info.rb +++ b/modules/wikis/app/models/wikis/adapters/results/page_info.rb @@ -29,5 +29,5 @@ #++ module Wikis::Adapters::Results - PageInfo = Data.define(:identifier, :provider, :title, :href) + PageInfo = Data.define(:identifier, :title, :href) end diff --git a/modules/wikis/app/models/wikis/provider.rb b/modules/wikis/app/models/wikis/provider.rb index 0911dfaba8b3..c20d16009cfd 100644 --- a/modules/wikis/app/models/wikis/provider.rb +++ b/modules/wikis/app/models/wikis/provider.rb @@ -49,6 +49,7 @@ class Provider < ApplicationRecord def to_s = self.class.registry_prefix def user_connected?(_user) = raise SubclassResponsibilityError + def user_access_token(_user) = nil class << self def registry_prefix = raise SubclassResponsibilityError diff --git a/modules/wikis/app/models/wikis/xwiki_provider.rb b/modules/wikis/app/models/wikis/xwiki_provider.rb index bf2c980bf830..6c3e2d05d690 100644 --- a/modules/wikis/app/models/wikis/xwiki_provider.rb +++ b/modules/wikis/app/models/wikis/xwiki_provider.rb @@ -54,8 +54,12 @@ def user_connected?(user) OAuthClientToken.for_user_and_client(user, oauth_client).exists? end + def user_access_token(user) + OAuthClientToken.find_by(user:, oauth_client:)&.access_token + end + def extract_origin_user_id(token) - resolve("queries.user").call(Wikis::Adapters::Input::UserQuery.new(access_token: token.access_token)) + resolve("queries.user").call(Wikis::Adapters::Input::User.new(access_token: token.access_token)) end def authenticate_via_two_way_oauth2? diff --git a/modules/wikis/app/services/wikis/adapters/base_query.rb b/modules/wikis/app/services/wikis/adapters/base_query.rb index 1d214afcd66f..98b8182adcae 100644 --- a/modules/wikis/app/services/wikis/adapters/base_query.rb +++ b/modules/wikis/app/services/wikis/adapters/base_query.rb @@ -48,6 +48,10 @@ def success(result) Success(result) end + def bearer_http(token) + token.present? ? OpenProject.httpx.bearer_auth(token) : OpenProject.httpx + end + def failure(code:) Failure(Results::Error.new(source: self.class, code:)) end diff --git a/modules/wikis/app/services/wikis/adapters/providers/internal/queries/page_info.rb b/modules/wikis/app/services/wikis/adapters/providers/internal/queries/page_info.rb index 6356e00a5937..6a8792db221a 100644 --- a/modules/wikis/app/services/wikis/adapters/providers/internal/queries/page_info.rb +++ b/modules/wikis/app/services/wikis/adapters/providers/internal/queries/page_info.rb @@ -42,7 +42,6 @@ def call(input_data) success( Results::PageInfo.new( identifier: input_data.identifier, - provider:, title: wiki_page.title, href: url_for(only_path: true, controller: "/wiki", diff --git a/modules/wikis/app/services/wikis/adapters/providers/xwiki/page_reference.rb b/modules/wikis/app/services/wikis/adapters/providers/xwiki/page_reference.rb new file mode 100644 index 000000000000..bbbb0d1a981f --- /dev/null +++ b/modules/wikis/app/services/wikis/adapters/providers/xwiki/page_reference.rb @@ -0,0 +1,58 @@ +# frozen_string_literal: true + +#-- copyright +# OpenProject is an open source project management software. +# Copyright (C) the OpenProject GmbH +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License version 3. +# +# OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows: +# Copyright (C) 2006-2013 Jean-Philippe Lang +# Copyright (C) 2010-2013 the ChiliProject Team +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# See COPYRIGHT and LICENSE files for more details. +#++ + +module Wikis + module Adapters + module Providers + module XWiki + # Represents a parsed XWiki stable page identifier in canonical document reference format: + # "wikiName:Space1.Space2.PageName" — e.g. "xwiki:Main.WebHome" + # Maps to the REST API path: /wikis/{wiki}/spaces/{s1}/spaces/{s2}/pages/{page} + PageReference = Data.define(:wiki, :spaces, :page) do + def self.parse(identifier) + wiki, page_path = identifier.split(":", 2) + return nil if page_path.blank? + + parts = page_path.split(".") + page = parts.pop + return nil if parts.empty? + + new(wiki:, spaces: parts, page:) + end + + def rest_path + spaces_path = spaces.map { "/spaces/#{CGI.escapeURIComponent(it)}" }.join + "/wikis/#{CGI.escapeURIComponent(wiki)}#{spaces_path}/pages/#{CGI.escapeURIComponent(page)}" + end + end + end + end + end +end diff --git a/modules/wikis/app/services/wikis/adapters/providers/xwiki/queries/page_info.rb b/modules/wikis/app/services/wikis/adapters/providers/xwiki/queries/page_info.rb index 4fa7e995e742..584011b15b08 100644 --- a/modules/wikis/app/services/wikis/adapters/providers/xwiki/queries/page_info.rb +++ b/modules/wikis/app/services/wikis/adapters/providers/xwiki/queries/page_info.rb @@ -34,26 +34,47 @@ module Providers module XWiki module Queries class PageInfo < BaseQuery + JSON_ACCEPT_HEADERS = { "Accept" => "application/json" }.freeze + def call(input_data) - titles = [ - "What makes XWiki special?", - "API documentation", - "A brief introduction on configuring your own XWiki instance and connect it to OpenProject.", - "Security considerations for API design", - "Syntax overview", - "Getting help", - "Enterprise support" - ] - title = titles[Random.new(input_data.identifier.hash).rand(titles.size)] + ref = PageReference.parse(input_data.identifier) + return failure(code: :not_found) unless ref + + url = "#{provider.url.chomp('/')}/rest#{ref.rest_path}" + handle_response( + bearer_http(input_data.access_token).with(headers: JSON_ACCEPT_HEADERS).get(url), + identifier: input_data.identifier + ) + end + + private + + def handle_response(response, identifier:) + return failure(code: :connection_error) if response.is_a?(HTTPX::ErrorResponse) + + case response + in { status: 200..299 } + handle_success_response(response, identifier:) + in { status: 401 | 403 } + failure(code: :unauthorized) + in { status: 404 } + failure(code: :not_found) + else + failure(code: :request_failed) + end + end + def handle_success_response(response, identifier:) + data = JSON.parse(response.body.to_s) success( Results::PageInfo.new( - identifier: input_data.identifier, - provider:, - title:, - href: "#" + identifier:, + title: data["title"], + href: data["xwikiAbsoluteUrl"] ) ) + rescue JSON::ParserError + failure(code: :request_failed) end end end diff --git a/modules/wikis/app/services/wikis/adapters/providers/xwiki/queries/referencing_pages.rb b/modules/wikis/app/services/wikis/adapters/providers/xwiki/queries/referencing_pages.rb index 97772c13e08b..103b39e7a203 100644 --- a/modules/wikis/app/services/wikis/adapters/providers/xwiki/queries/referencing_pages.rb +++ b/modules/wikis/app/services/wikis/adapters/providers/xwiki/queries/referencing_pages.rb @@ -46,8 +46,8 @@ def call(input_data) results = [] if input_data.linkable.id % 2 == 0 - results << Success(Results::PageInfo.new(identifier: "1337", provider:, title: title.sample, href: "#")) - results << Success(Results::PageInfo.new(identifier: "1338", provider:, title: title.sample, href: "#")) + results << Success(Results::PageInfo.new(identifier: "1337", title: title.sample, href: "#")) + results << Success(Results::PageInfo.new(identifier: "1338", title: title.sample, href: "#")) end success(results) diff --git a/modules/wikis/app/services/wikis/adapters/providers/xwiki/queries/relation_page_links.rb b/modules/wikis/app/services/wikis/adapters/providers/xwiki/queries/relation_page_links.rb index 524270c712b7..98af973ce460 100644 --- a/modules/wikis/app/services/wikis/adapters/providers/xwiki/queries/relation_page_links.rb +++ b/modules/wikis/app/services/wikis/adapters/providers/xwiki/queries/relation_page_links.rb @@ -46,9 +46,9 @@ def call(input_data) # rubocop:disable Metrics/AbcSize results = [] if input_data.linkable.id % 2 == 1 - results << Success(Results::PageInfo.new(identifier: "1337", provider:, title: title.sample, href: "#")) - results << Success(Results::PageInfo.new(identifier: "1338", provider:, title: title.sample, href: "#")) - results << Success(Results::PageInfo.new(identifier: "1338", provider:, title: title.sample, href: "#")) + results << Success(Results::PageInfo.new(identifier: "1337", title: title.sample, href: "#")) + results << Success(Results::PageInfo.new(identifier: "1338", title: title.sample, href: "#")) + results << Success(Results::PageInfo.new(identifier: "1338", title: title.sample, href: "#")) end success(results) diff --git a/modules/wikis/app/services/wikis/adapters/providers/xwiki/queries/user_query.rb b/modules/wikis/app/services/wikis/adapters/providers/xwiki/queries/user.rb similarity index 93% rename from modules/wikis/app/services/wikis/adapters/providers/xwiki/queries/user_query.rb rename to modules/wikis/app/services/wikis/adapters/providers/xwiki/queries/user.rb index 6e10dbd9722f..3afa6990e127 100644 --- a/modules/wikis/app/services/wikis/adapters/providers/xwiki/queries/user_query.rb +++ b/modules/wikis/app/services/wikis/adapters/providers/xwiki/queries/user.rb @@ -33,10 +33,10 @@ module Adapters module Providers module XWiki module Queries - class UserQuery < BaseQuery + class User < BaseQuery def call(input_data) url = "#{provider.url.chomp('/')}/rest/" - handle_response(OpenProject.httpx.bearer_auth(input_data.access_token).get(url)) + handle_response(bearer_http(input_data.access_token).get(url)) end private diff --git a/modules/wikis/app/services/wikis/adapters/providers/xwiki/registry.rb b/modules/wikis/app/services/wikis/adapters/providers/xwiki/registry.rb index d05f417febfd..c34b844de1d2 100644 --- a/modules/wikis/app/services/wikis/adapters/providers/xwiki/registry.rb +++ b/modules/wikis/app/services/wikis/adapters/providers/xwiki/registry.rb @@ -60,7 +60,7 @@ module XWiki end namespace("queries") do - register(:user, Queries::UserQuery) + register(:user, Queries::User) register(:page_info, Queries::PageInfo) register(:referencing_pages, Queries::ReferencingPages) register(:relation_page_links, Queries::RelationPageLinks) diff --git a/modules/wikis/app/services/wikis/page_link_service.rb b/modules/wikis/app/services/wikis/page_link_service.rb index 3445b22c038b..03df1a78b4e5 100644 --- a/modules/wikis/app/services/wikis/page_link_service.rb +++ b/modules/wikis/app/services/wikis/page_link_service.rb @@ -75,7 +75,8 @@ def referencing_wiki_page_infos_for(linkable:) private def page_info(provider:, identifier:) - Adapters::Input::PageInfo.build(identifier:).bind { provider.resolve("queries.page_info").call(it) } + access_token = provider.user_access_token(User.current) + Adapters::Input::PageInfo.build(identifier:, access_token:).bind { provider.resolve("queries.page_info").call(it) } end def page_title_service diff --git a/modules/wikis/spec/components/wikis/relation_page_links_component_spec.rb b/modules/wikis/spec/components/wikis/relation_page_links_component_spec.rb index 82afda088312..dd0a0875cedf 100644 --- a/modules/wikis/spec/components/wikis/relation_page_links_component_spec.rb +++ b/modules/wikis/spec/components/wikis/relation_page_links_component_spec.rb @@ -90,7 +90,6 @@ let(:page_info) do Wikis::Adapters::Results::PageInfo.new( identifier: "MyPage", - provider:, title: "My Wiki Page", href: "https://wiki.example.com/MyPage" ) diff --git a/modules/wikis/spec/services/wikis/adapters/providers/xwiki/page_reference_spec.rb b/modules/wikis/spec/services/wikis/adapters/providers/xwiki/page_reference_spec.rb new file mode 100644 index 000000000000..a9465e38cd84 --- /dev/null +++ b/modules/wikis/spec/services/wikis/adapters/providers/xwiki/page_reference_spec.rb @@ -0,0 +1,90 @@ +# frozen_string_literal: true + +#-- copyright +# OpenProject is an open source project management software. +# Copyright (C) the OpenProject GmbH +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License version 3. +# +# OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows: +# Copyright (C) 2006-2013 Jean-Philippe Lang +# Copyright (C) 2010-2013 the ChiliProject Team +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# See COPYRIGHT and LICENSE files for more details. +#++ + +require "spec_helper" +require_module_spec_helper + +RSpec.describe Wikis::Adapters::Providers::XWiki::PageReference do + describe ".parse" do + subject { described_class.parse(identifier) } + + context "with a standard identifier" do + let(:identifier) { "xwiki:Main.WebHome" } + + it { is_expected.to have_attributes(wiki: "xwiki", spaces: ["Main"], page: "WebHome") } + end + + context "with a nested space identifier" do + let(:identifier) { "xwiki:MySpace.SubSpace.PageName" } + + it { is_expected.to have_attributes(wiki: "xwiki", spaces: %w[MySpace SubSpace], page: "PageName") } + end + + context "without a colon separator" do + let(:identifier) { "Main.WebHome" } + + it { is_expected.to be_nil } + end + + context "with a blank page path" do + let(:identifier) { "xwiki:" } + + it { is_expected.to be_nil } + end + + context "without a space segment" do + let(:identifier) { "xwiki:WebHome" } + + it { is_expected.to be_nil } + end + end + + describe "#rest_path" do + subject { described_class.parse(identifier).rest_path } + + context "with a single-space identifier" do + let(:identifier) { "xwiki:Main.WebHome" } + + it { is_expected.to eq("/wikis/xwiki/spaces/Main/pages/WebHome") } + end + + context "with a nested-space identifier" do + let(:identifier) { "xwiki:MySpace.SubSpace.PageName" } + + it { is_expected.to eq("/wikis/xwiki/spaces/MySpace/spaces/SubSpace/pages/PageName") } + end + + context "with special characters in segments" do + let(:identifier) { "xwiki:My Space.My Page" } + + it { is_expected.to eq("/wikis/xwiki/spaces/My%20Space/pages/My%20Page") } + end + end +end diff --git a/modules/wikis/spec/services/wikis/adapters/providers/xwiki/queries/page_info_spec.rb b/modules/wikis/spec/services/wikis/adapters/providers/xwiki/queries/page_info_spec.rb new file mode 100644 index 000000000000..426d2baa31a5 --- /dev/null +++ b/modules/wikis/spec/services/wikis/adapters/providers/xwiki/queries/page_info_spec.rb @@ -0,0 +1,181 @@ +# frozen_string_literal: true + +#-- copyright +# OpenProject is an open source project management software. +# Copyright (C) the OpenProject GmbH +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License version 3. +# +# OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows: +# Copyright (C) 2006-2013 Jean-Philippe Lang +# Copyright (C) 2010-2013 the ChiliProject Team +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# See COPYRIGHT and LICENSE files for more details. +#++ + +require "spec_helper" +require_module_spec_helper + +RSpec.describe Wikis::Adapters::Providers::XWiki::Queries::PageInfo, :webmock do + let(:wiki_provider) { build_stubbed(:xwiki_provider, url: "https://xwiki.example.com/") } + let(:identifier) { "xwiki:Main.WebHome" } + let(:page_url) { "https://xwiki.example.com/rest/wikis/xwiki/spaces/Main/pages/WebHome" } + let(:access_token) { nil } + let(:input_data) { Wikis::Adapters::Input::PageInfo.build(identifier:, access_token:).value! } + + subject(:query) { described_class.new(model: wiki_provider) } + + it "is registered" do + expect(Wikis::Adapters::Registry.resolve("xwiki.queries.page_info")).to eq(described_class) + end + + describe "#call" do + let(:page_response) do + { + "id" => identifier, + "title" => "Home", + "xwikiAbsoluteUrl" => "https://xwiki.example.com/bin/view/Main/" + }.to_json + end + + context "when the page exists (unauthenticated)" do + before do + stub_request(:get, page_url) + .to_return(status: 200, body: page_response, headers: { "Content-Type" => "application/json" }) + end + + it "returns Success with title and href" do + result = query.call(input_data) + expect(result).to be_success + expect(result.value!).to have_attributes( + identifier:, + title: "Home", + href: "https://xwiki.example.com/bin/view/Main/" + ) + end + end + + context "when an access token is provided" do + let(:access_token) { "user-bearer-token" } + + before do + stub_request(:get, page_url) + .with(headers: { "Authorization" => "Bearer user-bearer-token" }) + .to_return(status: 200, body: page_response, headers: { "Content-Type" => "application/json" }) + end + + it "sends the bearer token and returns Success" do + result = query.call(input_data) + expect(result).to be_success + expect(result.value!).to have_attributes(title: "Home") + end + end + + context "with a nested space identifier" do + let(:identifier) { "xwiki:MySpace.SubSpace.PageName" } + let(:page_url) { "https://xwiki.example.com/rest/wikis/xwiki/spaces/MySpace/spaces/SubSpace/pages/PageName" } + let(:absolute_url) { "https://xwiki.example.com/bin/view/MySpace/SubSpace/PageName" } + + before do + stub_request(:get, page_url) + .to_return(status: 200, body: { "title" => "Nested Page", + "xwikiAbsoluteUrl" => absolute_url }.to_json, + headers: { "Content-Type" => "application/json" }) + end + + it "resolves the nested space URL correctly" do + result = query.call(input_data) + expect(result).to be_success + expect(result.value!).to have_attributes(title: "Nested Page") + end + end + + context "when the identifier is not a valid XWiki reference" do + let(:identifier) { "Main.WebHome" } + + it "returns Failure with :not_found code without making an HTTP request" do + result = query.call(input_data) + expect(result).to be_failure + expect(result.failure).to have_attributes(code: :not_found) + end + end + + context "when the page is not found" do + before { stub_request(:get, page_url).to_return(status: 404, body: "") } + + it "returns Failure with :not_found code" do + result = query.call(input_data) + expect(result).to be_failure + expect(result.failure).to have_attributes(code: :not_found) + end + end + + context "when access is unauthorized" do + before { stub_request(:get, page_url).to_return(status: 401, body: "") } + + it "returns Failure with :unauthorized code" do + result = query.call(input_data) + expect(result).to be_failure + expect(result.failure).to have_attributes(code: :unauthorized) + end + end + + context "when access is forbidden" do + before { stub_request(:get, page_url).to_return(status: 403, body: "") } + + it "returns Failure with :unauthorized code" do + result = query.call(input_data) + expect(result).to be_failure + expect(result.failure).to have_attributes(code: :unauthorized) + end + end + + context "when XWiki returns a non-2xx status" do + before { stub_request(:get, page_url).to_return(status: 500, body: "Internal Server Error") } + + it "returns Failure with :request_failed code" do + result = query.call(input_data) + expect(result).to be_failure + expect(result.failure).to have_attributes(code: :request_failed) + end + end + + context "when a network error occurs" do + before { stub_request(:get, page_url).to_timeout } + + it "returns Failure with :connection_error code" do + result = query.call(input_data) + expect(result).to be_failure + expect(result.failure).to have_attributes(code: :connection_error) + end + end + + context "when the response body is not valid JSON" do + before do + stub_request(:get, page_url) + .to_return(status: 200, body: "not json", headers: { "Content-Type" => "text/plain" }) + end + + it "returns Failure with :request_failed code" do + result = query.call(input_data) + expect(result).to be_failure + expect(result.failure).to have_attributes(code: :request_failed) + end + end + end +end diff --git a/modules/wikis/spec/services/wikis/adapters/providers/xwiki/queries/user_query_spec.rb b/modules/wikis/spec/services/wikis/adapters/providers/xwiki/queries/user_spec.rb similarity index 92% rename from modules/wikis/spec/services/wikis/adapters/providers/xwiki/queries/user_query_spec.rb rename to modules/wikis/spec/services/wikis/adapters/providers/xwiki/queries/user_spec.rb index ea0289699c35..205a4d29b4f4 100644 --- a/modules/wikis/spec/services/wikis/adapters/providers/xwiki/queries/user_query_spec.rb +++ b/modules/wikis/spec/services/wikis/adapters/providers/xwiki/queries/user_spec.rb @@ -31,10 +31,10 @@ require "spec_helper" require_module_spec_helper -RSpec.describe Wikis::Adapters::Providers::XWiki::Queries::UserQuery, :webmock do +RSpec.describe Wikis::Adapters::Providers::XWiki::Queries::User, :webmock do let(:wiki_provider) { build_stubbed(:xwiki_provider, url: "https://xwiki.local/") } let(:rest_url) { "https://xwiki.local/rest/" } - let(:input_data) { Wikis::Adapters::Input::UserQuery.new(access_token: "some-token") } + let(:input_data) { Wikis::Adapters::Input::User.new(access_token: "some-token") } subject(:query) { described_class.new(model: wiki_provider) } @@ -63,7 +63,7 @@ end it "returns Failure with :unauthorized code" do - result = query.call(Wikis::Adapters::Input::UserQuery.new(access_token: "invalid-token")) + result = query.call(Wikis::Adapters::Input::User.new(access_token: "invalid-token")) expect(result).to be_failure expect(result.failure).to have_attributes(code: :unauthorized) end