Diff of the two buildlogs: -- --- b1/build.log 2025-03-06 01:38:15.821107995 +0000 +++ b2/build.log 2025-03-06 01:40:45.718365391 +0000 @@ -1,6 +1,6 @@ I: pbuilder: network access will be disabled during build -I: Current time: Tue Apr 7 20:00:26 -12 2026 -I: pbuilder-time-stamp: 1775635226 +I: Current time: Thu Mar 6 15:38:19 +14 2025 +I: pbuilder-time-stamp: 1741225099 I: Building the build Environment I: extracting base tarball [/var/cache/pbuilder/unstable-reproducible-base.tgz] I: copying local configuration @@ -25,52 +25,84 @@ dpkg-source: info: applying 0004-Fix-failing-tests-with-rails-5.2.patch I: Not using root during the build. I: Installing the build-deps -I: user script /srv/workspace/pbuilder/1678863/tmp/hooks/D02_print_environment starting +I: user script /srv/workspace/pbuilder/2163657/tmp/hooks/D01_modify_environment starting +debug: Running on codethink04-arm64. +I: Changing host+domainname to test build reproducibility +I: Adding a custom variable just for the fun of it... +I: Changing /bin/sh to bash +'/bin/sh' -> '/bin/bash' +lrwxrwxrwx 1 root root 9 Mar 6 01:38 /bin/sh -> /bin/bash +I: Setting pbuilder2's login shell to /bin/bash +I: Setting pbuilder2's GECOS to second user,second room,second work-phone,second home-phone,second other +I: user script /srv/workspace/pbuilder/2163657/tmp/hooks/D01_modify_environment finished +I: user script /srv/workspace/pbuilder/2163657/tmp/hooks/D02_print_environment starting I: set - BUILDDIR='/build/reproducible-path' - BUILDUSERGECOS='first user,first room,first work-phone,first home-phone,first other' - BUILDUSERNAME='pbuilder1' - BUILD_ARCH='arm64' - DEBIAN_FRONTEND='noninteractive' + BASH=/bin/sh + BASHOPTS=checkwinsize:cmdhist:complete_fullquote:extquote:force_fignore:globasciiranges:globskipdots:hostcomplete:interactive_comments:patsub_replacement:progcomp:promptvars:sourcepath + BASH_ALIASES=() + BASH_ARGC=() + BASH_ARGV=() + BASH_CMDS=() + BASH_LINENO=([0]="12" [1]="0") + BASH_LOADABLES_PATH=/usr/local/lib/bash:/usr/lib/bash:/opt/local/lib/bash:/usr/pkg/lib/bash:/opt/pkg/lib/bash:. + BASH_SOURCE=([0]="/tmp/hooks/D02_print_environment" [1]="/tmp/hooks/D02_print_environment") + BASH_VERSINFO=([0]="5" [1]="2" [2]="37" [3]="1" [4]="release" [5]="aarch64-unknown-linux-gnu") + BASH_VERSION='5.2.37(1)-release' + BUILDDIR=/build/reproducible-path + BUILDUSERGECOS='second user,second room,second work-phone,second home-phone,second other' + BUILDUSERNAME=pbuilder2 + BUILD_ARCH=arm64 + DEBIAN_FRONTEND=noninteractive DEB_BUILD_OPTIONS='buildinfo=+all reproducible=+all parallel=12 ' - DISTRIBUTION='unstable' - HOME='/root' - HOST_ARCH='arm64' + DIRSTACK=() + DISTRIBUTION=unstable + EUID=0 + FUNCNAME=([0]="Echo" [1]="main") + GROUPS=() + HOME=/root + HOSTNAME=i-capture-the-hostname + HOSTTYPE=aarch64 + HOST_ARCH=arm64 IFS=' ' - INVOCATION_ID='486d2b651a76452dae894cf68f267f04' - LANG='C' - LANGUAGE='en_US:en' - LC_ALL='C' - MAIL='/var/mail/root' - OPTIND='1' - PATH='/usr/sbin:/usr/bin:/sbin:/bin:/usr/games' - PBCURRENTCOMMANDLINEOPERATION='build' - PBUILDER_OPERATION='build' - PBUILDER_PKGDATADIR='/usr/share/pbuilder' - PBUILDER_PKGLIBDIR='/usr/lib/pbuilder' - PBUILDER_SYSCONFDIR='/etc' - PPID='1678863' - PS1='# ' - PS2='> ' + INVOCATION_ID=c01e1418b5684251af833a11fed460e1 + LANG=C + LANGUAGE=nl_BE:nl + LC_ALL=C + MACHTYPE=aarch64-unknown-linux-gnu + MAIL=/var/mail/root + OPTERR=1 + OPTIND=1 + OSTYPE=linux-gnu + PATH=/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/i/capture/the/path + PBCURRENTCOMMANDLINEOPERATION=build + PBUILDER_OPERATION=build + PBUILDER_PKGDATADIR=/usr/share/pbuilder + PBUILDER_PKGLIBDIR=/usr/lib/pbuilder + PBUILDER_SYSCONFDIR=/etc + PIPESTATUS=([0]="0") + POSIXLY_CORRECT=y + PPID=2163657 PS4='+ ' - PWD='/' - SHELL='/bin/bash' - SHLVL='2' - SUDO_COMMAND='/usr/bin/timeout -k 18.1h 18h /usr/bin/ionice -c 3 /usr/bin/nice /usr/sbin/pbuilder --build --configfile /srv/reproducible-results/rbuild-debian/r-b-build.cPq6KJEA/pbuilderrc_cWI6 --distribution unstable --hookdir /etc/pbuilder/first-build-hooks --debbuildopts -b --basetgz /var/cache/pbuilder/unstable-reproducible-base.tgz --buildresult /srv/reproducible-results/rbuild-debian/r-b-build.cPq6KJEA/b1 --logfile b1/build.log ruby-factory-bot_6.5.1-1.dsc' - SUDO_GID='109' - SUDO_UID='104' - SUDO_USER='jenkins' - TERM='unknown' - TZ='/usr/share/zoneinfo/Etc/GMT+12' - USER='root' - _='/usr/bin/systemd-run' - http_proxy='http://192.168.101.4:3128' + PWD=/ + SHELL=/bin/bash + SHELLOPTS=braceexpand:errexit:hashall:interactive-comments:posix + SHLVL=3 + SUDO_COMMAND='/usr/bin/timeout -k 24.1h 24h /usr/bin/ionice -c 3 /usr/bin/nice -n 11 /usr/bin/unshare --uts -- /usr/sbin/pbuilder --build --configfile /srv/reproducible-results/rbuild-debian/r-b-build.cPq6KJEA/pbuilderrc_TffP --distribution unstable --hookdir /etc/pbuilder/rebuild-hooks --debbuildopts -b --basetgz /var/cache/pbuilder/unstable-reproducible-base.tgz --buildresult /srv/reproducible-results/rbuild-debian/r-b-build.cPq6KJEA/b2 --logfile b2/build.log ruby-factory-bot_6.5.1-1.dsc' + SUDO_GID=109 + SUDO_UID=104 + SUDO_USER=jenkins + TERM=unknown + TZ=/usr/share/zoneinfo/Etc/GMT-14 + UID=0 + USER=root + _='I: set' + http_proxy=http://192.168.101.4:3128 I: uname -a - Linux codethink03-arm64 6.1.0-31-cloud-arm64 #1 SMP Debian 6.1.128-1 (2025-02-07) aarch64 GNU/Linux + Linux i-capture-the-hostname 6.1.0-31-cloud-arm64 #1 SMP Debian 6.1.128-1 (2025-02-07) aarch64 GNU/Linux I: ls -l /bin - lrwxrwxrwx 1 root root 7 Mar 4 2025 /bin -> usr/bin -I: user script /srv/workspace/pbuilder/1678863/tmp/hooks/D02_print_environment finished + lrwxrwxrwx 1 root root 7 Mar 4 11:20 /bin -> usr/bin +I: user script /srv/workspace/pbuilder/2163657/tmp/hooks/D02_print_environment finished -> Attempting to satisfy build-dependencies -> Creating pbuilder-satisfydepends-dummy package Package: pbuilder-satisfydepends-dummy @@ -271,7 +303,7 @@ Get: 147 http://deb.debian.org/debian unstable/main arm64 ruby-rspec-its all 1.3.0-1 [6864 B] Get: 148 http://deb.debian.org/debian unstable/main arm64 ruby-sqlite3 arm64 1.7.3-1 [49.1 kB] Get: 149 http://deb.debian.org/debian unstable/main arm64 ruby-timecop all 0.9.10-1.1 [12.2 kB] -Fetched 48.5 MB in 0s (148 MB/s) +Fetched 48.5 MB in 1s (80.1 MB/s) Preconfiguring packages ... Selecting previously unselected package libpython3.13-minimal:arm64. (Reading database ... (Reading database ... 5% (Reading database ... 10% (Reading database ... 15% (Reading database ... 20% (Reading database ... 25% (Reading database ... 30% (Reading database ... 35% (Reading database ... 40% (Reading database ... 45% (Reading database ... 50% (Reading database ... 55% (Reading database ... 60% (Reading database ... 65% (Reading database ... 70% (Reading database ... 75% (Reading database ... 80% (Reading database ... 85% (Reading database ... 90% (Reading database ... 95% (Reading database ... 100% (Reading database ... 19897 files and directories currently installed.) @@ -766,8 +798,8 @@ Setting up tzdata (2025a-2) ... Current default time zone: 'Etc/UTC' -Local time is now: Wed Apr 8 08:00:50 UTC 2026. -Universal Time is now: Wed Apr 8 08:00:50 UTC 2026. +Local time is now: Thu Mar 6 01:39:16 UTC 2025. +Universal Time is now: Thu Mar 6 01:39:16 UTC 2025. Run 'dpkg-reconfigure tzdata' if you wish to change it. Setting up ruby-minitest (5.25.4-2) ... @@ -902,7 +934,11 @@ Building tag database... -> Finished parsing the build-deps I: Building the package -I: Running cd /build/reproducible-path/ruby-factory-bot-6.5.1/ && env PATH="/usr/sbin:/usr/bin:/sbin:/bin:/usr/games" HOME="/nonexistent/first-build" dpkg-buildpackage -us -uc -b && env PATH="/usr/sbin:/usr/bin:/sbin:/bin:/usr/games" HOME="/nonexistent/first-build" dpkg-genchanges -S > ../ruby-factory-bot_6.5.1-1_source.changes +I: user script /srv/workspace/pbuilder/2163657/tmp/hooks/A99_set_merged_usr starting +Not re-configuring usrmerge for unstable +I: user script /srv/workspace/pbuilder/2163657/tmp/hooks/A99_set_merged_usr finished +hostname: Name or service not known +I: Running cd /build/reproducible-path/ruby-factory-bot-6.5.1/ && env PATH="/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/i/capture/the/path" HOME="/nonexistent/second-build" dpkg-buildpackage -us -uc -b && env PATH="/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/i/capture/the/path" HOME="/nonexistent/second-build" dpkg-genchanges -S > ../ruby-factory-bot_6.5.1-1_source.changes dpkg-buildpackage: info: source package ruby-factory-bot dpkg-buildpackage: info: source version 6.5.1-1 dpkg-buildpackage: info: source distribution unstable @@ -935,7 +971,7 @@ │ ruby-factory-bot: Installing files and building extensions for ruby3.3 │ └──────────────────────────────────────────────────────────────────────────────┘ -/usr/bin/ruby3.3 -S gem build --config-file /dev/null --verbose /tmp/d20260407-1692525-x97hcr/gemspec +/usr/bin/ruby3.3 -S gem build --config-file /dev/null --verbose /tmp/d20250306-2228088-c64xb3/gemspec WARNING: open-ended dependency on activesupport (>= 6.1.0) is not recommended if activesupport is semantically versioned, use: add_runtime_dependency "activesupport", "~> 6.1", ">= 6.1.0" @@ -966,7 +1002,7 @@ Name: factory_bot Version: 6.5.1 File: factory_bot-6.5.1.gem -/usr/bin/ruby3.3 -S gem install --config-file /dev/null --verbose --local --verbose --no-document --ignore-dependencies --install-dir debian/ruby-factory-bot/usr/share/rubygems-integration/all /tmp/d20260407-1692525-x97hcr/factory_bot-6.5.1.gem +/usr/bin/ruby3.3 -S gem install --config-file /dev/null --verbose --local --verbose --no-document --ignore-dependencies --install-dir debian/ruby-factory-bot/usr/share/rubygems-integration/all /tmp/d20250306-2228088-c64xb3/factory_bot-6.5.1.gem /build/reproducible-path/ruby-factory-bot-6.5.1/debian/ruby-factory-bot/usr/share/rubygems-integration/all/gems/factory_bot-6.5.1/lib/factory_bot.rb /build/reproducible-path/ruby-factory-bot-6.5.1/debian/ruby-factory-bot/usr/share/rubygems-integration/all/gems/factory_bot-6.5.1/lib/factory_bot/aliases.rb /build/reproducible-path/ruby-factory-bot-6.5.1/debian/ruby-factory-bot/usr/share/rubygems-integration/all/gems/factory_bot-6.5.1/lib/factory_bot/attribute.rb @@ -1052,707 +1088,842 @@ mv Gemfile.lock ./.gem2deb.Gemfile.lock /usr/bin/ruby3.3 -I/usr/share/rubygems-integration/all/gems/rspec-support-3.13.1/lib:/usr/share/rubygems-integration/all/gems/rspec-core-3.13.0/lib /usr/share/rubygems-integration/all/gems/rspec-core-3.13.0/exe/rspec --pattern spec/\{\*_spec.rb,factory_bot/\*\*/\*_spec.rb\} --format documentation -Randomized with seed 42466 - -FactoryBot::AttributeList#apply_attributes - adds attributes in the order defined - -FactoryBot - finds a registered strategy - .use_parent_strategy - is true by default - -FactoryBot::Strategy::AttributesFor - does not run the to_create block - returns the hash from the evaluation - it should behave like strategy without association support - returns nil when accessing an association - -FactoryBot::Factory human names - parses human names without underscores - parses names with aliases - parses names with big letters - parses human names with underscores - parses names with underscores - parses names without underscores - parses human names with big letters - parses human names with aliases - -FactoryBot::DefinitionProxy#method_missing - declares an association when called with a ':factory' key - declares a dynamic attribute when called with a block - raises a NoMethodError when called with a static-attribute-like argument - declares an implicit declaration when called without args or a block - -FactoryBot::DefinitionProxy#association - declares an association with options - declares an association - when passing a block raises an error - -FactoryBot::DefinitionProxy#add_attribute - declares a dynamic attribute on the factory when the proxy ignores attributes - declares a dynamic attribute on the factory when the proxy respects attributes - -FactoryBot::DeclarationList#attributes - defines each attribute on the attribute list - returns an AttributeList +Randomized with seed 43963 definition loading - with several factories files under test/factories - it should behave like finds definitions - is expected to load definitions from test/factories/post_factory.rb - is expected to load definitions from test/factories/person_factory.rb with several factories files under spec/factories in non-alphabetical order loads the files in the right order + with factories.rb + it should behave like finds definitions + is expected to load definitions from factories.rb + with deeply nested factory files under test + it should behave like finds definitions + is expected to load definitions from test/factories/subdirectory/person_factory.rb + is expected to load definitions from test/factories/subdirectory/post_factory.rb with a factories file under test it should behave like finds definitions is expected to load definitions from test/factories.rb + with a factories file under spec/factories + it should behave like finds definitions + is expected to load definitions from spec/factories/post_factory.rb + with nested and unnested factories files under spec + it should behave like finds definitions + is expected to load definitions from spec/factories/post_factory.rb + is expected to load definitions from spec/factories/person_factory.rb + is expected to load definitions from spec/factories.rb with deeply nested factory files under spec it should behave like finds definitions is expected to load definitions from spec/factories/subdirectory/post_factory.rb is expected to load definitions from spec/factories/subdirectory/person_factory.rb - with a factories file under spec/factories + with a factories file under test/factories + it should behave like finds definitions + is expected to load definitions from test/factories/post_factory.rb + with several factories files under spec/factories it should behave like finds definitions + is expected to load definitions from spec/factories/person_factory.rb is expected to load definitions from spec/factories/post_factory.rb with nested and unnested factories files under test it should behave like finds definitions + is expected to load definitions from test/factories/post_factory.rb is expected to load definitions from test/factories.rb is expected to load definitions from test/factories/person_factory.rb - is expected to load definitions from test/factories/post_factory.rb - with nested and unnested factories files under spec - it should behave like finds definitions - is expected to load definitions from spec/factories.rb - is expected to load definitions from spec/factories/person_factory.rb - is expected to load definitions from spec/factories/post_factory.rb with a factories file under spec it should behave like finds definitions is expected to load definitions from spec/factories.rb - with deeply nested factory files under test - it should behave like finds definitions - is expected to load definitions from test/factories/subdirectory/post_factory.rb - is expected to load definitions from test/factories/subdirectory/person_factory.rb - with factories.rb - it should behave like finds definitions - is expected to load definitions from factories.rb - with several factories files under spec/factories - it should behave like finds definitions - is expected to load definitions from spec/factories/post_factory.rb - is expected to load definitions from spec/factories/person_factory.rb with several factories files under test/factories in non-alphabetical order loads the files in the right order - with a factories file under test/factories + with several factories files under test/factories it should behave like finds definitions is expected to load definitions from test/factories/post_factory.rb + is expected to load definitions from test/factories/person_factory.rb -FactoryBot::DefinitionProxy#to_create - accepts a block to run in place of #save! +FactoryBot::AttributeList#define_attribute with a named attribute list + does not raise when the attribute is not a self-referencing association + raises when the attribute is a self-referencing association -FactoryBot::Factory when defined with a class instead of a name - has a build_class +FactoryBot::AttributeList generating names + knows all its #names for #associations + knows all its #names + knows all its #names for #non_ignored attributes + knows all its #names for #ignored attributes + +FactoryBot::Sequence + a custom sequence and scope increments within the correct scope when incrementing + a custom scope increments within the correct scope after rewinding + a custom sequence and scope increments within the correct scope + a basic sequence without a block + behaves like a sequence + has a next value equal to the 1st value after rewinding + has a next value equal to the 2nd value after being incremented + has a next value equal to its first value + a sequence with custom value and aliases + has the expected names as its names + behaves like a sequence + has a next value equal to the 1st value after rewinding + has a next value equal to its first value + has a next value equal to the 2nd value after being incremented + a custom sequence without a block + behaves like a sequence + has a next value equal to the 2nd value after being incremented + has a next value equal to its first value + has a next value equal to the 1st value after rewinding + a basic sequence + names + is expected to eq [:test] + behaves like a sequence + has a next value equal to its first value + has a next value equal to the 2nd value after being incremented + has a next value equal to the 1st value after rewinding + name + is expected to eq :test + iterating over items in an enumerator + navigates to the next items until no items remain + behaves like a sequence + has a next value equal to the 2nd value after being incremented + has a next value equal to its first value + has a next value equal to the 1st value after rewinding + a custom sequence + behaves like a sequence + has a next value equal to its first value + has a next value equal to the 1st value after rewinding + has a next value equal to the 2nd value after being incremented + a sequence with aliases using default value + has the expected names as its names + behaves like a sequence + has a next value equal to the 2nd value after being incremented + has a next value equal to its first value + has a next value equal to the 1st value after rewinding + +FactoryBot aliases + for a foreign key should include both the suffixed and un-suffixed variants + for an attribute should include the original attribute and a version suffixed with '_id' + for an attribute which starts with an underscore should not include a non-underscored version + +FactoryBot::Factory with a string for a name + sets build_class correctly with a class with an underscore + has a name + +FactoryBot::DefinitionProxy#association + declares an association + declares an association with options + when passing a block raises an error + +FactoryBot after defining an alias + the list of aliases should include a variant with no suffix at all, and one with an '_id' suffix + +FactoryBot::DefinitionProxy#sequence + creates a new sequence starting at 1 + creates a new sequence with a block + creates a new sequence with an overridden starting value + +FactoryBot::Factory when defined with a custom class + is an instance of that custom class + +FactoryBot::Callback has a name + runs its block with one parameter + runs its block with two parameters + converts strings to symbols + runs its block with no parameters + +FactoryBot::DefinitionProxy adding callbacks + adding an :after_stub callback succeeds + adding both an :after_stub and a :before_create callback succeeds + adding both a :before_stub and a :before_create callback succeeds + adding an :after_build callback succeeds + adding an :after_create callback succeeds + adding both an :after_stub and an :after_create callback succeeds FactoryBot::DefinitionProxy#transient makes all attributes added ignored -FactoryBot::Factory for namespaced class - sets build_class correctly with a namespaced class with Namespace::Class syntax - sets build_class correctly with a namespaced class with namespace/class syntax +FactoryBot::Attribute::Association with a string name + name + is expected to eq :name -FactoryBot::EvaluatorClassDefiner - only instance_execs the block once even when returning nil - sets attributes on the evaluator class - returns an evaluator when accessing the evaluator class - adds each attribute to the evaluator - evaluates the block in the context of the evaluator - with a custom evaluator as a parent class - bases its attribute lists on itself and its parent evaluator +FactoryBot::Decorator::DisallowsDuplicatesRegistry + raises when attempting to #register a previously registered strategy + delegates #register to the registry when not registered -FactoryBot::DefinitionProxy#initialize_with - defines the constructor on the definition +FactoryBot::Declaration::Implicit + #== + when one is ignored and the other isn't + the objects are NOT equal + when the attributes are equal + the objects are equal + when the factories are different + the objects are NOT equal + when the names are different + the objects are NOT equal + when comparing against another type of object + the objects are NOT equal + with a known sequence + creates a sequence attribute + does not create an association attribute + with a known factory + has the correct factory name + creates an association attribute -FactoryBot::Attribute::Sequence - assigns the next value in the sequence +FactoryBot::Attribute::Dynamic with a string name name - is expected to eq :first_name + is expected to eq :name -FactoryBot::DefinitionProxy#factory - with options - without options - with a block +FactoryBot::Factory when defined with a custom class name + has a build_class equal to its custom class name -FactoryBot::Strategy::Stub - it should behave like strategy with strategy: :build +FactoryBot::DeclarationList#declare_attribute + adds the declaration to the list when overridable + adds the declaration to the list when not overridable + deletes declarations with the same name when overridable + appends declarations with the same name when NOT overridable + +FactoryBot::Strategy::Create + runs a custom create block + it should behave like strategy with association support runs the factory with the correct overrides finds the factory with the correct factory name it should behave like strategy with callbacks - runs the callbacks [:after_stub] with the evaluation's object returns the object from the evaluation + runs the callbacks [:after_build, :before_create, :after_create] with the evaluation's object + +FactoryBot::StrategyCalculator + returns the strategy found when instantiated with a symbol + finds the strategy by name when instantiated with a symbol + returns the class passed when it is instantiated with a class + +FactoryBot::DefinitionProxy#trait + declares a trait + +FactoryBot::DefinitionProxy#add_attribute + declares a dynamic attribute on the factory when the proxy ignores attributes + declares a dynamic attribute on the factory when the proxy respects attributes + +FactoryBot::AttributeList filter based on ignored attributes + filters #non_ignored attributes + filters #ignored attributes + +FactoryBot::AttributeList#associations + returns associations + +FactoryBot::Factory human names + parses names with aliases + parses names without underscores + parses human names with underscores + parses names with underscores + parses human names with big letters + parses names with big letters + parses human names with aliases + parses human names without underscores + +FactoryBot::DefinitionProxy#factory + with a block + with options + without options + +FactoryBot::Declaration::Dynamic + #== + when the names are different + the objects are NOT equal + when one is ignored and the other isn't + the objects are NOT equal + when the blocks are different + the objects are NOT equal + when comparing against another type of object + the objects are NOT equal + when the attributes are equal + the objects are equal + +FactoryBot::Strategy::Stub asking for a result + is expected not to be destroyed assigns created_at - is expected not to be new record is expected to be persisted - is expected not to be destroyed - overriding persistence method: #save! - raises an informative error if the method is called - overrides the method with any arity - overriding persistence method: #update_attributes - raises an informative error if the method is called - overrides the method with any arity - overriding persistence method: #update + is expected not to be new record + overriding persistence method: #update_column overrides the method with any arity raises an informative error if the method is called overriding persistence method: #toggle! overrides the method with any arity raises an informative error if the method is called - overriding persistence method: #touch + overriding persistence method: #update_attribute raises an informative error if the method is called overrides the method with any arity - overriding persistence method: #update_attributes! + overriding persistence method: #touch raises an informative error if the method is called overrides the method with any arity - overriding persistence method: #increment! + overriding persistence method: #destroy raises an informative error if the method is called overrides the method with any arity - overriding persistence method: #decrement! + overriding persistence method: #save! overrides the method with any arity raises an informative error if the method is called - overriding persistence method: #reload - raises an informative error if the method is called - overrides the method with any arity overriding persistence method: #connection - overrides the method with any arity raises an informative error if the method is called - overriding persistence method: #update_attribute + overrides the method with any arity + overriding persistence method: #reload overrides the method with any arity raises an informative error if the method is called - overriding persistence method: #destroy! + overriding persistence method: #update_attributes! raises an informative error if the method is called overrides the method with any arity + overriding persistence method: #save + overrides the method with any arity + raises an informative error if the method is called overriding persistence method: #delete raises an informative error if the method is called overrides the method with any arity - overriding persistence method: #update_columns + overriding persistence method: #destroy! overrides the method with any arity raises an informative error if the method is called + overriding persistence method: #update_attributes + raises an informative error if the method is called + overrides the method with any arity overriding persistence method: #update! + raises an informative error if the method is called overrides the method with any arity + overriding persistence method: #update raises an informative error if the method is called - overriding persistence method: #save + overrides the method with any arity + overriding persistence method: #decrement! overrides the method with any arity raises an informative error if the method is called - overriding persistence method: #destroy + overriding persistence method: #update_columns raises an informative error if the method is called overrides the method with any arity - overriding persistence method: #update_column - overrides the method with any arity + overriding persistence method: #increment! raises an informative error if the method is called - it should behave like strategy with association support - runs the factory with the correct overrides - finds the factory with the correct factory name - -FactoryBot::Declaration::Dynamic - #== - when one is ignored and the other isn't - the objects are NOT equal - when the attributes are equal - the objects are equal - when comparing against another type of object - the objects are NOT equal - when the names are different - the objects are NOT equal - when the blocks are different - the objects are NOT equal - -FactoryBot::Factory with a name ending in s - has a build class - has a name - -FactoryBot::Strategy::Build + overrides the method with any arity + it should behave like strategy with callbacks + returns the object from the evaluation + runs the callbacks [:after_stub] with the evaluation's object it should behave like strategy with association support runs the factory with the correct overrides finds the factory with the correct factory name it should behave like strategy with strategy: :build runs the factory with the correct overrides finds the factory with the correct factory name - it should behave like strategy with callbacks - returns the object from the evaluation - runs the callbacks [:after_build] with the evaluation's object - -FactoryBot::Factory when defined with a custom class - is an instance of that custom class -FactoryBot::Attribute::Dynamic with a string name - name - is expected to eq :name - -FactoryBot::Factory when defined with a custom class name - has a build_class equal to its custom class name - -FactoryBot::Factory - guesses the build class from the factory name - has a factory name - creates a new factory while overriding the parent class - has a build class - includes associations from the parent factory - creates a new factory using the class of the parent - returns associations - when overriding generated attributes with a hash - overrides a symbol parameter with a string parameter - returns the overridden value in the generated attributes - overriding an attribute with an alias - uses the passed in value for the alias - discards the predefined value for the attribute +FactoryBot::EvaluatorClassDefiner + adds each attribute to the evaluator + returns an evaluator when accessing the evaluator class + only instance_execs the block once even when returning nil + evaluates the block in the context of the evaluator + sets attributes on the evaluator class + with a custom evaluator as a parent class + bases its attribute lists on itself and its parent evaluator FactoryBot::AttributeList#define_attribute maintains a list of attributes returns the attribute raises if an attribute has already been defined -FactoryBot::Decorator::DisallowsDuplicatesRegistry - delegates #register to the registry when not registered - raises when attempting to #register a previously registered strategy - -FactoryBot::AttributeList generating names - knows all its #names for #ignored attributes - knows all its #names for #non_ignored attributes - knows all its #names for #associations - knows all its #names - -FactoryBot::DefinitionProxy adding callbacks - adding an :after_build callback succeeds - adding both an :after_stub and an :after_create callback succeeds - adding both a :before_stub and a :before_create callback succeeds - adding an :after_stub callback succeeds - adding both an :after_stub and a :before_create callback succeeds - adding an :after_create callback succeeds - -FactoryBot aliases - for an attribute should include the original attribute and a version suffixed with '_id' - for an attribute which starts with an underscore should not include a non-underscored version - for a foreign key should include both the suffixed and un-suffixed variants - -FactoryBot::Attribute::Association with a string name - name - is expected to eq :name - -FactoryBot::Attribute::Association - is expected to be association - builds the association when calling the proc - builds the association when calling the proc - name - is expected to eq :author +FactoryBot::Factory running a factory + creates the right strategy using the build class when running + returns the result from the strategy when running + calls the block and returns the result FactoryBot::Internal - .factory_by_name - finds a registered factory - .register_trait - returns the registered trait - registers the provided trait - .register_sequence - returns the registered sequence - registers the provided sequence - .strategy_by_name - finds a registered strategy - .sequence_by_name - finds a registered sequence .trait_by_name finds a previously registered trait - .rewind_sequences - rewinds the sequences and the internal sequences .register_factory - returns the registered factory registers the provided factory + returns the registered factory .register_strategy register the provided strategy name with the class + .factory_by_name + finds a registered factory + .sequence_by_name + finds a registered sequence .register_factory - returns the registered factory registers the provided factory + returns the registered factory + .rewind_sequences + rewinds the sequences and the internal sequences + .register_trait + registers the provided trait + returns the registered trait .factory_by_name finds a registered factory + .register_sequence + registers the provided sequence + returns the registered sequence + .strategy_by_name + finds a registered strategy -FactoryBot::Decorator::AttributeHash - #attributes - returns a hash of attributes - with an attribute called 'attributes' - does not call itself recursively - -FactoryBot::DefinitionProxy#trait - declares a trait - -FactoryBot::Definition - has a name - delegates :declare_attribute to declarations - maintains a list of traits - exposes a non-default create strategy when one is provided by the user - has an overridable declaration list - doesn't expose a separate create strategy when none is specified - maintains a list of callbacks - adds only unique traits - creates a new attribute list with the name passed when given a name - maintains a list of enum fields - -FactoryBot::Factory running a factory - creates the right strategy using the build class when running - calls the block and returns the result - returns the result from the strategy when running +FactoryBot::DefinitionProxy#initialize_with + defines the constructor on the definition -FactoryBot::Factory when given a class that overrides #to_s - sets build_class correctly +FactoryBot::Factory for namespaced class + sets build_class correctly with a namespaced class with namespace/class syntax + sets build_class correctly with a namespaced class with Namespace::Class syntax -FactoryBot::Declaration::Implicit +FactoryBot::Declaration::Association #== - when comparing against another type of object - the objects are NOT equal when the attributes are equal the objects are equal - when the factories are different + when the names are different the objects are NOT equal - when one is ignored and the other isn't + when the options are different the objects are NOT equal - when the names are different + when comparing against another type of object the objects are NOT equal - with a known factory - has the correct factory name - creates an association attribute - with a known sequence - creates a sequence attribute - does not create an association attribute -FactoryBot after defining an alias - the list of aliases should include a variant with no suffix at all, and one with an '_id' suffix +FactoryBot::Factory with a name ending in s + has a name + has a build class -FactoryBot::Attribute - converts the name attribute to a symbol - is not an association +FactoryBot + finds a registered strategy + .use_parent_strategy + is true by default + +FactoryBot::Factory + includes associations from the parent factory + has a factory name + creates a new factory using the class of the parent + guesses the build class from the factory name + has a build class + creates a new factory while overriding the parent class + returns associations + overriding an attribute with an alias + uses the passed in value for the alias + discards the predefined value for the attribute + when overriding generated attributes with a hash + overrides a symbol parameter with a string parameter + returns the overridden value in the generated attributes FactoryBot::NullObject responds to the given methods does not respond to other methods -FactoryBot::Sequence - a custom scope increments within the correct scope after rewinding - a custom sequence and scope increments within the correct scope when incrementing - a custom sequence and scope increments within the correct scope - a sequence with aliases using default value - has the expected names as its names - behaves like a sequence - has a next value equal to the 1st value after rewinding - has a next value equal to the 2nd value after being incremented - has a next value equal to its first value - a sequence with custom value and aliases - has the expected names as its names - behaves like a sequence - has a next value equal to the 1st value after rewinding - has a next value equal to its first value - has a next value equal to the 2nd value after being incremented - a custom sequence - behaves like a sequence - has a next value equal to the 1st value after rewinding - has a next value equal to the 2nd value after being incremented - has a next value equal to its first value - iterating over items in an enumerator - navigates to the next items until no items remain - behaves like a sequence - has a next value equal to the 2nd value after being incremented - has a next value equal to the 1st value after rewinding - has a next value equal to its first value - a custom sequence without a block - behaves like a sequence - has a next value equal to the 2nd value after being incremented - has a next value equal to the 1st value after rewinding - has a next value equal to its first value - a basic sequence - name - is expected to eq :test - behaves like a sequence - has a next value equal to the 2nd value after being incremented - has a next value equal to the 1st value after rewinding - has a next value equal to its first value - names - is expected to eq [:test] - a basic sequence without a block - behaves like a sequence - has a next value equal to the 2nd value after being incremented - has a next value equal to its first value - has a next value equal to the 1st value after rewinding - FactoryBot::NullFactory - delegates constructor to its definition - delegates attributes to its definition - delegates callbacks to its definition delegates defined traits to its definition has a nil value for its class_name attribute - has FactoryBot::Evaluator as its evaluator class + delegates constructor to its definition + delegates attributes to its definition has a nil value for its compile attribute has an instance of FactoryBot::AttributeList for its attributes attribute + has FactoryBot::Evaluator as its evaluator class + delegates callbacks to its definition -FactoryBot::AttributeList#associations - returns associations - -FactoryBot::Factory with a string for a name - sets build_class correctly with a class with an underscore - has a name - -FactoryBot::Strategy::Create - runs a custom create block - it should behave like strategy with association support - finds the factory with the correct factory name - runs the factory with the correct overrides - it should behave like strategy with callbacks - runs the callbacks [:after_build, :before_create, :after_create] with the evaluation's object - returns the object from the evaluation - -FactoryBot::Callback - converts strings to symbols - runs its block with two parameters - has a name - runs its block with no parameters - runs its block with one parameter - -FactoryBot::StrategyCalculator - returns the class passed when it is instantiated with a class - returns the strategy found when instantiated with a symbol - finds the strategy by name when instantiated with a symbol - -FactoryBot::AttributeList filter based on ignored attributes - filters #ignored attributes - filters #non_ignored attributes +FactoryBot::AttributeList#apply_attributes + adds attributes in the order defined -FactoryBot::AttributeList#define_attribute with a named attribute list - does not raise when the attribute is not a self-referencing association - raises when the attribute is a self-referencing association +FactoryBot::Attribute + converts the name attribute to a symbol + is not an association -FactoryBot::DefinitionProxy#sequence - creates a new sequence starting at 1 - creates a new sequence with a block - creates a new sequence with an overridden starting value +FactoryBot::Decorator::AttributeHash + #attributes + returns a hash of attributes + with an attribute called 'attributes' + does not call itself recursively -FactoryBot::Declaration::Association - #== - when the names are different - the objects are NOT equal - when comparing against another type of object - the objects are NOT equal - when the attributes are equal - the objects are equal - when the options are different - the objects are NOT equal +FactoryBot::Attribute::Association + builds the association when calling the proc + builds the association when calling the proc + is expected to be association + name + is expected to eq :author -FactoryBot::Registry - clears registered factories - adds and returns the object registered - includes a did_you_mean message - raises when an object cannot be found - is an enumerable - does not include duplicate objects with registered under different names - finds a registered object - iterates registered objects - finds a registered object with square brackets - knows that an object is registered by string - knows when an object is not registered - knows that an object is registered by symbol +FactoryBot::Definition + adds only unique traits + maintains a list of traits + delegates :declare_attribute to declarations + creates a new attribute list with the name passed when given a name + has an overridable declaration list + doesn't expose a separate create strategy when none is specified + has a name + exposes a non-default create strategy when one is provided by the user + maintains a list of enum fields + maintains a list of callbacks -FactoryBot::DeclarationList#declare_attribute - deletes declarations with the same name when overridable - adds the declaration to the list when overridable - adds the declaration to the list when not overridable - appends declarations with the same name when NOT overridable +FactoryBot::Strategy::AttributesFor + does not run the to_create block + returns the hash from the evaluation + it should behave like strategy without association support + returns nil when accessing an association FactoryBot::Attribute::Dynamic name is expected to eq :first_name - with a block returning its block-level variable - returns self when executing the proc - with a block returning a sequence - raises a sequence abuse error with a block returning a static value returns the value when executing the proc with a block referencing an attribute on the attribute evaluates the attribute from the attribute + with a block returning a sequence + raises a sequence abuse error + with a block returning its block-level variable + returns self when executing the proc -Finished in 0.86475 seconds (files took 0.4601 seconds to load) -291 examples, 0 failures - -Randomized with seed 42466 - -/usr/bin/ruby3.3 -I/usr/share/rubygems-integration/all/gems/rspec-support-3.13.1/lib:/usr/share/rubygems-integration/all/gems/rspec-core-3.13.0/lib /usr/share/rubygems-integration/all/gems/rspec-core-3.13.0/exe/rspec --pattern spec/acceptance/\*\*/\*_spec.rb --format documentation - -Randomized with seed 46120 - -a created instance, specifying strategy: :build - saves associations (strategy: :build only affects build, not create) - -calling `build_stubbed` with a block - returns the stub instance - passes the stub instance - -initialize_with for a constructor that requires a block - executes the block correctly - -calling `create` with a block - returns the created instance - passes the created instance +FactoryBot::Attribute::Sequence + assigns the next value in the sequence + name + is expected to eq :first_name -defaulting `id` - allows overriding id +FactoryBot::Registry + adds and returns the object registered + does not include duplicate objects with registered under different names + iterates registered objects + knows that an object is registered by symbol + knows when an object is not registered + finds a registered object with square brackets + raises when an object cannot be found + finds a registered object + clears registered factories + is an enumerable + includes a did_you_mean message + knows that an object is registered by string -looking up traits that don't exist - when the factory includes an invalid default trait - raises a KeyError including the factory name - maintains 'Did you mean?' suggestions at the end of the error message - when passing an invalid override trait - raises a KeyError - when a trait includes an invalid default trait - raises a KeyError including the factory name +FactoryBot::DeclarationList#attributes + defines each attribute on the attribute list + returns an AttributeList -global initialize_with - handles child initialize_with - handles base initialize_with - handles inline trait override - uses initialize_with globally across FactoryBot.define - handles child initialize_with with trait +FactoryBot::Factory when defined with a class instead of a name + has a name + has a build_class -initialize_with with FG attributes that are transient - name - is expected to eq "Handsome Chap from .construct" +FactoryBot::Factory when given a class that overrides #to_s + sets build_class correctly -an instance generated by a factory - registers the user factory +FactoryBot::DefinitionProxy#to_create + accepts a block to run in place of #save! -applying inline traits - applies traits only to the instance generated for that call +FactoryBot::DefinitionProxy#method_missing + declares an association when called with a ':factory' key + declares a dynamic attribute when called with a block + declares an implicit declaration when called without args or a block + raises a NoMethodError when called with a static-attribute-like argument -initialize_with with non-FG attributes - age - is expected to eq 21 - name - is expected to eq "John Doe" +FactoryBot::Strategy::Build + it should behave like strategy with strategy: :build + runs the factory with the correct overrides + finds the factory with the correct factory name + it should behave like strategy with association support + finds the factory with the correct factory name + runs the factory with the correct overrides + it should behave like strategy with callbacks + runs the callbacks [:after_build] with the evaluation's object + returns the object from the evaluation -binding a callback to multiple callbacks - does not bind the callback to building - binds the callback to stubbing - binds the callback to creation +Finished in 2.95 seconds (files took 0.77235 seconds to load) +291 examples, 0 failures -associations without overriding :strategy - when the :use_parent_strategy config option is set to true - uses the parent strategy on the association - when the :use_parent_strategy config option is set to false - uses the overridden strategy on the association +Randomized with seed 43963 -FactoryBot.rewind_sequences - does not collide with globally registered factories - allows setting sequences within identically named traits - resets inline sequences back to their starting value - still allows global sequences prefixed with a factory name - resets all sequences back to their starting values +/usr/bin/ruby3.3 -I/usr/share/rubygems-integration/all/gems/rspec-support-3.13.1/lib:/usr/share/rubygems-integration/all/gems/rspec-core-3.13.0/lib /usr/share/rubygems-integration/all/gems/rspec-core-3.13.0/exe/rspec --pattern spec/acceptance/\*\*/\*_spec.rb --format documentation -FactoryBot.lint - allows for selective linting - does not raise when all factories are valid - executes linting in an ActiveRecord::Base transaction - raises when a factory is invalid - factory strategy for linting - uses the requested strategy - uses the requested strategy during trait validation - trait validation - enabled - does not raise if a trait produces a valid object - raises if a trait produces an invalid object - disabled - does not raises if a trait produces an invalid object - verbose linting - prints the backtrace for each factory error +Randomized with seed 49407 initialize_with implicit constructor instantiates the correct object -sequences are evaluated in the correct context - invokes the correct method on the instance - builds a sequence calling sprintf correctly - invokes a method with no arguments on the instance - allows direct reference of a method in a sequence - -`attributes_for` for a class whose constructor has required params - [:name] - is expected to eq "John Doe" +a generated stub instance + allows increment + generates unique ids + assigns a default attribute + isn't changed + has an id + assigns associations that aren't new records + disables save + disables decrement! + disables update_attribute + isn't a new record + disables increment! + assigns an overridden attribute + disables reload + allows decrement + assigns associations + disables toggle! + disables connection + allows toggle + disables destroy defaulting `updated_at` - allows assignment of updated_at + doesn't allow setting updated_at on an object that doesn't define it is doesn't mark the object as changed + behaves the same as a non-stubbed updated_at + allows assignment of updated_at allows overriding updated_at for objects with updated_at - defaults updated_at for objects with updated_at doesn't add updated_at to objects who don't have the method - doesn't allow setting updated_at on an object that doesn't define it - behaves the same as a non-stubbed updated_at + defaults updated_at for objects with updated_at -initialize_with doesn't duplicate assignment on attributes accessed from initialize_with - instantiates the correct object +global callbacks + triggers after build callbacks for all factories + +an instance generated by a factory with multiple traits + child class with scoped trait and inherited trait + is expected to be admin + name + is expected to eq "Judy" + gender + is expected to eq "Female" + child factory created where trait attributes are inherited + gender + is expected to eq "Male" + date_of_birth + is expected to eq Sat, 01 Jan 2000 + the parent class + is expected not to be admin + gender + is expected to be nil + name + is expected to eq "John" + factory with trait defined multiple times + great + is expected to eq "GREAT!!!" + child factory redefining trait + great + is expected to eq "EVEN GREATER!!!" + the child class with one trait + is expected to be admin + gender + is expected to be nil + name + is expected to eq "John" + child factory using grandparents' trait + great + is expected to eq "GREAT!!!" + the child with multiple traits + is expected to be admin + name + is expected to eq "Jane" + gender + is expected to eq "Female" + factory created with alternate syntax for specifying trait + where trait name and attribute are the same and attribute is overridden + great + is expected to eq "SORT OF!!!" + where trait name and attribute are the same + great + is expected to eq "GREAT!!!" + gender + is expected to eq "Male" + the other child class with one trait + is expected not to be admin + name + is expected to eq "Jane" + gender + is expected to eq "Female" + the child with multiple traits who override the same attribute + when the female assigns name after male + is expected to be admin + gender + is expected to eq "Female" + name + is expected to eq "Jane" + when the male assigns name after female + is expected to be admin + name + is expected to eq "Joe" + gender + is expected to eq "Male" + factory using global trait + name + is expected to eq "Bill" + email + is expected to eq "Bill@example.com" + the child with multiple traits and overridden attributes + is expected to be admin + gender + is expected to be nil + name + is expected to eq "Jill" + factory with implicit traits called by child + calls the correct trait when child built first + calls the correct trait when parent built first + +multiple creates and transient attributes to dynamically build attribute lists + allows the number of posts to be modified + generates the correct number of posts + +initialize_with non-ORM-backed objects + generates random data + allows for overrides + +a custom create passing in an evaluator + passes the evaluator to the custom create block + +an instance generated by a factory with a custom class name + is expected to be a kind of User(id: integer, admin: boolean) + is expected to be admin calling methods on the model instance - with the referenced attribute being overridden + with the attribute being overridden + uses the overridden value uses the overridden value during attributes_for + with the referenced attribute being overridden uses the overridden value + uses the overridden value during attributes_for without the attribute being overridden + doesn't instantiate a record with attributes_for returns the correct value from the instance returns nil during attributes_for - doesn't instantiate a record with attributes_for - with the attribute being overridden - uses the overridden value during attributes_for - uses the overridden value -traits with callbacks - executes callbacks in the order assigned - when the factory has an implicit trait +defining a child factory before a parent + creates admin factories correctly + +calling `create` with a block + returns the created instance + passes the created instance + +callbacks using syntax methods without referencing FactoryBot explicitly + works when the callback has no variables + works when the callback has two variables + works when the callback has one variable + +modifying factories + raises an exception if the factory was not defined before + allows for overriding child classes + doesn't overwrite already defined child's attributes + simple modification + doesn't allow the factory to be subsequently defined + does allow the factory to be subsequently modified name - is expected to eq "JOHN" - when the factory has a trait passed via arguments + is expected to eq "Great User" + login + is expected to eq "GREAT USER" + redefining attributes + creating admin + without overrides + name + is expected to eq "Great User" + email + is expected to eq "Great User-modified@example.com" + admin + is expected to equal true + overriding the email + name + is expected to eq "Great User" + email + is expected to eq "perfect@example.com" + admin + is expected to equal true + overriding the name + email + is expected to eq "wonderful-modified@example.com" + name + is expected to eq "wonderful" + admin + is expected to equal true + creating user + overriding the name + name + is expected to eq "wonderful" + email + is expected to eq "wonderful-modified@example.com" + overriding the email + name + is expected to eq "Great User" + email + is expected to eq "perfect@example.com" + without overrides + email + is expected to eq "Great User-modified@example.com" + name + is expected to eq "Great User" + reusing traits + email + is expected to eq "Johnny Rockstar!!!@example.com" name - is expected to eq "JOHN" + is expected to eq "Johnny Rockstar!!!" + login + is expected to eq "JOHNNY ROCKSTAR!!!" + adding callbacks + name + is expected to eq "great user" + login + is expected to be nil -an instance generated by a factory with a custom class name - is expected to be a kind of User(id: integer, admin: boolean) - is expected to be admin +initialize_with for a constructor that requires a block + executes the block correctly -callbacks using Symbol#to_proc - runs the callback correctly +custom callbacks + runs a custom callback without prepending before or after when the proper strategy executes + runs a custom before callback when the proper strategy executes + runs a custom after callback when the proper strategy executes calling `attributes_for` with a block returns the hash of attributes passes the hash of attributes -initialize_with with an 'attributes' attribute - assigns attributes correctly +initialize_with doesn't duplicate assignment on attributes accessed from initialize_with + instantiates the correct object -a stubbed instance - assigns associations and acts as if it is saved - acts as if it came from the database +an instance generated by a factory that inherits from another factory + the parent class + is expected not to be admin + login + is expected to eq "john@example.com" + email + is expected to eq "john@example.com" + name + is expected to eq "John" + the child class redefining parent's attributes + is expected to be a kind of User(id: integer, name: string, admin: boolean, email: string, upper_email: string, login: string) + is expected to be admin + upper_email + is expected to eq "ADMIN@EXAMPLE.COM" + login + is expected to eq "admin@example.com" + name + is expected to eq "admin" + email + is expected to eq "admin@example.com" -transient sequences - increments sequences correctly +using ActiveSupport::Instrumentation to track compile_factory interaction + tracks proper time of compiling the factory + builds the correct payload + when factory with base traits + builds the correct payload + when factory with additional traits + builds the correct payload -callbacks using syntax methods without referencing FactoryBot explicitly - works when the callback has one variable - works when the callback has no variables - works when the callback has two variables +an instance generated by a factory + registers the user factory -global callbacks - triggers after build callbacks for all factories +traits with initialize_with + gives additional traits higher priority than base traits and factory definition + can apply initialize_with from the definition + gives base traits normal priority + gives additional traits higher priority than initialize_with from the definition + can apply initialize_with from traits + gives base traits lower priority than overrides + +association assignment from nested attributes + assigns the correct amount of comments when overridden + assigns the correct amount of comments + +global initialize_with + handles inline trait override + handles base initialize_with + uses initialize_with globally across FactoryBot.define + handles child initialize_with with trait + handles child initialize_with + +a generated attributes hash where order matters + factory without a parent + assigns attributes in the order they're defined without a parent class + factory with a parent + assigns attributes in the order they're defined global skip_create does not persist child records + honors inline trait to_create does not persist any record honors overridden to_create - honors inline trait to_create -a generated attributes hash where order matters - factory with a parent - assigns attributes in the order they're defined - factory without a parent - assigns attributes in the order they're defined without a parent class +setting private attributes + raises a NoMethodError -a stubbed instance overriding strategy - assigns associations and acts as if it is saved - acts as if it is saved in the database +initialize_with with a hash argument + builds the object correctly + +aliases and overrides + one + is expected to eq "override" + two + is expected to be nil traits and dynamic attributes that are applied simultaneously combined @@ -1762,583 +1933,448 @@ name is expected to eq "John" -custom callbacks - runs a custom callback without prepending before or after when the proper strategy executes - runs a custom before callback when the proper strategy executes - runs a custom after callback when the proper strategy executes +nested implicit traits + defined outside the factory + it should behave like assigning data from traits + assigns the correct values + defined inside the factory + it should behave like assigning data from traits + assigns the correct values -a built instance with strategy: :create - is expected to be new record - assigns and saves associations +initialize_with with non-FG attributes + name + is expected to eq "John Doe" + age + is expected to eq 21 -create multiple instances - without default attributes - uses the default factory values - creates all the posts - length - is expected to eq 2 +`attributes_for` for a class whose constructor has required params + [:name] + is expected to eq "John Doe" -association assignment from nested attributes - assigns the correct amount of comments when overridden - assigns the correct amount of comments +declaring attributes on a Factory that are private methods on Object + sleep + is expected to eq -5 + system + is expected to eq false + link + is expected to eq "http://example.com" -attribute aliases - assigning an association by passing factory - assigns attributes correctly - assigning an association by foreign key - doesn't assign both an association and its foreign key +attribute overrides + with no user posting + secure + is expected to be nil + with an admin posting + secure + is expected to eq false + with a non-admin posting + secure + is expected to be nil -defining methods inside FactoryBot - raises with a meaningful message +global to_create + handles child to_create + uses to_create globally across FactoryBot.define + handles child to_create with trait + handles base to_create + handles inline trait override initialize_with has access to all attributes for construction assigns attributes correctly -build multiple instances - with a block that receives both the object and an index - correctly uses the set value - with a block - correctly uses the set value - without default attributes - uses the default factory values - builds (but doesn't save) all the posts - length - is expected to eq 20 - with default attributes - overrides the default values +using ActiveSupport::Instrumentation to track run_factory interaction + tracks proper time of creating the record + builds the correct payload -associations - when building collection associations - builds the association according to the given strategy - when accidentally using an implicit declaration as an override - raises an error - when accidentally using an implicit declaration for the factory - raises an error - when building interrelated associations - assigns the instance passed as an association attribute - connects records with interdependent relationships +a stubbed instance overriding strategy + acts as if it is saved in the database + assigns associations and acts as if it is saved + +configuring the starting id + defines which id build_stubbed instances start with + +overridden primary keys conventions + a stubbed instance with a uuid primary key + behaves like a persisted record + builds a stubbed instance + has a uuid primary key + a stubbed instance with no id setter + builds a stubbed instance + a stubbed instance with no primary key + builds a stubbed instance + behaves like a persisted record + +calling `build` with a block + returns the built instance + passes the built instance accessing methods from the instance within a dynamic attribute that is also a private method on object more_format is expected to eq "format: This is an awesome format" -including FactoryBot::Syntax::Methods when custom strategies have been declared - allows adding additional strategies +traits with to_create + can apply to_create from the definition + gives base traits normal priority + gives additional traits higher priority than to_create from the definition + can apply to_create from traits + gives additional traits higher priority than base traits and factory definition + gives base traits lower priority than overrides -sequences - generates aliases for the sequence that reference the same block - generates few values of the sequence - generates several values in the correct format - generates aliases for the sequence that reference the same block and retains value - generates sequential numbers if no block is given +transient sequences + increments sequences correctly -making sure the factory is properly compiled the first time we want to instantiate it - can honor traits on the very first call +looking up traits that don't exist + when passing an invalid override trait + raises a KeyError + when the factory includes an invalid default trait + raises a KeyError including the factory name + maintains 'Did you mean?' suggestions at the end of the error message + when a trait includes an invalid default trait + raises a KeyError including the factory name + +an instance generated by a factory named a camel case string + registers the UserModel factory enum traits when automatically_define_enum_traits is false - raises an error for undefined traits builds traits for each enumerated value when traits_for_enum are specified + raises an error for undefined traits when automatically_define_enum_traits is true - builds traits for each enumerated value using a provided list of values as a Hash prefers user defined traits over automatically built traits + builds traits automatically for model enum field + builds traits for each enumerated value using a provided list of values as a Hash builds traits for each enumerated value using a provided list of values as an Array builds traits for each enumerated value using a custom enumerable - builds traits automatically for model enum field -callbacks - runs child callback after parent callback - runs both the after(:stub) callback on the factory and the inherited after(:stub) callback - runs the after(:stub) callback when stubbing - runs the after(:build) callback when building - runs both the after(:build) and after(:create) callbacks when creating - -associations overriding :strategy - uses the overridden create strategy to create the association - -skipping the default create - doesn't execute anything when creating the instance - -syntax methods within dynamic attributes - can access methods already existing on the class - can access syntax methods from dynamic attributes - allows syntax methods to be used when the block has an arity of 1 - can access syntax methods from dynamic attributes - -declaring attributes on a Factory that are private methods on Object - system - is expected to eq false - link - is expected to eq "http://example.com" - sleep - is expected to eq -5 - -an instance generated by a factory that inherits from another factory - the child class redefining parent's attributes - is expected to be a kind of User(id: integer, name: string, admin: boolean, email: string, upper_email: string, login: string) - is expected to be admin - email - is expected to eq "admin@example.com" - name - is expected to eq "admin" - upper_email - is expected to eq "ADMIN@EXAMPLE.COM" - login - is expected to eq "admin@example.com" - the parent class - is expected not to be admin - name - is expected to eq "John" - login - is expected to eq "john@example.com" - email - is expected to eq "john@example.com" - -modifying inherited factories with traits - returns the correct value for overridden attributes from traits defining multiple attributes - allows modification of attributes created via traits - returns the correct value for overridden attributes from traits - -modifying factories - allows for overriding child classes - doesn't overwrite already defined child's attributes - raises an exception if the factory was not defined before - adding callbacks - login - is expected to be nil - name - is expected to eq "great user" - simple modification - doesn't allow the factory to be subsequently defined - does allow the factory to be subsequently modified - name - is expected to eq "Great User" - login - is expected to eq "GREAT USER" - redefining attributes - creating user - without overrides - name - is expected to eq "Great User" - email - is expected to eq "Great User-modified@example.com" - overriding the name - name - is expected to eq "wonderful" - email - is expected to eq "wonderful-modified@example.com" - overriding the email - email - is expected to eq "perfect@example.com" - name - is expected to eq "Great User" - creating admin - overriding the name - email - is expected to eq "wonderful-modified@example.com" - admin - is expected to equal true - name - is expected to eq "wonderful" - without overrides - email - is expected to eq "Great User-modified@example.com" - admin - is expected to equal true - name - is expected to eq "Great User" - overriding the email - name - is expected to eq "Great User" - email - is expected to eq "perfect@example.com" - admin - is expected to equal true - reusing traits - email - is expected to eq "Johnny Rockstar!!!@example.com" - login - is expected to eq "JOHNNY ROCKSTAR!!!" - name - is expected to eq "Johnny Rockstar!!!" - -nested factories with different parents - honors :parent over the factory block nesting +create multiple instances + without default attributes + creates all the posts + uses the default factory values + length + is expected to eq 2 -a custom create passing in an evaluator - passes the evaluator to the custom create block +when a self-referential trait is defined + raises a TraitDefinitionError + raises a TraitDefinitionError -configuring the starting id - defines which id build_stubbed instances start with +making sure the factory is properly compiled the first time we want to instantiate it + can honor traits on the very first call -setting private attributes - raises a NoMethodError +register custom strategies + allows using the *_pair method to build a list using a custom strategy + allows using the *_list method to build a list using a custom strategy + allows adding additional strategies + allows overriding default strategies -initialize_with with a hash argument - builds the object correctly +attribute aliases + assigning an association by foreign key + doesn't assign both an association and its foreign key + assigning an association by passing factory + assigns attributes correctly -using ActiveSupport::Instrumentation to track run_factory interaction - builds the correct payload - tracks proper time of creating the record +callbacks + runs both the after(:stub) callback on the factory and the inherited after(:stub) callback + runs child callback after parent callback + runs the after(:stub) callback when stubbing + runs the after(:build) callback when building + runs both the after(:build) and after(:create) callbacks when creating -traits with initialize_with - can apply initialize_with from the definition - gives base traits lower priority than overrides - gives additional traits higher priority than base traits and factory definition - can apply initialize_with from traits - gives additional traits higher priority than initialize_with from the definition - gives base traits normal priority +a generated attributes hash + assigns a default value + assigns a lazy, dependent attribute + doesn't assign associations + assigns an overridden value assigning overrides that are also private methods on object - y - is expected to eq 12345 format is expected to eq "Great" more_format is expected to eq "format: Great" + y + is expected to eq 12345 some_funky_method is expected to eq "foobar!" -transient attributes - with a transient variable assigned - generates the correct attributes on a groupie - generates the correct attributes on a rockstar - generates the correct attributes on an upcased rockstar - generates the correct attributes on a rockstar with a name - returning attributes for a factory - is expected to have key :name - is expected not to have key :upcased - is expected not to have key :rockstar - is expected not to have key :four - is expected to have key :email - without transient variables assigned - uses the default value of the attribute - -a custom create - uses the custom create block instead of save - -create multiple instances - with default attributes - overrides the default values - with a block that receives both the object and an index - uses the new values - with a block - uses the new values - without the count - raise ArgumentError with the proper error message - without default attributes - uses the default factory values - creates all the posts - length - is expected to eq 20 - -initialize_with parent and child factories - allows child factories to override initialize_with - uses the parent's constructor when the child factory doesn't assign it - traits added via strategy adding traits in create_list creates all the records length is expected to eq 2 - adding traits in build_stubbed - name - is expected to eq "Jack" - admin - is expected to equal true - adding traits in build_list - builds all the records - length - is expected to eq 2 adding traits in create doesn't modify the user factory + admin + is expected to equal true name is expected to eq "JOE" + adding traits in build admin is expected to equal true + name + is expected to eq "Joe" adding traits in attributes_for [:name] is expected to eq "John" [:admin] is expected to equal true - adding traits in build - name - is expected to eq "Joe" + adding traits in build_stubbed admin is expected to equal true + name + is expected to eq "Jack" + adding traits in build_list + builds all the records + length + is expected to eq 2 -attributes defined using Symbol#to_proc - assigns values correctly - assigns value with override correctly - assigns overridden value correctly +associations overriding :strategy + uses the overridden create strategy to create the association -global to_create - handles child to_create - handles inline trait override - handles child to_create with trait - uses to_create globally across FactoryBot.define - handles base to_create +initialize_with with FG attributes that are transient + name + is expected to eq "Handsome Chap from .construct" + +applying inline traits + applies traits only to the instance generated for that call + +defaulting `created_at` + doesn't allow setting created_at on an object that doesn't define it + allows assignment of created_at + defaults created_at for objects with created_at + is doesn't mark the object as changed + doesn't add created_at to objects who don't have the method + allows overriding created_at for objects with created_at + behaves the same as a non-stubbed created_at + +transient attributes + without transient variables assigned + uses the default value of the attribute + with a transient variable assigned + generates the correct attributes on a rockstar with a name + generates the correct attributes on a rockstar + generates the correct attributes on a groupie + generates the correct attributes on an upcased rockstar + returning attributes for a factory + is expected to have key :email + is expected to have key :name + is expected not to have key :four + is expected not to have key :upcased + is expected not to have key :rockstar + +binding a callback to multiple callbacks + binds the callback to stubbing + does not bind the callback to building + binds the callback to creation + +defaulting `id` + allows overriding id + +assigning values from a transient attribute + does not ignore an _id attribute that is an alias for a transient attribute + +implicit traits containing callbacks + only runs the callback once + +Ruby 3.0: attributes_for destructuring syntax + supports being destructured + +including FactoryBot::Syntax::Methods when custom strategies have been declared + allows adding additional strategies trait indifferent access when trait is defined as integer can be invoked with a string can be invoked with as integer when trait is defined as a string - can be invoked with a string can be invoked with a symbol + can be invoked with a string when trait is defined as a symbol - can be invoked with a symbol can be invoked with a string + can be invoked with a symbol when trait is defined as struct can be invoked with a struct can be invoked with a string -defaulting `created_at` - behaves the same as a non-stubbed created_at - allows assignment of created_at - allows overriding created_at for objects with created_at - defaults created_at for objects with created_at - doesn't allow setting created_at on an object that doesn't define it - is doesn't mark the object as changed - doesn't add created_at to objects who don't have the method - -when a self-referential trait is defined - raises a TraitDefinitionError - raises a TraitDefinitionError - -register custom strategies - allows using the *_pair method to build a list using a custom strategy - allows using the *_list method to build a list using a custom strategy - allows overriding default strategies - allows adding additional strategies +modifying inherited factories with traits + allows modification of attributes created via traits + returns the correct value for overridden attributes from traits defining multiple attributes + returns the correct value for overridden attributes from traits -an instance generated by a factory with multiple traits - child factory using grandparents' trait - great - is expected to eq "GREAT!!!" - factory with implicit traits called by child - calls the correct trait when child built first - calls the correct trait when parent built first - the child with multiple traits who override the same attribute - when the female assigns name after male - is expected to be admin - name - is expected to eq "Jane" - gender - is expected to eq "Female" - when the male assigns name after female - is expected to be admin - gender - is expected to eq "Male" - name - is expected to eq "Joe" - the child class with one trait - is expected to be admin - name - is expected to eq "John" - gender - is expected to be nil - child class with scoped trait and inherited trait - is expected to be admin - name - is expected to eq "Judy" - gender - is expected to eq "Female" - factory created with alternate syntax for specifying trait - where trait name and attribute are the same - great - is expected to eq "GREAT!!!" - where trait name and attribute are the same and attribute is overridden - great - is expected to eq "SORT OF!!!" - gender - is expected to eq "Male" - the child with multiple traits - is expected to be admin - name - is expected to eq "Jane" - gender - is expected to eq "Female" - the child with multiple traits and overridden attributes - is expected to be admin - name - is expected to eq "Jill" - gender - is expected to be nil - factory using global trait - email - is expected to eq "Bill@example.com" - name - is expected to eq "Bill" - child factory created where trait attributes are inherited - date_of_birth - is expected to eq Sat, 01 Jan 2000 - gender - is expected to eq "Male" - the other child class with one trait - is expected not to be admin - gender - is expected to eq "Female" +traits with callbacks + executes callbacks in the order assigned + when the factory has a trait passed via arguments name - is expected to eq "Jane" - the parent class - is expected not to be admin + is expected to eq "JOHN" + when the factory has an implicit trait name - is expected to eq "John" - gender - is expected to be nil - factory with trait defined multiple times - child factory redefining trait - great - is expected to eq "EVEN GREATER!!!" - great - is expected to eq "GREAT!!!" + is expected to eq "JOHN" -initialize_with non-ORM-backed objects - allows for overrides - generates random data +create multiple instances + with a block that receives both the object and an index + uses the new values + without default attributes + creates all the posts + uses the default factory values + length + is expected to eq 20 + without the count + raise ArgumentError with the proper error message + with a block + uses the new values + with default attributes + overrides the default values -attribute overrides - with an admin posting - secure - is expected to eq false - with no user posting - secure - is expected to be nil - with a non-admin posting - secure - is expected to be nil +a created instance + is expected not to be new record + assigns and saves associations -reload - does not reset the value of use_parent_strategy +FactoryBot.lint + executes linting in an ActiveRecord::Base transaction + raises when a factory is invalid + allows for selective linting + does not raise when all factories are valid + verbose linting + prints the backtrace for each factory error + trait validation + enabled + raises if a trait produces an invalid object + does not raise if a trait produces a valid object + disabled + does not raises if a trait produces an invalid object + factory strategy for linting + uses the requested strategy + uses the requested strategy during trait validation -traits with to_create - gives additional traits higher priority than base traits and factory definition - gives additional traits higher priority than to_create from the definition - can apply to_create from traits - gives base traits normal priority - can apply to_create from the definition - gives base traits lower priority than overrides +a stubbed instance + assigns associations and acts as if it is saved + acts as if it came from the database -using ActiveSupport::Instrumentation to track compile_factory interaction - tracks proper time of compiling the factory - builds the correct payload - when factory with additional traits - builds the correct payload - when factory with base traits - builds the correct payload +attributes defined using Symbol#to_proc + assigns overridden value correctly + assigns values correctly + assigns value with override correctly finding factories keyed by class instead of symbol doesn't find the factory -aliases and overrides - two - is expected to be nil - one - is expected to eq "override" - -defining a child factory before a parent - creates admin factories correctly - -inline traits overriding existing attributes - prefers inline traits over attributes on factories - returns the default status - prefers attributes on factories over attributes from non-inline traits - prefers inline trait attributes over traits on a factory - prefers traits on a factory over default attributes - prefers inline trait attributes over default attributes - prefers overridden attributes over attributes from traits, inline traits, or attributes on factories +sequences are evaluated in the correct context + invokes a method with no arguments on the instance + invokes the correct method on the instance + allows direct reference of a method in a sequence + builds a sequence calling sprintf correctly -a built instance - is expected to be new record - when the :use_parent_strategy config option is set to false - assigns and saves associations - when the :use_parent_strategy config option is set to true - assigns but does not save associations +a custom create + uses the custom create block instead of save -multiple creates and transient attributes to dynamically build attribute lists - allows the number of posts to be modified - generates the correct number of posts +initialize_with parent and child factories + uses the parent's constructor when the child factory doesn't assign it + allows child factories to override initialize_with -overridden primary keys conventions - a stubbed instance with no id setter - builds a stubbed instance - a stubbed instance with a uuid primary key - behaves like a persisted record - has a uuid primary key - builds a stubbed instance - a stubbed instance with no primary key - builds a stubbed instance - behaves like a persisted record +associations + when accidentally using an implicit declaration as an override + raises an error + when accidentally using an implicit declaration for the factory + raises an error + when building interrelated associations + assigns the instance passed as an association attribute + connects records with interdependent relationships + when building collection associations + builds the association according to the given strategy -a generated stub instance - allows increment - disables connection - assigns a default attribute - disables increment! - has an id - isn't a new record - assigns associations - disables update_attribute - disables destroy - assigns associations that aren't new records - generates unique ids - allows decrement - disables save - allows toggle - disables decrement! - disables reload - disables toggle! - assigns an overridden attribute - isn't changed +traits used in associations + allows inline traits with the default association + allows inline traits with a specific factory for an association + allows assigning traits for the factory of an association -calling `build` with a block - returns the built instance - passes the built instance +associations without overriding :strategy + when the :use_parent_strategy config option is set to true + uses the parent strategy on the association + when the :use_parent_strategy config option is set to false + uses the overridden strategy on the association -implicit traits containing callbacks - only runs the callback once +build multiple instances + with a block that receives both the object and an index + correctly uses the set value + without default attributes + builds (but doesn't save) all the posts + uses the default factory values + length + is expected to eq 20 + with a block + correctly uses the set value + with default attributes + overrides the default values -assigning values from a transient attribute - does not ignore an _id attribute that is an alias for a transient attribute +a created instance, specifying strategy: :build + saves associations (strategy: :build only affects build, not create) -an instance generated by a factory named a camel case string - registers the UserModel factory +nested factories with different parents + honors :parent over the factory block nesting -traits used in associations - allows inline traits with the default association - allows inline traits with a specific factory for an association - allows assigning traits for the factory of an association +calling `build_stubbed` with a block + returns the stub instance + passes the stub instance -a generated attributes hash - assigns a default value - assigns a lazy, dependent attribute - doesn't assign associations - assigns an overridden value +initialize_with with an 'attributes' attribute + assigns attributes correctly -nested implicit traits - defined outside the factory - it should behave like assigning data from traits - assigns the correct values - defined inside the factory - it should behave like assigning data from traits - assigns the correct values +sequences + generates few values of the sequence + generates aliases for the sequence that reference the same block and retains value + generates sequential numbers if no block is given + generates aliases for the sequence that reference the same block + generates several values in the correct format -Ruby 3.0: attributes_for destructuring syntax - supports being destructured +reload + does not reset the value of use_parent_strategy #add_attribute assigns attributes for reserved words on .attributes_for assigns attributes for reserved words on .build -a created instance +skipping the default create + doesn't execute anything when creating the instance + +defining methods inside FactoryBot + raises with a meaningful message + +FactoryBot.rewind_sequences + does not collide with globally registered factories + allows setting sequences within identically named traits + resets all sequences back to their starting values + resets inline sequences back to their starting value + still allows global sequences prefixed with a factory name + +a built instance + is expected to be new record + when the :use_parent_strategy config option is set to false + assigns and saves associations + when the :use_parent_strategy config option is set to true + assigns but does not save associations + +syntax methods within dynamic attributes + can access syntax methods from dynamic attributes + allows syntax methods to be used when the block has an arity of 1 + can access syntax methods from dynamic attributes + can access methods already existing on the class + +callbacks using Symbol#to_proc + runs the callback correctly + +inline traits overriding existing attributes + prefers overridden attributes over attributes from traits, inline traits, or attributes on factories + prefers traits on a factory over default attributes + prefers inline traits over attributes on factories + returns the default status + prefers inline trait attributes over traits on a factory + prefers inline trait attributes over default attributes + prefers attributes on factories over attributes from non-inline traits + +a built instance with strategy: :create assigns and saves associations - is expected not to be new record + is expected to be new record -Finished in 3.99 seconds (files took 0.55077 seconds to load) +Finished in 9.9 seconds (files took 1.23 seconds to load) 374 examples, 0 failures -Randomized with seed 46120 +Randomized with seed 49407 mv ./.gem2deb.Gemfile.lock Gemfile.lock @@ -2373,12 +2409,14 @@ dpkg-buildpackage: info: binary-only upload (no source included) dpkg-genchanges: info: including full source code in upload I: copying local configuration +I: user script /srv/workspace/pbuilder/2163657/tmp/hooks/B01_cleanup starting +I: user script /srv/workspace/pbuilder/2163657/tmp/hooks/B01_cleanup finished I: unmounting dev/ptmx filesystem I: unmounting dev/pts filesystem I: unmounting dev/shm filesystem I: unmounting proc filesystem I: unmounting sys filesystem I: cleaning the build env -I: removing directory /srv/workspace/pbuilder/1678863 and its subdirectories -I: Current time: Tue Apr 7 20:01:14 -12 2026 -I: pbuilder-time-stamp: 1775635274 +I: removing directory /srv/workspace/pbuilder/2163657 and its subdirectories +I: Current time: Thu Mar 6 15:40:44 +14 2025 +I: pbuilder-time-stamp: 1741225244