Diff of the two buildlogs: -- --- b1/build.log 2024-01-07 03:31:36.468785028 +0000 +++ b2/build.log 2024-01-07 03:32:27.806524320 +0000 @@ -1,6 +1,6 @@ I: pbuilder: network access will be disabled during build -I: Current time: Fri Feb 7 21:53:05 -12 2025 -I: pbuilder-time-stamp: 1739008385 +I: Current time: Sun Jan 7 17:31:39 +14 2024 +I: pbuilder-time-stamp: 1704598299 I: Building the build Environment I: extracting base tarball [/var/cache/pbuilder/bookworm-reproducible-base.tgz] I: copying local configuration @@ -29,49 +29,81 @@ 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/2625350/tmp/hooks/D02_print_environment starting +I: user script /srv/workspace/pbuilder/1319973/tmp/hooks/D01_modify_environment starting +debug: Running on codethink02-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 Jan 7 03:31 /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/1319973/tmp/hooks/D01_modify_environment finished +I: user script /srv/workspace/pbuilder/1319973/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]="15" [3]="1" [4]="release" [5]="aarch64-unknown-linux-gnu") + BASH_VERSION='5.2.15(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='bookworm' - HOME='/root' - HOST_ARCH='arm64' + DIRSTACK=() + DISTRIBUTION=bookworm + EUID=0 + FUNCNAME=([0]="Echo" [1]="main") + GROUPS=() + HOME=/root + HOSTNAME=i-capture-the-hostname + HOSTTYPE=aarch64 + HOST_ARCH=arm64 IFS=' ' - INVOCATION_ID='e48134daeb204955981b790424d5e78d' - 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='2625350' - PS1='# ' - PS2='> ' + INVOCATION_ID=172484d65ebf4556af8f3b474ff216fd + 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=1319973 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.1EcEXv4f/pbuilderrc_eIF6 --distribution bookworm --hookdir /etc/pbuilder/first-build-hooks --debbuildopts -b --basetgz /var/cache/pbuilder/bookworm-reproducible-base.tgz --buildresult /srv/reproducible-results/rbuild-debian/r-b-build.1EcEXv4f/b1 --logfile b1/build.log ruby-factory-bot_6.2.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.104: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.1EcEXv4f/pbuilderrc_2zh1 --distribution bookworm --hookdir /etc/pbuilder/rebuild-hooks --debbuildopts -b --basetgz /var/cache/pbuilder/bookworm-reproducible-base.tgz --buildresult /srv/reproducible-results/rbuild-debian/r-b-build.1EcEXv4f/b2 --logfile b2/build.log ruby-factory-bot_6.2.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.104:3128 I: uname -a - Linux codethink01-arm64 6.1.0-17-cloud-arm64 #1 SMP Debian 6.1.69-1 (2023-12-30) aarch64 GNU/Linux + Linux i-capture-the-hostname 6.1.0-17-cloud-arm64 #1 SMP Debian 6.1.69-1 (2023-12-30) aarch64 GNU/Linux I: ls -l /bin total 7104 -rwxr-xr-x 1 root root 1346480 Apr 23 2023 bash @@ -129,15 +161,15 @@ -rwxr-xr-x 1 root root 68456 Sep 20 2022 readlink -rwxr-xr-x 1 root root 68592 Sep 20 2022 rm -rwxr-xr-x 1 root root 68480 Sep 20 2022 rmdir - -rwxr-xr-x 1 root root 68392 Jul 28 2023 run-parts + -rwxr-xr-x 1 root root 68392 Jul 28 23:46 run-parts -rwxr-xr-x 1 root root 134536 Jan 5 2023 sed - lrwxrwxrwx 1 root root 4 Jan 5 2023 sh -> dash + lrwxrwxrwx 1 root root 9 Jan 7 03:31 sh -> /bin/bash -rwxr-xr-x 1 root root 68432 Sep 20 2022 sleep -rwxr-xr-x 1 root root 134088 Sep 20 2022 stty -rwsr-xr-x 1 root root 133312 Mar 23 2023 su -rwxr-xr-x 1 root root 68448 Sep 20 2022 sync -rwxr-xr-x 1 root root 539896 Apr 6 2023 tar - -rwxr-xr-x 1 root root 67904 Jul 28 2023 tempfile + -rwxr-xr-x 1 root root 67904 Jul 28 23:46 tempfile -rwxr-xr-x 1 root root 134160 Sep 20 2022 touch -rwxr-xr-x 1 root root 68384 Sep 20 2022 true -rwxr-xr-x 1 root root 67664 Mar 23 2023 ulockmgr_server @@ -157,7 +189,7 @@ -rwxr-xr-x 1 root root 2206 Apr 10 2022 zless -rwxr-xr-x 1 root root 1842 Apr 10 2022 zmore -rwxr-xr-x 1 root root 4577 Apr 10 2022 znew -I: user script /srv/workspace/pbuilder/2625350/tmp/hooks/D02_print_environment finished +I: user script /srv/workspace/pbuilder/1319973/tmp/hooks/D02_print_environment finished -> Attempting to satisfy build-dependencies -> Creating pbuilder-satisfydepends-dummy package Package: pbuilder-satisfydepends-dummy @@ -351,7 +383,7 @@ Get: 140 http://deb.debian.org/debian bookworm/main arm64 ruby-rspec-its all 1.3.0-1 [6864 B] Get: 141 http://deb.debian.org/debian bookworm/main arm64 ruby-sqlite3 arm64 1.4.2-4+b3 [41.4 kB] Get: 142 http://deb.debian.org/debian bookworm/main arm64 ruby-timecop all 0.9.6-1 [10.3 kB] -Fetched 46.9 MB in 1s (63.7 MB/s) +Fetched 46.9 MB in 0s (127 MB/s) debconf: delaying package configuration, since apt-utils is not installed Selecting previously unselected package libpython3.11-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 ... 18171 files and directories currently installed.) @@ -818,8 +850,8 @@ Setting up tzdata (2023c-5+deb12u1) ... Current default time zone: 'Etc/UTC' -Local time is now: Sat Feb 8 09:53:46 UTC 2025. -Universal Time is now: Sat Feb 8 09:53:46 UTC 2025. +Local time is now: Sun Jan 7 03:32:00 UTC 2024. +Universal Time is now: Sun Jan 7 03:32:00 UTC 2024. Run 'dpkg-reconfigure tzdata' if you wish to change it. Setting up autotools-dev (20220109.1) ... @@ -949,7 +981,11 @@ Building tag database... -> Finished parsing the build-deps I: Building the package -I: Running cd /build/reproducible-path/ruby-factory-bot-6.2.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.2.1-1_source.changes +I: user script /srv/workspace/pbuilder/1319973/tmp/hooks/A99_set_merged_usr starting +Not re-configuring usrmerge for bookworm +I: user script /srv/workspace/pbuilder/1319973/tmp/hooks/A99_set_merged_usr finished +hostname: Name or service not known +I: Running cd /build/reproducible-path/ruby-factory-bot-6.2.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.2.1-1_source.changes dpkg-buildpackage: info: source package ruby-factory-bot dpkg-buildpackage: info: source version 6.2.1-1 dpkg-buildpackage: info: source distribution unstable @@ -978,7 +1014,7 @@ dh_prep -O--buildsystem=ruby dh_auto_install --destdir=debian/ruby-factory-bot/ -O--buildsystem=ruby dh_ruby --install /build/reproducible-path/ruby-factory-bot-6.2.1/debian/ruby-factory-bot -/usr/bin/ruby3.1 -S gem build --config-file /dev/null --verbose /tmp/d20250207-2635877-nw0nvd/gemspec +/usr/bin/ruby3.1 -S gem build --config-file /dev/null --verbose /tmp/d20240107-1327227-9gaz5l/gemspec Failed to load /dev/null because it doesn't contain valid YAML hash WARNING: open-ended dependency on activesupport (>= 5.0.0) is not recommended if activesupport is semantically versioned, use: @@ -1008,7 +1044,7 @@ Name: factory_bot Version: 6.2.1 File: factory_bot-6.2.1.gem -/usr/bin/ruby3.1 -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/d20250207-2635877-nw0nvd/factory_bot-6.2.1.gem +/usr/bin/ruby3.1 -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/d20240107-1327227-9gaz5l/factory_bot-6.2.1.gem Failed to load /dev/null because it doesn't contain valid YAML hash /build/reproducible-path/ruby-factory-bot-6.2.1/debian/ruby-factory-bot/usr/share/rubygems-integration/all/gems/factory_bot-6.2.1/lib/factory_bot.rb /build/reproducible-path/ruby-factory-bot-6.2.1/debian/ruby-factory-bot/usr/share/rubygems-integration/all/gems/factory_bot-6.2.1/lib/factory_bot/aliases.rb @@ -1093,522 +1129,522 @@ mv Gemfile.lock ./.gem2deb.Gemfile.lock /usr/bin/ruby3.1 -I/usr/share/rubygems-integration/all/gems/rspec-support-3.12.0/lib:/usr/share/rubygems-integration/all/gems/rspec-core-3.12.0/lib /usr/share/rubygems-integration/all/gems/rspec-core-3.12.0/exe/rspec --pattern spec/\{\*_spec.rb,factory_bot/\*\*/\*_spec.rb\} --format documentation -Randomized with seed 11208 +Randomized with seed 62923 -FactoryBot::DefinitionProxy#transient - makes all attributes added ignored +FactoryBot::EvaluatorClassDefiner + only instance_execs the block once even when returning nil + sets attributes on the evaluator class + evaluates the block in the context of the evaluator + returns an evaluator when accessing the evaluator class + adds each attribute to the evaluator + with a custom evaluator as a parent class + bases its attribute lists on itself and its parent evaluator + +FactoryBot::AttributeList#apply_attributes + adds attributes in the order defined + +FactoryBot::Decorator::AttributeHash + #attributes + returns a hash of attributes + with an attribute called 'attributes' + does not call itself recursively FactoryBot::DefinitionProxy#add_attribute declares a dynamic attribute on the factory when the proxy respects attributes declares a dynamic attribute on the factory when the proxy ignores attributes -FactoryBot::Callback - runs its block with two parameters - converts strings to symbols - runs its block with one parameter - runs its block with no parameters - has a name - -definition loading - 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 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 several factories files under test/factories in non-alphabetical order - loads the files in the right order - with deeply nested factory files under spec - it should behave like finds definitions - is expected to load definitions from spec/factories/subdirectory/person_factory.rb - is expected to load definitions from spec/factories/subdirectory/post_factory.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 a factories file under test/factories - it should behave like finds definitions - is expected to load definitions from test/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 several factories files under spec/factories in non-alphabetical order - loads the files in the right order - 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 factories.rb - it should behave like finds definitions - is expected to load definitions from factories.rb - with a factories file under test - it should behave like finds definitions - is expected to load definitions from test/factories.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 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 - -FactoryBot::Attribute - is not an association - converts the name attribute to a symbol - -FactoryBot::Factory when given a class that overrides #to_s - sets build_class correctly - -FactoryBot::Factory human names - parses human names with underscores - parses human names with aliases - parses names with underscores - parses human names with big letters - parses names with aliases - parses human names without underscores - parses names with big letters - parses names without underscores - -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::Factory when defined with a class instead of a name - has a build_class - has a name +FactoryBot::Sequence + a custom sequence and scope increments within the correct scope + 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 + 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 + 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 + 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 the 2nd value after being incremented + 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 its first value + has a next value equal to the 1st value after rewinding + 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 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 aliases using default value + has the expected names as its names + 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 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::Declaration::Association +FactoryBot::Declaration::Implicit + with a known sequence + creates a sequence attribute + does not create an assocition attribute + with a known factory + creates an association attribute + has the correct factory name #== - when the names are different + when one is ignored and the other isn't the objects are NOT equal - when the options are different + when the factories are different the objects are NOT 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 attributes are equal the objects are equal -FactoryBot::DefinitionProxy#factory - with options - with a block - without options +FactoryBot::DeclarationList#attributes + returns an AttributeList + defines each attribute on the attribute list -FactoryBot::AttributeList filter based on ignored attributes - filters #non_ignored attributes - filters #ignored attributes +FactoryBot::AttributeList#associations + returns associations -FactoryBot::Decorator::DisallowsDuplicatesRegistry - raises when attempting to #register a previously registered strategy - delegates #register to the registry when not registered +FactoryBot::Factory human names + parses human names without underscores + parses names with aliases + parses names with big letters + parses names with underscores + parses human names with big letters + parses human names with aliases + parses human names with underscores + parses names without underscores -FactoryBot::DefinitionProxy#trait - declares a trait +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::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::Attribute::Sequence assigns the next value in the sequence name is expected to eq :first_name -FactoryBot::DefinitionProxy#to_create - accepts a block to run in place of #save! +FactoryBot + finds a registered strategy + .use_parent_strategy + is true by default FactoryBot aliases - for an attribute should include the original attribute and a version suffixed with '_id' 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::NullFactory - has FactoryBot::Evaluator as its evaluator class - has a nil value for its compile attribute - delegates callbacks to its definition - delegates defined traits to its definition - delegates attributes to its definition - delegates constructor to its definition - has an instance of FactoryBot::AttributeList for its attributes attribute - has a nil value for its class_name attribute +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::AttributeList#define_attribute with a named attribute list raises when the attribute is a self-referencing association does not raise when the attribute is not a self-referencing association -FactoryBot::DefinitionProxy#method_missing - declares a dynamic attribute when called with a block - raises a NoMethodError when called with a static-attribute-like argument (PENDING: No reason given) - declares an implicit declaration when called without args or a block - declares an association when called with a ':factory' key - -FactoryBot::Strategy::Build - it should behave like strategy with strategy: :build - finds the factory with the correct factory name - runs the factory with the correct overrides - it should behave like strategy with callbacks - returns the object from the evaluation - runs the callbacks [:after_build] 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 - -FactoryBot::Factory with a name ending in s - has a build class - has a name +FactoryBot::DefinitionProxy#transient + makes all attributes added ignored -FactoryBot::AttributeList#apply_attributes - adds attributes in the order defined +FactoryBot::Internal + .register_factory + registers the provided factory + returns the registered factory + .sequence_by_name + finds a registered sequence + .factory_by_name + finds a registered factory + .trait_by_name + finds a previously registered trait + .register_strategy + register the provided strategy name with the class + .register_sequence + returns the registered sequence + registers the provided sequence + .rewind_sequences + rewinds the sequences and the internal sequences + .strategy_by_name + finds a registered strategy + .factory_by_name + finds a registered factory + .register_factory + registers the provided factory + returns the registered factory + .register_trait + registers the provided trait + returns the registered trait FactoryBot::Strategy::Stub - 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 + finds the factory with the correct factory name asking for a result - is expected not to be destroyed is expected to be persisted - assigns created_at is expected not to be new record - overriding persistence method: #destroy! + is expected not to be destroyed + assigns created_at + overriding persistence method: #delete + raises an informative error if the method is called + overrides the method with any arity + overriding persistence method: #save! + 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: #update_column raises an informative error if the method is called overrides the method with any arity - overriding persistence method: #toggle! + overriding persistence method: #update_attribute overrides the method with any arity raises an informative error if the method is called - overriding persistence method: #save! - raises an informative error if the method is called + overriding persistence method: #touch overrides the method with any arity - overriding persistence method: #reload + 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: #connection + overriding persistence method: #update_attributes! raises an informative error if the method is called overrides the method with any arity - overriding persistence method: #update + overriding persistence method: #toggle! raises an informative error if the method is called overrides the method with any arity - overriding persistence method: #touch + overriding persistence method: #increment! raises an informative error if the method is called overrides the method with any arity overriding persistence method: #update! overrides the method with any arity raises an informative error if the method is called - overriding persistence method: #decrement! + overriding persistence method: #connection overrides the method with any arity raises an informative error if the method is called - overriding persistence method: #destroy + overriding persistence method: #update 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 + overriding persistence method: #decrement! overrides the method with any arity - overriding persistence method: #increment! raises an informative error if the method is called - overrides the method with any arity - overriding persistence method: #update_attributes! - overrides the method with any arity + overriding persistence method: #reload raises an informative error if the method is called - overriding persistence method: #update_attributes overrides the method with any arity + overriding persistence method: #destroy! raises an informative error if the method is called - overriding persistence method: #update_attribute + overrides the method with any arity + overriding persistence method: #destroy raises an informative error if the method is called overrides the method with any arity overriding persistence method: #update_columns - overrides the method with any arity - raises an informative error if the method is called - overriding persistence method: #save raises an informative error if the method is called overrides the method with any arity + 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_stub] with the evaluation's object -FactoryBot::AttributeList#associations - returns associations +FactoryBot::DefinitionProxy#initialize_with + defines the constructor on the definition -FactoryBot::Declaration::Dynamic - #== - when the blocks are different - the objects are NOT equal - when comparing against another type of object - the objects are NOT equal - 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 attributes are equal - the objects are equal +FactoryBot::AttributeList filter based on ignored attributes + filters #ignored attributes + filters #non_ignored attributes -FactoryBot::DefinitionProxy adding callbacks - adding both an :after_stub and an :after_create callback succeeds - adding both an :after_stub and a :before_create callback succeeds - adding an :after_build callback succeeds - adding an :after_create callback succeeds - adding an :after_stub callback succeeds - adding both a :before_stub and a :before_create callback succeeds +FactoryBot::Registry + adds and returns the object registered + knows when an object is not registered + clears registered factories + finds a registered object + is an enumerable + does not include duplicate objects with registered under different names + finds a registered object with square brackets + raises when an object cannot be found + iterates registered objects + knows that an object is registered by string + includes a did_you_mean message + knows that an object is registered by symbol -FactoryBot::Attribute::Dynamic +FactoryBot::Strategy::Build + it should behave like strategy with callbacks + runs the callbacks [:after_build] with the evaluation's object + returns the object from the evaluation + it should behave like strategy with strategy: :build + finds the factory with the correct factory name + runs the factory with the correct overrides + it should behave like strategy with association support + runs the factory with the correct overrides + finds the factory with the correct factory name + +FactoryBot::Decorator::DisallowsDuplicatesRegistry + raises when attempting to #register a previously registered strategy + delegates #register to the registry when not registered + +FactoryBot::Factory with a name ending in s + has a name + has a build class + +FactoryBot::Attribute + is not an association + converts the name attribute to a symbol + +FactoryBot::Factory when given a class that overrides #to_s + sets build_class correctly + +FactoryBot::Attribute::Association with a string name name - is expected to eq :first_name - with a block returning its block-level variable - returns self when executing the proc + is expected to eq :name + +FactoryBot::DefinitionProxy#sequence + creates a new sequence with an overridden starting vaue + creates a new sequence with a block + creates a new sequence starting at 1 + +FactoryBot::NullFactory + has FactoryBot::Evaluator as its evaluator class + delegates constructor to its definition + has a nil value for its compile attribute + has a nil value for its class_name attribute + delegates attributes to its definition + delegates callbacks to its definition + delegates defined traits to its definition + has an instance of FactoryBot::AttributeList for its attributes attribute + +FactoryBot::DefinitionProxy#method_missing + declares an implicit declaration when called without args or a block + 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 (PENDING: No reason given) + +FactoryBot::NullObject + responds to the given methods + does not respond to other methods + +FactoryBot::Factory with a string for a name + has a name + +FactoryBot::Factory when defined with a class instead of a name + has a build_class + has a name + +FactoryBot::DefinitionProxy#association + declares an association with options + when passing a block raises an error + declares an association + +FactoryBot::Definition + exposes a non-default create strategy when one is provided by the user + maintains a list of enum fields + maintains a list of traits + adds only unique traits + creates a new attribute list with the name passed when given a name + has a name + has an overridable declaration list + doesn't expose a separate create strategy when none is specified + maintains a list of callbacks + delegates :declare_attribute to declarations + +FactoryBot::Attribute::Dynamic 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 a static value returns the value when executing the proc + with a block returning its block-level variable + returns self when executing the proc + name + is expected to eq :first_name + with a block returning a sequence + raises a sequence abuse error -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::Dynamic with a string name + name + is expected to eq :name -FactoryBot::Declaration::Implicit +FactoryBot::Declaration::Association #== - when one is ignored and the other isn't - the objects are NOT equal - when the factories are different + 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 names are different + when the options are different the objects are NOT equal - with a known sequence - creates a sequence attribute - does not create an assocition attribute - with a known factory - creates an association attribute - has the correct factory name -FactoryBot::AttributeList generating names - knows all its #names for #associations - knows all its #names for #non_ignored attributes - knows all its #names - knows all its #names for #ignored attributes +FactoryBot::DefinitionProxy#trait + declares a trait -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::DefinitionProxy#to_create + accepts a block to run in place of #save! -FactoryBot::Definition - creates a new attribute list with the name passed when given a name - maintains a list of enum fields - maintains a list of traits - delegates :declare_attribute to declarations - doesn't expose a separate create strategy when none is specified - maintains a list of callbacks - adds only unique traits - has an overridable declaration list - exposes a non-default create strategy when one is provided by the user +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::DefinitionProxy adding callbacks + 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_create callback succeeds + adding both an :after_stub and an :after_create callback succeeds + adding an :after_build callback succeeds + adding an :after_stub callback succeeds + +FactoryBot::Callback + runs its block with two parameters has a name + converts strings to symbols + runs its block with one parameter + runs its block with no parameters + +FactoryBot::Factory when defined with a custom class + is an instance of that custom class FactoryBot::AttributeList#define_attribute raises if an attribute has already been defined returns the attribute maintains a list of attributes -FactoryBot::StrategyCalculator - returns the class passed when it is instantiated with a class - finds the strategy by name when instantiated with a symbol - returns the strategy found when instantiated with a symbol - -FactoryBot::DeclarationList#declare_attribute - adds the declaration to the list when not overridable - appends declarations with the same name when NOT overridable - adds the declaration to the list when overridable - deletes declarations with the same name when overridable - -FactoryBot::DefinitionProxy#sequence - creates a new sequence with an overridden starting vaue - creates a new sequence with a block - creates a new sequence starting at 1 - -FactoryBot::Decorator::AttributeHash - #attributes - returns a hash of attributes - with an attribute called 'attributes' - does not call itself recursively +FactoryBot::DefinitionProxy#factory + with options + without options + with a block 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::NullObject - responds to the given methods - does not respond to other methods - -FactoryBot::DefinitionProxy#association - declares an association - when passing a block raises an error - declares an association with options +FactoryBot::Attribute::Association + builds the association when calling the proc + is expected to be association + builds the association when calling the proc + name + is expected to eq :author FactoryBot::Factory when defined with a custom class name has a build_class equal to its custom class name -FactoryBot::Factory running a factory - calls the block and returns the result - creates the right strategy using the build class when running - returns the result from the strategy when running - -FactoryBot::Sequence - a custom sequence and scope increments within the correct scope - a custom scope increments within the correct scope after rewinding - a custom sequence and scope increments within the correct scope when incrementing - 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 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 - a custom sequence without a block - 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 - a basic sequence - names - is expected to eq [:test] - name - is expected to eq :test - 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 basic sequence without a block - 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 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 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 sequence with custom value and aliases - 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::Registry - knows that an object is registered by string - is an enumerable - iterates registered objects - adds and returns the object registered - does not include duplicate objects with registered under different names - raises when an object cannot be found - clears registered factories - includes a did_you_mean message - knows that an object is registered by symbol - knows when an object is not registered - finds a registered object - finds a registered object with square brackets - -FactoryBot::Attribute::Association with a string name - name - is expected to eq :name - -FactoryBot - finds a registered strategy - .use_parent_strategy - is true by default +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 + returns the object from the evaluation + runs the callbacks [:after_build, :before_create, :after_create] with the evaluation's object -FactoryBot::Attribute::Dynamic with a string name - name - is expected to eq :name +definition loading + 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 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 in non-alphabetical order + loads the files in the right order + with a factories file under test + it should behave like finds definitions + is expected to load definitions from test/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 a factories file under spec/factories + it should behave like finds definitions + is expected to load definitions from spec/factories/post_factory.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 several factories files under test/factories in non-alphabetical order + loads the files in the right order + with a factories file under spec + it should behave like finds definitions + is expected to load definitions from spec/factories.rb + with nested and unnested factories files under test + it should behave like finds definitions + 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/person_factory.rb + is expected to load definitions from spec/factories/post_factory.rb + is expected to load definitions from spec/factories.rb + with factories.rb + it should behave like finds definitions + is expected to load definitions from factories.rb + 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::Factory returns associations creates a new factory using the class of the parent guesses the build class from the factory name + has a factory name has a build class includes associations from the parent factory creates a new factory while overriding the parent class - has a factory name when overriding generated attributes with a hash - overrides a symbol parameter with a string parameter returns the overridden value in the generated attributes + overrides a symbol parameter with a string parameter overriding an attribute with an alias discards the predefined value for the attribute uses the passed in value for the alias -FactoryBot::Internal - .register_sequence - registers the provided sequence - returns the registered sequence - .trait_by_name - finds a previously registered trait - .register_factory - returns the registered factory - registers the provided factory - .register_factory - registers the provided factory - returns the registered factory - .factory_by_name - finds a registered factory - .sequence_by_name - finds a registered sequence - .rewind_sequences - rewinds the sequences and the internal sequences - .register_trait - registers the provided trait - returns the registered trait - .register_strategy - register the provided strategy name with the class - .factory_by_name - finds a registered factory - .strategy_by_name - finds a registered strategy - -FactoryBot::EvaluatorClassDefiner - evaluates the block in the context of the evaluator - adds each attribute to the evaluator - sets attributes on the evaluator class - returns an evaluator when accessing the evaluator class - only instance_execs the block once even when returning nil - with a custom evaluator as a parent class - bases its attribute lists on itself and its parent evaluator - -FactoryBot::Factory with a string for a name - has a name - -FactoryBot::Strategy::AttributesFor - returns the hash from the evaluation - does not run the to_create block - it should behave like strategy without association support - returns nil when accessing an association - -FactoryBot::DeclarationList#attributes - defines each attribute on the attribute list - returns an AttributeList +FactoryBot::Declaration::Dynamic + #== + when comparing against another type of object + the objects are NOT equal + when the blocks are different + the objects are NOT equal + 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 names are different + the objects are NOT equal -FactoryBot::Factory when defined with a custom class - is an instance of that custom class +FactoryBot::DeclarationList#declare_attribute + adds the declaration to the list when overridable + appends declarations with the same name when NOT overridable + deletes declarations with the same name when overridable + adds the declaration to the list when not overridable -FactoryBot::DefinitionProxy#initialize_with - defines the constructor on the definition +FactoryBot::AttributeList generating names + knows all its #names for #associations + knows all its #names for #non_ignored attributes + knows all its #names + knows all its #names for #ignored attributes Pending: (Failures listed here are expected and do not affect your suite's status) @@ -1616,410 +1652,175 @@ # No reason given # ./spec/factory_bot/definition_proxy_spec.rb:66 -Finished in 0.86112 seconds (files took 0.4923 seconds to load) +Finished in 0.61789 seconds (files took 0.46225 seconds to load) 290 examples, 0 failures, 1 pending -Randomized with seed 11208 +Randomized with seed 62923 /usr/bin/ruby3.1 -I/usr/share/rubygems-integration/all/gems/rspec-support-3.12.0/lib:/usr/share/rubygems-integration/all/gems/rspec-core-3.12.0/lib /usr/share/rubygems-integration/all/gems/rspec-core-3.12.0/exe/rspec --pattern spec/acceptance/\*\*/\*_spec.rb --format documentation -Randomized with seed 48577 +Randomized with seed 47364 + +custom callbacks + runs a custom before callback when the proper strategy executes + runs a custom after callback when the proper strategy executes + runs a custom callback without prepending before or after when the proper strategy executes `attributes_for` for a class whose constructor has required params [:name] is expected to eq "John Doe" -applying inline traits - applies traits only to the instance generated for that call - -defining methods inside FactoryBot - raises with a meaningful message - -multiple creates and transient attributes to dynamically build attribute lists - allows the number of posts to be modified - generates the correct number of posts - -configuring the starting id - defines which id build_stubbed instances start with - -transient sequences - increments sequences correctly - -assigning overrides that are also private methods on object - some_funky_method - is expected to eq "foobar!" - more_format - is expected to eq "format: Great" - y - is expected to eq 12345 - format - is expected to eq "Great" - -calling methods on the model instance - with the referenced attribute being overridden - uses the overridden value - uses the overridden value during attributes_for - with the attribute being overridden - uses the overridden value during attributes_for - uses the overridden value - without the attribute being overridden - returns the correct value from the instance - returns nil during attributes_for - doesn't instantiate a record with attributes_for - -an instance generated by a factory that inherits from another factory - 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" - the child class redefining parent's attributes - is expected to be admin - is expected to be a kind of User(id: integer, name: string, admin: boolean, email: string, upper_email: string, login: string) - upper_email - is expected to eq "ADMIN@EXAMPLE.COM" - name - is expected to eq "admin" - login - is expected to eq "admin@example.com" - email - is expected to eq "admin@example.com" - -callbacks using Symbol#to_proc - runs the callback correctly - -traits added via strategy - adding traits in build_list - builds 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 attributes_for - [:admin] - is expected to equal true - [:name] - is expected to eq "John" - adding traits in create_list - creates all the records - length - is expected to eq 2 - adding traits in create - doesn't modify the user factory - name - is expected to eq "JOE" - admin - is expected to equal true - adding traits in build - name - is expected to eq "Joe" - admin - is expected to equal true - -initialize_with with non-FG attributes - age - is expected to eq 21 - name - is expected to eq "John Doe" - -a stubbed instance overriding strategy - acts as if it is saved in the database - assigns associations and acts as if it is saved +a built instance with strategy: :create + assigns and saves associations + is expected to be new record a generated stub instance - isn't changed - allows increment - disables destroy - assigns associations that aren't new records - generates unique ids - disables update_attribute - allows toggle assigns associations - assigns an overridden attribute - disables save - disables connection - has an id - disables decrement! - assigns a default attribute disables increment! - allows decrement + has an id disables toggle! + isn't changed isn't a new record + disables connection + assigns a default attribute + allows decrement + assigns associations that aren't new records + allows toggle + allows increment disables reload - -global to_create - handles child to_create with trait - handles base to_create - handles child to_create - handles inline trait override - uses to_create globally across FactoryBot.define - -when a self-referential trait is defined - raises a TraitDefinitionError - raises a TraitDefinitionError - -including FactoryBot::Syntax::Methods when custom strategies have been declared - allows adding additional strategies - -callbacks - runs both the after(:stub) callback on the factory and the inherited after(:stub) callback - runs the after(:stub) callback when stubbing - runs child callback after parent callback - runs the after(:build) callback when building - runs both the after(:build) and after(:create) callbacks when creating - -attributes defined using Symbol#to_proc - assigns values correctly - assigns value with override correctly - assigns overridden value correctly - -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" - -nested implicit traits - defined inside the factory - it should behave like assigning data from traits - assigns the correct values - defined outside the factory - it should behave like assigning data from traits - assigns the correct values - -transient attributes - returning attributes for a factory - is expected to have key :email - is expected not to have key :four - is expected not to have key :rockstar - is expected to have key :name - is expected not to have key :upcased - 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 an upcased rockstar - generates the correct attributes on a groupie - -calling `build_stubbed` with a block - passes the stub instance - returns the stub instance - -FactoryBot.lint - does not raise when all factories are valid - raises when a factory is invalid - allows for selective linting - verbose linting - prints the backtrace for each factory error - trait validation - disabled - does not raises if a trait produces an invalid object - enabled - raises if a trait produces an invalid object - does not raise if a trait produces a valid object - factory strategy for linting - uses the requested strategy during trait validation - uses the requested strategy + disables decrement! + disables destroy + disables save + generates unique ids + assigns an overridden attribute + disables update_attribute associations - when accidentally using an implicit delcaration for the factory - raises an error + when building interrelated associations + connects records with interdependent relationships + assigns the instance passed as an association attribute when accidentally using an implicit delcaration as an override raises an error when building collection associations builds the association according to the given strategy - when building interrelated associations - connects records with interdependent relationships - assigns the instance passed as an association attribute + when accidentally using an implicit delcaration for the factory + raises an error -create multiple instances - with a block - uses the new values +initialize_with with non-FG attributes + name + is expected to eq "John Doe" + age + is expected to eq 21 + +build multiple instances without default attributes uses the default factory values - creates all the posts + builds (but doesn't save) all the posts length is expected to eq 20 with a block that receives both the object and an index - uses the new values - without the count - raise ArgumentError with the proper error message + correctly uses the set value with default attributes overrides the default values + with a block + correctly uses the set value -looking up traits that don't exist - when passing an invalid override trait - raises a KeyError - when a trait includes an invalid default trait - raises a KeyError including the factory name - 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 - -using ActiveSupport::Instrumentation to track factory interaction - builds the correct payload - tracks proper time of creating the record - -nested factories with different parents - honors :parent over the factory block nesting - -associations overriding :strategy - uses the overridden create strategy to create the association - -traits used in associations - allows inline traits with a specific factory for an association - allows assigning traits for the factory of an association - allows inline traits with the default association - -a custom create passing in an evaluator - passes the evaluator to the custom create block - -initialize_with with FG attributes that are transient - name - is expected to eq "Handsome Chap from .construct" +traits with callbacks + executes callbacks in the order assigned + when the factory has a trait passed via arguments + name + is expected to eq "JOHN" + when the factory has an implicit trait + name + is expected to eq "JOHN" -initialize_with doesn't duplicate assignment on attributes accessed from initialize_with - instantiates the correct object +an instance generated by a factory named a camel case string + registers the UserModel factory -calling `create` with a block - returns the created instance - passes the created instance +implicit traits containing callbacks + only runs the callback once -inline traits overriding existing attributes - prefers inline trait attributes over traits on a factory - prefers attributes on factories over attributes from non-inline traits - prefers inline traits over attributes on factories - prefers overridden attributes over attributes from traits, inline traits, or attributes on factories - prefers inline trait attributes over default attributes - returns the default status - prefers traits on a factory over default attributes +a stubbed instance with no primary key + builds a stubbed instance + behaves like a persisted record -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 +applying inline traits + applies traits only to the instance generated for that call -setting private attributes - raises a NoMethodError +sequences + generates sequential numbers if no block is given + generates aliases for the sequence that reference the same block and retains value + generates several values in the correct format + generates few values of the sequence + generates aliases for the sequence that reference the same block -a custom create - uses the custom create block instead of save +sequences are evaluated in the correct context + builds a sequence calling sprintf correctly + allows direct reference of a method in a sequence + invokes a method with no arguments on the instance + invokes the correct method on the instance -an instance generated by a factory - registers the user factory +calling `build` with a block + passes the built instance + returns the built instance enum traits when automatically_define_enum_traits is false 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 an Array - builds traits for each enumerated value using a provided list of values as a Hash + builds traits automatically for model enum field builds traits for each enumerated value using a custom enumerable prefers user defined traits over automatically built traits - builds traits automatically for model enum field - -implicit traits containing callbacks - only runs the callback once + builds traits for each enumerated value using a provided list of values as an Array + builds traits for each enumerated value using a provided list of values as a Hash defining a child factory before a parent creates admin factories correctly -create multiple instances - without default attributes - creates all the posts - uses the default factory values - length - is expected to eq 2 - -global callbacks - triggers after build callbacks for all factories - -a created instance - assigns and saves associations - is expected not to be new record - -custom callbacks - runs a custom before callback when the proper strategy executes - runs a custom after callback when the proper strategy executes - runs a custom callback without prepending before or after when the proper strategy executes - -traits with initialize_with - gives additional traits higher priority than initialize_with from the definition - gives base traits lower priority than overrides - can apply initialize_with from the definition - gives additional traits higher priority than base traits and factory definition - gives base traits normal priority - can apply initialize_with from traits - -binding a callback to multiple callbacks - binds the callback to stubbing - binds the callback to creation - does not bind the callback to building - -sequences - generates few values of the sequence - generates several values in the correct format - generates sequential numbers if no block is given - generates aliases for the sequence that reference the same block and retains value - generates aliases for the sequence that reference the same block - -a created instance, specifying strategy: :build - saves associations (strategy: :build only affects build, not create) - -a stubbed instance - assigns associations and acts as if it is saved - acts as if it came from the database - -initialize_with with an 'attributes' attribute - assigns attributes correctly - -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 -calling `attributes_for` with a block - passes the hash of attributes - returns the hash of attributes +configuring the starting id + defines which id build_stubbed instances start with -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 +skipping the default create + doesn't execute anything when creating the instance -initialize_with for a constructor that requires a block - executes the block correctly +defaulting `created_at` + allows assignment of created_at + is doesn't mark the object as changed + allows overriding created_at for objects with created_at + defaults created_at for objects with created_at + behaves the same as a non-stubbed created_at + doesn't allow setting created_at on an object that doesn't define it + doesn't add created_at to objects who don't have the method 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 -association assignment from nested attributes - assigns the correct amount of comments when overridden - assigns the correct amount of comments +calling `create` with a block + returns the created instance + passes the created instance -making sure the factory is properly compiled the first time we want to instantiate it - can honor traits on the very first call +associations without overriding :strategy + when the :use_parent_strategy config option is set to false + uses the overridden strategy on the association + when the :use_parent_strategy config option is set to true + uses the parent strategy on the association -a generated attributes hash - doesn't assign associations - assigns a lazy, dependent attribute - assigns a default value - assigns an overridden value +attributes defined using Symbol#to_proc + assigns overridden value correctly + assigns values correctly + assigns value with override correctly -skipping the default create - doesn't execute anything when creating the instance +callbacks + runs child callback after parent callback + runs both the after(:build) and after(:create) callbacks when creating + runs the after(:stub) callback when stubbing + runs both the after(:stub) callback on the factory and the inherited after(:stub) callback + runs the after(:build) callback when building a built instance is expected to be new record @@ -2028,146 +1829,80 @@ when the :use_parent_strategy config option is set to false assigns and saves associations -traits with to_create - gives base traits normal priority - gives additional traits higher priority than to_create from the definition - gives additional traits higher priority than base traits and factory definition - can apply to_create from the definition - can apply to_create from traits - gives base traits lower priority than overrides - -a stubbed instance with no primary key - builds a stubbed instance - behaves like a persisted record +binding a callback to multiple callbacks + does not bind the callback to building + binds the callback to creation + binds the callback to stubbing -global skip_create - does not persist child records - does not persist any record - honors inline trait to_create - honors overridden to_create +trait indifferent access + when trait is defined as a symbol + can be invoked with a string + can be invoked with a symbol + when trait is defined as a string + can be invoked with a string + can be invoked with a symbol + when trait is defined as integer + can be invoked with as integer + can be invoked with a string + when trait is defined as struct + can be invoked with a string + can be invoked with a struct -calling `build` with a block - passes the built instance - returns the built instance +association assignment from nested attributes + assigns the correct amount of comments when overridden + assigns the correct amount of comments -#add_attribute - assigns attributes for reserved words on .attributes_for - assigns attributes for reserved words on .build +FactoryBot.rewind_sequences + resets all sequences back to their starting values + still allows global sequences prefixed with a factory name + does not collide with globally registered factories + resets inline sequences back to their starting value + allows setting sequences within identically named traits -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 +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 -traits and dynamic attributes that are applied simultaneously - combined - is expected to eq "John " - email - is expected to eq "John@example.com" - name - is expected to eq "John" +a created instance, specifying strategy: :build + saves associations (strategy: :build only affects build, not create) -defaulting `updated_at` - allows overriding updated_at for objects with updated_at - doesn't allow setting updated_at on an object that doesn't define it - is doesn't mark the object as changed - defaults updated_at for objects with updated_at - doesn't add updated_at to objects who don't have the method - behaves the same as a non-stubbed updated_at - allows assignment of updated_at +aliases and overrides + one + is expected to eq "override" + two + is expected to be nil -initialize_with with a hash argument - builds the object correctly +transient attributes + without transient variables assigned + uses the default value of the attribute + 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 not to have key :upcased + is expected to have key :name + is expected not to have key :rockstar + is expected to have key :email + is expected not to have key :four -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 - does allow the factory to be subsequently modified - doesn't allow the factory to be subsequently defined - login - is expected to eq "GREAT USER" - name - is expected to eq "Great User" - adding callbacks - name - is expected to eq "great user" - login - is expected to be nil - reusing traits - name - is expected to eq "Johnny Rockstar!!!" - login - is expected to eq "JOHNNY ROCKSTAR!!!" +an instance generated by a factory with multiple traits + 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" + factory using global trait email - is expected to eq "Johnny Rockstar!!!@example.com" - redefining attributes - 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 - admin - is expected to equal true - name - is expected to eq "Great User" - email - is expected to eq "perfect@example.com" - creating user - overriding the name - email - is expected to eq "wonderful-modified@example.com" - name - is expected to eq "wonderful" - overriding the email - email - is expected to eq "perfect@example.com" - name - is expected to eq "Great User" - without overrides - name - is expected to eq "Great User" - email - is expected to eq "Great User-modified@example.com" - -sequences are evaluated in the correct context - allows direct reference of a method in a sequence - builds a sequence calling sprintf correctly - invokes a method with no arguments on the instance - invokes the correct method on the instance - -initialize_with non-ORM-backed objects - generates random data - allows for overrides - -callbacks using syntax methods without referencing FactoryBot explicitly - works when the callback has two variables - works when the callback has one variable - works when the callback has no variables - -traits with callbacks - executes callbacks in the order assigned - when the factory has a trait passed via arguments - name - is expected to eq "JOHN" - when the factory has an implicit trait + is expected to eq "Bill@example.com" name - is expected to eq "JOHN" - -an instance generated by a factory with multiple traits + is expected to eq "Bill" factory created with alternate syntax for specifying trait where trait name and attribute are the same great @@ -2177,55 +1912,27 @@ is expected to eq "SORT OF!!!" gender is expected to eq "Male" - the parent class - is expected not to be admin + the child class with one trait + is expected to be admin gender is expected to be nil name is expected to eq "John" - factory using global trait - email - is expected to eq "Bill@example.com" - name - is expected to eq "Bill" - child factory using grandparents' trait - great - is expected to eq "GREAT!!!" - the child class with one trait + the child with multiple traits is expected to be admin - name - is expected to eq "John" - gender - is expected to be nil - the other child class with one trait - is expected not to be admin gender is expected to eq "Female" name is expected to eq "Jane" - 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 trait defined multiple times + child factory using grandparents' trait great is expected to eq "GREAT!!!" - child factory redefining trait - great - is expected to eq "EVEN GREATER!!!" - the child with multiple traits - is expected to be admin - name - is expected to eq "Jane" - gender - is expected to eq "Female" - child factory created where trait attributes are inherited + the parent class + is expected not to be admin gender - is expected to eq "Male" - date_of_birth - is expected to eq Sat, 01 Jan 2000 + is expected to be nil + name + is expected to eq "John" the child with multiple traits who override the same attribute when the male assigns name after female is expected to be admin @@ -2235,97 +1942,239 @@ is expected to eq "Male" when the female assigns name after male is expected to be admin - name - is expected to eq "Jane" gender is expected to eq "Female" + name + is expected to eq "Jane" 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 with trait defined multiple times + child factory redefining trait + great + is expected to eq "EVEN GREATER!!!" + great + is expected to eq "GREAT!!!" + the other child class with one trait + is expected not to be admin name - is expected to eq "Judy" + 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 -global initialize_with - handles child initialize_with with trait - handles inline trait override - handles child initialize_with - handles base initialize_with - uses initialize_with globally across FactoryBot.define +associations overriding :strategy + uses the overridden create strategy to create the association -FactoryBot.rewind_sequences - resets inline sequences back to their starting value - allows setting sequences within identically named traits - does not collide with globally registered factories - still allows global sequences prefixed with a factory name - resets all sequences back to their starting values +declaring attributes on a Factory that are private methods on Object + system + is expected to eq false + sleep + is expected to eq -5 + link + is expected to eq "http://example.com" reload does not reset the value of use_parent_strategy -modifying inherited factories with traits - allows modification of attributes created via traits - returns the correct value for overridden attributes from traits - returns the correct value for overridden attributes from traits defining multiple attributes +multiple creates and transient attributes to dynamically build attribute lists + generates the correct number of posts + allows the number of posts to be modified -initialize_with has access to all attributes for construction - assigns attributes correctly +initialize_with with a hash argument + builds the object correctly -assigning values from a transient attribute - does not ignore an _id attribute that is an alias for a transient attribute +an instance generated by a factory + registers the user factory -aliases and overrides - two - is expected to be nil - one - is expected to eq "override" +nested factories with different parents + honors :parent over the factory block nesting -build multiple instances - with default attributes - overrides the default values - with a block - correctly uses the set value - with a block that receives both the object and an index - 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 +including FactoryBot::Syntax::Methods when custom strategies have been declared + allows adding additional strategies -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 +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 + +initialize_with non-ORM-backed objects + generates random data + allows for overrides + +assigning overrides that are also private methods on object + more_format + is expected to eq "format: Great" + some_funky_method + is expected to eq "foobar!" + y + is expected to eq 12345 + format + is expected to eq "Great" + +making sure the factory is properly compiled the first time we want to instantiate it + can honor traits on the very first call + +initialize_with implicit constructor + instantiates the correct object + +calling `build_stubbed` with a block + returns the stub instance + passes the stub instance + +initialize_with with FG attributes that are transient + name + is expected to eq "Handsome Chap from .construct" defaulting `id` allows overriding id -a built instance with strategy: :create - is expected to be new record - assigns and saves associations +initialize_with has access to all attributes for construction + assigns attributes correctly -finding factories keyed by class instead of symbol - doesn't find the factory +initialize_with with an 'attributes' attribute + assigns attributes correctly + +callbacks using Symbol#to_proc + runs the callback correctly + +a generated attributes hash + assigns a default value + assigns a lazy, dependent attribute + assigns an overridden value + doesn't assign associations + +global to_create + handles child to_create with trait + uses to_create globally across FactoryBot.define + handles inline trait override + handles child to_create + handles base to_create + +modifying factories + doesn't overwrite already defined child's attributes + allows for overriding child classes + raises an exception if the factory was not defined before + redefining attributes + creating admin + 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 name + name + is expected to eq "wonderful" + admin + is expected to equal true + email + is expected to eq "wonderful-modified@example.com" + overriding the email + email + is expected to eq "perfect@example.com" + admin + is expected to equal true + name + is expected to eq "Great User" + creating user + without overrides + name + is expected to eq "Great User" + email + is expected to eq "Great User-modified@example.com" + overriding the email + email + is expected to eq "perfect@example.com" + name + is expected to eq "Great User" + overriding the name + name + is expected to eq "wonderful" + email + is expected to eq "wonderful-modified@example.com" + adding callbacks + name + is expected to eq "great user" + login + is expected to be nil + simple modification + does allow the factory to be subsequently modified + doesn't allow the factory to be subsequently defined + name + is expected to eq "Great User" + login + is expected to eq "GREAT USER" + reusing traits + email + is expected to eq "Johnny Rockstar!!!@example.com" + name + is expected to eq "Johnny Rockstar!!!" + login + is expected to eq "JOHNNY ROCKSTAR!!!" 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 - allows using the *_list method to build a list using a custom strategy + allows using the *_pair method to build a list using a custom strategy -trait indifferent access - when trait is defined as integer - can be invoked with as integer - can be invoked with a string - when trait is defined as struct - can be invoked with a struct - can be invoked with a string - when trait is defined as a string - can be invoked with a string - can be invoked with a symbol - when trait is defined as a symbol - can be invoked with a string - can be invoked with a symbol +a stubbed instance overriding strategy + assigns associations and acts as if it is saved + acts as if it is saved in the database + +inline traits overriding existing attributes + prefers attributes on factories over attributes from non-inline traits + prefers inline trait attributes over default attributes + prefers overridden attributes over attributes from traits, inline traits, or attributes on factories + prefers inline trait attributes over traits on a factory + returns the default status + prefers inline traits over attributes on factories + prefers traits on a factory over default attributes + +global callbacks + triggers after build callbacks for all factories + +FactoryBot.lint + does not raise when all factories are valid + raises when a factory is invalid + allows for selective linting + verbose linting + prints the backtrace for each factory error + factory strategy for linting + uses the requested strategy + uses the requested strategy during trait validation + trait validation + disabled + does not raises if a trait produces an invalid object + enabled + does not raise if a trait produces a valid object + raises if a trait produces an invalid object + +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 + +using ActiveSupport::Instrumentation to track factory interaction + builds the correct payload + tracks proper time of creating the record + +defining methods inside FactoryBot + raises with a meaningful message attribute overrides with an admin posting @@ -2338,26 +2187,213 @@ secure is expected to be nil -defaulting `created_at` - defaults created_at for objects with created_at - doesn't allow setting created_at on an object that doesn't define it - behaves the same as a non-stubbed created_at - allows assignment of created_at - is doesn't mark the object as changed - allows overriding created_at for objects with created_at - doesn't add created_at to objects who don't have the method +traits with to_create + can apply to_create from the definition + gives base traits lower priority than overrides + 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 + +modifying inherited factories with traits + returns the correct value for overridden attributes from traits + returns the correct value for overridden attributes from traits defining multiple attributes + allows modification of attributes created via traits + +transient sequences + increments sequences correctly + +a stubbed instance + assigns associations and acts as if it is saved + acts as if it came from the database + +create multiple instances + without default attributes + uses the default factory values + creates all the posts + length + is expected to eq 2 + +#add_attribute + assigns attributes for reserved words on .attributes_for + assigns attributes for reserved words on .build + +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 + +initialize_with for a constructor that requires a block + executes the block correctly + +traits used in associations + allows inline traits with a specific factory for an association + allows inline traits with the default association + allows assigning traits for the factory of an association + +traits with initialize_with + can apply initialize_with from traits + gives additional traits higher priority than base traits and factory definition + gives base traits normal priority + gives additional traits higher priority than initialize_with from the definition + can apply initialize_with from the definition + gives base traits lower priority than overrides syntax methods within dynamic attributes can access syntax methods from dynamic attributes - can access methods already existing on the class allows syntax methods to be used when the block has an arity of 1 + can access methods already existing on the class can access syntax methods from dynamic attributes -initialize_with implicit constructor - instantiates the correct object +calling methods on the model instance + with the referenced attribute being overridden + uses the overridden value during attributes_for + uses the overridden value + without the attribute being overridden + returns nil during attributes_for + returns the correct value from the instance + doesn't instantiate a record with attributes_for + with the attribute being overridden + uses the overridden value + uses the overridden value during attributes_for -an instance generated by a factory named a camel case string - registers the UserModel factory +a created instance + assigns and saves associations + is expected not to be new record + +a custom create passing in an evaluator + passes the evaluator to the custom create block + +traits added via strategy + adding traits in attributes_for + [:name] + is expected to eq "John" + [: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_list + creates all the records + length + is expected to eq 2 + adding traits in create + doesn't modify the user factory + name + is expected to eq "JOE" + admin + is expected to equal true + adding traits in build + name + is expected to eq "Joe" + admin + is expected to equal true + adding traits in build_stubbed + name + is expected to eq "Jack" + admin + is expected to equal true + +defaulting `updated_at` + allows overriding updated_at for objects with updated_at + doesn't allow setting updated_at on an object that doesn't define it + behaves the same as a non-stubbed updated_at + is doesn't mark the object as changed + defaults updated_at for objects with updated_at + doesn't add updated_at to objects who don't have the method + allows assignment of updated_at + +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 + upper_email + is expected to eq "ADMIN@EXAMPLE.COM" + name + is expected to eq "admin" + login + is expected to eq "admin@example.com" + email + is expected to eq "admin@example.com" + the parent class + is expected not to be admin + email + is expected to eq "john@example.com" + name + is expected to eq "John" + login + is expected to eq "john@example.com" + +assigning values from a transient attribute + does not ignore an _id attribute that is an alias for a transient attribute + +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" + +a custom create + uses the custom create block instead of save + +traits and dynamic attributes that are applied simultaneously + name + is expected to eq "John" + email + is expected to eq "John@example.com" + combined + is expected to eq "John " + +global initialize_with + handles child initialize_with + handles base initialize_with + uses initialize_with globally across FactoryBot.define + handles child initialize_with with trait + handles inline trait override + +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 + +global skip_create + does not persist child records + honors overridden to_create + honors inline trait to_create + does not persist any record + +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 + +create multiple instances + with default attributes + overrides the default values + without the count + raise ArgumentError with the proper error message + with a block that receives both the object and an index + uses the new values + with a block + uses the new values + without default attributes + uses the default factory values + creates all the posts + length + is expected to eq 20 + +when a self-referential trait is defined + raises a TraitDefinitionError + raises a TraitDefinitionError + +calling `attributes_for` with a block + returns the hash of attributes + passes the hash of attributes + +finding factories keyed by class instead of symbol + doesn't find the factory + +initialize_with doesn't duplicate assignment on attributes accessed from initialize_with + instantiates the correct object Deprecation Warnings: @@ -2373,10 +2409,10 @@ 2 deprecation warnings total -Finished in 4.31 seconds (files took 0.53888 seconds to load) +Finished in 3.72 seconds (files took 0.54772 seconds to load) 362 examples, 0 failures -Randomized with seed 48577 +Randomized with seed 47364 mv ./.gem2deb.Gemfile.lock Gemfile.lock @@ -2412,12 +2448,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/1319973/tmp/hooks/B01_cleanup starting +I: user script /srv/workspace/pbuilder/1319973/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/2625350 and its subdirectories -I: Current time: Fri Feb 7 21:54:34 -12 2025 -I: pbuilder-time-stamp: 1739008475 +I: removing directory /srv/workspace/pbuilder/1319973 and its subdirectories +I: Current time: Sun Jan 7 17:32:26 +14 2024 +I: pbuilder-time-stamp: 1704598346