|
| 1 | +# Sequence URIs |
| 2 | + |
| 3 | +There are many reasons to manipulate a specific sequence: |
| 4 | + |
| 5 | +- generating a single value with: `generate` |
| 6 | +- generating multiple values with: `generate_list` |
| 7 | +- setting it to a new value with `FactoryBot.set_sequence` |
| 8 | +- rewinding it with: `rewind_sequence` |
| 9 | + |
| 10 | +To accomplish this we need to be able to reference the desired sequence. This is achieved with its unique URI. |
| 11 | + |
| 12 | +## URI Composition |
| 13 | + |
| 14 | +Each URI is composed of up to three names: |
| 15 | + |
| 16 | +| position | name | required | |
| 17 | +| :------: | -------------- | -------------------------------------------------------------------- | |
| 18 | +| 1. | factory name: | **if** - the sequence is defined within a Factory or a Factory Trait | |
| 19 | +| 2. | trait name: | **if** - the sequence is defined within a Trait | |
| 20 | +| 3. | sequence name: | **always required** | |
| 21 | + |
| 22 | +The URI can be entered as individual symbols: |
| 23 | + |
| 24 | +```ruby |
| 25 | +generate(:my_factory_name, :my_trait_name, :my_sequence_name) |
| 26 | +``` |
| 27 | + |
| 28 | +**or** as individual strings: |
| 29 | + |
| 30 | +```ruby |
| 31 | +generate('my_factory_name', 'my_trait_name', 'my_sequence_name') |
| 32 | +``` |
| 33 | + |
| 34 | +**or** as a single resource string: |
| 35 | + |
| 36 | +```ruby |
| 37 | +generate("my_factory_name/my_trait_name/my_sequence_name") |
| 38 | +``` |
| 39 | + |
| 40 | +## Full URI example |
| 41 | + |
| 42 | +This example details all the possible scenarios, with the comments showing the URI used to generate a value for each specific sequence: |
| 43 | + |
| 44 | +```ruby |
| 45 | +FactoryBot.define do |
| 46 | + sequence(:sequence) {|n| "global_sequence_#{n}"} |
| 47 | + # generate(:sequence) |
| 48 | + |
| 49 | + trait :global_trait do |
| 50 | + sequence(:sequence) {|n| "global_trait_sequence_#{n}"} |
| 51 | + # generate(:global_trait, :sequence) |
| 52 | + end |
| 53 | + |
| 54 | + factory :user do |
| 55 | + sequence(:sequence) {|n| "user_sequence_#{n}"} |
| 56 | + # generate(:user, :sequence) |
| 57 | + |
| 58 | + trait :user_trait do |
| 59 | + sequence(:sequence) {|n| "user_trait_sequence_#{n}"} |
| 60 | + # generate(:user, :user_trait, :sequence) |
| 61 | + end |
| 62 | + |
| 63 | + factory :author do |
| 64 | + sequence(:sequence) {|n| "author_sequence_#{n}"} |
| 65 | + # generate(:author, :sequence) |
| 66 | + |
| 67 | + trait :author_trait do |
| 68 | + sequence(:sequence) {|n| "author_trait_sequence_#{n}"} |
| 69 | + # generate(:author, :author_trait, :sequence) |
| 70 | + end |
| 71 | + end |
| 72 | + end |
| 73 | +end |
| 74 | +``` |
| 75 | + |
| 76 | +## Multi URIs |
| 77 | + |
| 78 | +It is possible for a single sequence to have multiple URIs. |
| 79 | + |
| 80 | +If the factory or trait has aliases, the sequence will have an additional URI for each alias, or combination of aliases. |
| 81 | + |
| 82 | +In this example, the same sequence can referenced in four different ways: |
| 83 | + |
| 84 | +```ruby |
| 85 | +factory :user, aliases: [:author] do |
| 86 | + trait :user_trait, aliases: [:author_trait] do |
| 87 | + sequence(:sequence) {|n| "author_trait_sequence_#{n}"} |
| 88 | + end |
| 89 | +end |
| 90 | + |
| 91 | +# generate(:user, :user_trait, :sequence) |
| 92 | +# generate(:user, :author_trait, :sequence) |
| 93 | +# generate(:author, :user_trait, :sequence) |
| 94 | +# generate(:author, :author_trait, :sequence) |
| 95 | +``` |
| 96 | + |
| 97 | +<div class='warning'> |
| 98 | + |
| 99 | +## Important |
| 100 | + |
| 101 | +- No matter how deeply nested, the factory name component of the URI is always the factory where the sequence is defined, not any parent factories. |
| 102 | + |
| 103 | +- If a factory inherits a sequence, the URI must reference the factory where it was defined, not the one in which it is used. |
| 104 | + |
| 105 | +</div> |
0 commit comments