Skip to content

Commit

Permalink
refactor(examples): structure contexts
Browse files Browse the repository at this point in the history
  • Loading branch information
marian13 committed Jan 14, 2024
1 parent f6c238f commit 6a641c8
Show file tree
Hide file tree
Showing 13 changed files with 308 additions and 290 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@

example_group "class methods" do
describe ".result" do
context "when safe parsing is NOT successful" do
context "when `SafeParse` is NOT successful" do
context "when `string` has invalid format" do
let(:string) { "foo" }

Expand All @@ -35,7 +35,7 @@
end
end

context "when safe parsing is successful" do
context "when `SafeParse` is successful" do
let(:string) { "24-02-2022" }
let(:format) { "%d-%m-%Y" }
let(:date_time) { DateTime.strptime(string, format) }
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@

example_group "class methods" do
describe ".result" do
context "when calculation is NOT successful" do
context "when `Calculate` is NOT successful" do
context "when `number` is NOT valid" do
context "when `number` is `nil`" do
let(:number) { nil }
Expand Down Expand Up @@ -60,7 +60,7 @@
end
end

context "when calculation is successful" do
context "when `Calculate` is successful" do
let(:number) { 10 }
let(:factorial) { 10 * 9 * 8 * 7 * 6 * 5 * 4 * 3 * 2 * 1 }

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,24 +6,26 @@

# rubocop:disable RSpec/NestedGroups
RSpec.describe ConvenientService::Examples::Standard::RequestParams::Services::ApplyDefaultParamValues do
include ConvenientService::RSpec::Matchers::Results

example_group "class methods" do
describe ".result" do
include ConvenientService::RSpec::Matchers::Results

subject(:result) { described_class.result(params: params, defaults: defaults) }
context "when `ApplyDefaultParamValues` is successful" do
subject(:result) { described_class.result(params: params, defaults: defaults) }

let(:params) { {id: "1000000", title: "Check the official User Docs"} }
let(:defaults) { {tags: [], sources: []} }
let(:params) { {id: "1000000", title: "Check the official User Docs"} }
let(:defaults) { {tags: [], sources: []} }

it "returns `success` with params and defaults" do
expect(result).to be_success.with_data(params: {id: "1000000", title: "Check the official User Docs", tags: [], sources: []})
end
it "returns `success` with params and defaults" do
expect(result).to be_success.with_data(params: {id: "1000000", title: "Check the official User Docs", tags: [], sources: []})
end

context "when `params` and `defaults` have same keys" do
let(:params) { {id: "1000000", title: "Check the official User Docs", tags: ["ruby"]} }
context "when `params` and `defaults` have same keys" do
let(:params) { {id: "1000000", title: "Check the official User Docs", tags: ["ruby"]} }

it "takes value from `params`" do
expect(result).to be_success.with_data(params: {id: "1000000", title: "Check the official User Docs", tags: ["ruby"], sources: []})
it "takes value from `params`" do
expect(result).to be_success.with_data(params: {id: "1000000", title: "Check the official User Docs", tags: ["ruby"], sources: []})
end
end
end
end
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,36 +6,38 @@

# rubocop:disable RSpec/NestedGroups
RSpec.describe ConvenientService::Examples::Standard::RequestParams::Services::CastParams do
include ConvenientService::RSpec::Matchers::Results

example_group "class methods" do
describe ".result" do
include ConvenientService::RSpec::Matchers::Results

subject(:result) { described_class.result(params: original_params) }
context "when `CastParams` is successful" do
subject(:result) { described_class.result(params: original_params) }

let(:original_params) do
{
id: "1000000",
format: "html",
title: "Avoid error shadowing",
description: "Check the official User Docs",
tags: "ruby",
sources: "https://www.rubyguides.com/2019/07/ruby-instance-variables/"
}
end
let(:original_params) do
{
id: "1000000",
format: "html",
title: "Avoid error shadowing",
description: "Check the official User Docs",
tags: "ruby",
sources: "https://www.rubyguides.com/2019/07/ruby-instance-variables/"
}
end

let(:casted_params) do
{
id: ConvenientService::Examples::Standard::RequestParams::Entities::ID.cast(original_params[:id]),
format: ConvenientService::Examples::Standard::RequestParams::Entities::Format.cast(original_params[:format]),
title: ConvenientService::Examples::Standard::RequestParams::Entities::Title.cast(original_params[:title]),
description: ConvenientService::Examples::Standard::RequestParams::Entities::Description.cast(original_params[:description]),
tags: [ConvenientService::Examples::Standard::RequestParams::Entities::Tag.cast(original_params[:tags])],
sources: [ConvenientService::Examples::Standard::RequestParams::Entities::Source.cast(original_params[:sources])]
}
end
let(:casted_params) do
{
id: ConvenientService::Examples::Standard::RequestParams::Entities::ID.cast(original_params[:id]),
format: ConvenientService::Examples::Standard::RequestParams::Entities::Format.cast(original_params[:format]),
title: ConvenientService::Examples::Standard::RequestParams::Entities::Title.cast(original_params[:title]),
description: ConvenientService::Examples::Standard::RequestParams::Entities::Description.cast(original_params[:description]),
tags: [ConvenientService::Examples::Standard::RequestParams::Entities::Tag.cast(original_params[:tags])],
sources: [ConvenientService::Examples::Standard::RequestParams::Entities::Source.cast(original_params[:sources])]
}
end

it "returns `success` with original and casted params" do
expect(result).to be_success.with_data(original_params: original_params, casted_params: casted_params)
it "returns `success` with original and casted params" do
expect(result).to be_success.with_data(original_params: original_params, casted_params: casted_params)
end
end
end
end
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,80 +6,82 @@

# rubocop:disable RSpec/NestedGroups
RSpec.describe ConvenientService::Examples::Standard::RequestParams::Services::ExtractParamsFromBody do
include ConvenientService::RSpec::Matchers::Results

example_group "class methods" do
describe ".result" do
include ConvenientService::RSpec::Matchers::Results

subject(:result) { described_class.result(request: request) }

let(:request) { ConvenientService::Examples::Standard::RequestParams::Entities::Request.new(http_string: http_string) }

context "when request is NOT valid for HTTP parsing" do
let(:http_string) do
<<~TEXT
POST /rules/1000000.json HTTP/1.1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36
Host: code-review.com
Content-Type: application/json; charset=utf-8
Content-Length: 105
Accept-Language: en-us
{"title":"Avoid error shadowing","description":"Check the official User Docs","tags":["error-shadowing"]}
Accept-Encoding: gzip, deflate
Connection: Keep-Alive
TEXT
end

let(:error_message) do
<<~MESSAGE
Failed to resolve body since request is NOT HTTP parsable.
Request:
---
#{request}
---
MESSAGE
end

it "fails to parse request body" do
expect(result).to be_error.with_message(error_message)
end
end

context "when request body is NOT valid for JSON parsing" do
let(:http_string) do
<<~TEXT
POST /rules/1000000.json HTTP/1.1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36
Host: code-review.com
Content-Type: application/json; charset=utf-8
Content-Length: #{body.length}
Accept-Language: en-us
Accept-Encoding: gzip, deflate
Connection: Keep-Alive
#{body}
TEXT
end

let(:body) { "abc" }

let(:error_message) do
<<~MESSAGE
Request body contains invalid json.
Request:
---
#{request}
---
MESSAGE
context "when `ExtractParamsFromBody` is NOT successful" do
context "when request is NOT valid for HTTP parsing" do
let(:http_string) do
<<~TEXT
POST /rules/1000000.json HTTP/1.1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36
Host: code-review.com
Content-Type: application/json; charset=utf-8
Content-Length: 105
Accept-Language: en-us
{"title":"Avoid error shadowing","description":"Check the official User Docs","tags":["error-shadowing"]}
Accept-Encoding: gzip, deflate
Connection: Keep-Alive
TEXT
end

let(:error_message) do
<<~MESSAGE
Failed to resolve body since request is NOT HTTP parsable.
Request:
---
#{request}
---
MESSAGE
end

it "returns `error` with message" do
expect(result).to be_error.with_message(error_message)
end
end

it "fails to parse JSON from request body" do
expect(result).to be_error.with_message(error_message)
context "when request body is NOT valid for JSON parsing" do
let(:http_string) do
<<~TEXT
POST /rules/1000000.json HTTP/1.1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36
Host: code-review.com
Content-Type: application/json; charset=utf-8
Content-Length: #{body.length}
Accept-Language: en-us
Accept-Encoding: gzip, deflate
Connection: Keep-Alive
#{body}
TEXT
end

let(:body) { "abc" }

let(:error_message) do
<<~MESSAGE
Request body contains invalid json.
Request:
---
#{request}
---
MESSAGE
end

it "returns `error` with message" do
expect(result).to be_error.with_message(error_message)
end
end
end

context "when request body is valid for both HTTP and then JSON parsing" do
context "when `ExtractParamsFromBody` is successful" do
let(:http_string) do
<<~TEXT
POST /rules/1000000.json HTTP/1.1
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,10 +6,10 @@

# rubocop:disable RSpec/NestedGroups, RSpec/MultipleMemoizedHelpers
RSpec.describe ConvenientService::Examples::Standard::RequestParams::Services::ExtractParamsFromPath do
include ConvenientService::RSpec::Matchers::Results

example_group "class methods" do
describe ".result" do
include ConvenientService::RSpec::Matchers::Results

subject(:result) { described_class.result(request: request, pattern: pattern) }

let(:request) { ConvenientService::Examples::Standard::RequestParams::Entities::Request.new(http_string: http_string) }
Expand All @@ -31,37 +31,39 @@
TEXT
end

context "when request is NOT valid for HTTP parsing" do
let(:path) { "abc" }
context "when `ExtractParamsFromPath` is NOT successful" do
context "when request is NOT valid for HTTP parsing" do
let(:path) { "abc" }

let(:error_message) do
<<~MESSAGE
Failed to resolve path since request is NOT HTTP parsable.
let(:error_message) do
<<~MESSAGE
Failed to resolve path since request is NOT HTTP parsable.
Request:
---
#{request}
---
MESSAGE
end
Request:
---
#{request}
---
MESSAGE
end

it "fails to parse request path" do
expect(result).to be_error.with_message(error_message)
it "returns error with message" do
expect(result).to be_error.with_message(error_message)
end
end
end

context "when request path does NOT match pattern" do
let(:id) { "abc" }
let(:format) { "json" }
context "when request path does NOT match pattern" do
let(:id) { "abc" }
let(:format) { "json" }

let(:error_message) { "Path `#{path}` does NOT match pattern `#{pattern}`." }
let(:error_message) { "Path `#{path}` does NOT match pattern `#{pattern}`." }

it "fails to parse JSON from request body" do
expect(result).to be_error.with_message(error_message)
it "returns error with message" do
expect(result).to be_error.with_message(error_message)
end
end
end

context "when request path matches pattern" do
context "when `ExtractParamsFromPath` is successful" do
let(:id) { "1000000" }
let(:format) { "json" }

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,27 +6,29 @@

# rubocop:disable RSpec/NestedGroups
RSpec.describe ConvenientService::Examples::Standard::RequestParams::Services::FilterOutUnpermittedParams do
include ConvenientService::RSpec::Matchers::Results

example_group "class methods" do
describe ".result" do
include ConvenientService::RSpec::Matchers::Results

subject(:result) { described_class.result(params: params, permitted_keys: permitted_keys) }

let(:params) { {id: "1000000", title: "Check the official User Docs", verified: true} }

context "when `params` does NOT only permitted keys" do
let(:permitted_keys) { [:id, :title] }
context "when `FilterOutUnpermittedParams` is successful" do
context "when `params` do NOT have only permitted keys" do
let(:permitted_keys) { [:id, :title] }

it "returns `success` with `params` without unpermitted keys" do
expect(result).to be_success.with_data(params: params.slice(*permitted_keys))
it "returns `success` with `params` without unpermitted keys" do
expect(result).to be_success.with_data(params: params.slice(*permitted_keys))
end
end
end

context "when `params` have only permitted keys" do
let(:permitted_keys) { [:id, :title, :verified] }
context "when `params` have only permitted keys" do
let(:permitted_keys) { [:id, :title, :verified] }

it "returns `success` with original `params`" do
expect(result).to be_success.with_data(params: params)
it "returns `success` with original `params`" do
expect(result).to be_success.with_data(params: params)
end
end
end
end
Expand Down
Loading

0 comments on commit 6a641c8

Please sign in to comment.