axn 0.1.0.pre.alpha.2.1 → 0.1.0.pre.alpha.2.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 20198518e83064e97c25335dbcb2be0a88affe103dcd1aaf8ca3965a964cbeb4
4
- data.tar.gz: 70707f0966255c4c0015953fea14a3b42d1bcc2c1e54b896a8ea20c4e5effb3b
3
+ metadata.gz: dcfb310e364c4fb2c7159a6bdc1ff6766c0025b3b0741a62316d3e18cb5f3bf7
4
+ data.tar.gz: 7af1c3d88a69c0d109983c85fb6dc1b5ddf162568ee1e1aa516f15bf1d12a1d2
5
5
  SHA512:
6
- metadata.gz: 781768348b4b08267f34956a94b4a4ab0ef470123d9d084cfb6fd24fb1ab02b6c03f979206a57d828f675ec21b7754672bfbaed10acd8bf222f6efc374c90b39
7
- data.tar.gz: d81788b26c3b313fa3d21fb2d7d763109839659eff4d0bc8af0251a7ee93ef77ee121df1f023dad4f71ed63eb94b355d7469cfcac5e21dab4fcbec126f40ea88
6
+ metadata.gz: 13868e68f4a7b9a45bebbcf793bba1855ec2fa524ccd6f24fdaf1364bb143fcd4cfd862f0906d6455d10e61492b723ffbdc2c836a887052b030d509bf18171b0
7
+ data.tar.gz: 53014437d7a3972ec584195b2c20955ff9f2c1138dba3eeb35df2e82db8d62ec3b3561ec6b1d870472fc7fcea79dd1c2abe759cf341c46e024ae143d266bfa64
data/CHANGELOG.md CHANGED
@@ -1,7 +1,9 @@
1
1
  # Changelog
2
2
 
3
3
  ## UNRELEASED
4
- * N/A
4
+
5
+ ## 0.1.0-alpha.2.2
6
+ * Expands `Action::Result.ok` and `Action::Result.error` to better support mocking in specs
5
7
 
6
8
  ## 0.1.0-alpha.2.1
7
9
  * Expects/Exposes: Add `allow_nil` option
@@ -4,7 +4,36 @@
4
4
  * TODO: document testing patterns
5
5
  :::
6
6
 
7
- Configuring rspec to treat files in spec/actions as service specs:
7
+ ## Mocking Axn calls
8
+
9
+ Say you're writing unit specs for PrimaryAction that calls Subaction, and you want to mock out the Subaction call.
10
+
11
+ To generate a successful Action::Result:
12
+
13
+ * Base case: `Action::Result.ok`
14
+ * [Optional] Custom message: `Action::Result.ok("It went awesome")`
15
+ * [Optional] Custom exposures: `Action::Result.ok("It went awesome", some_var: 123)`
16
+
17
+ To generate a failed Action::Result:
18
+
19
+ * Base case: `Action::Result.error`
20
+ * [Optional] Custom message: `Action::Result.error("It went poorly")`
21
+ * [Optional] Custom exposures: `Action::Result.error("It went poorly", some_var: 123)`
22
+ * [Optional] Custom exception: `Action::Result.error(some_var: 123) { raise FooBarException.new("bad thing") }`
23
+
24
+ Either way, using those to mock an actual call would look something like this in your rspec:
25
+
26
+ ```ruby
27
+ let(:subaction_response) { Action::Result.ok("custom message", foo: 1) }
28
+
29
+ before do
30
+ expect(Subaction).to receive(:call).and_return(subaction_response)
31
+ end
32
+ ```
33
+
34
+ ## RSpec configuration
35
+
36
+ Configuring rspec to treat files in spec/actions as service specs (very optional):
8
37
 
9
38
  ```ruby
10
39
  RSpec.configure do |config|
@@ -94,11 +94,21 @@ module Action
94
94
  class Result < ContextFacade
95
95
  # For ease of mocking return results in tests
96
96
  class << self
97
- def ok = Class.new { include(Action) }.call
97
+ def ok(msg = nil, **exposures)
98
+ Axn::Factory.build(exposes: exposures.keys, messages: { success: msg }) do
99
+ exposures.each do |key, value|
100
+ expose(key, value)
101
+ end
102
+ end.call
103
+ end
98
104
 
99
- def error(msg = "Something went wrong")
100
- Class.new { include(Action) }.tap do |klass|
101
- klass.define_method(:call) { fail!(msg) }
105
+ def error(msg = nil, **exposures, &block)
106
+ Axn::Factory.build(exposes: exposures.keys, messages: { error: msg }) do
107
+ exposures.each do |key, value|
108
+ expose(key, value)
109
+ end
110
+ block.call if block_given?
111
+ fail!
102
112
  end.call
103
113
  end
104
114
  end
data/lib/axn/factory.rb CHANGED
@@ -71,7 +71,7 @@ module Axn
71
71
  axn.exposes(field, **opts)
72
72
  end
73
73
 
74
- axn.messages(**messages) if messages.present?
74
+ axn.messages(**messages) if messages.present? && messages.values.any?(&:present?)
75
75
 
76
76
  # Hooks
77
77
  axn.before(before) if before.present?
data/lib/axn/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Axn
4
- VERSION = "0.1.0-alpha.2.1"
4
+ VERSION = "0.1.0-alpha.2.2"
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: axn
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0.pre.alpha.2.1
4
+ version: 0.1.0.pre.alpha.2.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Kali Donovan
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2025-05-12 00:00:00.000000000 Z
11
+ date: 2025-05-21 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activemodel