Diff of the two buildlogs: -- --- b1/build.log 2024-04-28 15:26:24.394509403 +0000 +++ b2/build.log 2024-04-28 15:27:31.287654729 +0000 @@ -1,6 +1,6 @@ I: pbuilder: network access will be disabled during build -I: Current time: Sat May 31 09:48:38 -12 2025 -I: pbuilder-time-stamp: 1748728118 +I: Current time: Mon Apr 29 05:26:26 +14 2024 +I: pbuilder-time-stamp: 1714317986 I: Building the build Environment I: extracting base tarball [/var/cache/pbuilder/trixie-reproducible-base.tgz] I: copying local configuration @@ -30,54 +30,86 @@ 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/28190/tmp/hooks/D02_print_environment starting +I: user script /srv/workspace/pbuilder/35066/tmp/hooks/D01_modify_environment starting +debug: Running on ionos2-i386. +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 Apr 28 15:26 /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/35066/tmp/hooks/D01_modify_environment finished +I: user script /srv/workspace/pbuilder/35066/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='i386' - DEBIAN_FRONTEND='noninteractive' - DEB_BUILD_OPTIONS='buildinfo=+all reproducible=+all parallel=22 ' - DISTRIBUTION='trixie' - HOME='/root' - HOST_ARCH='i386' + 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]="21" [3]="1" [4]="release" [5]="i686-pc-linux-gnu") + BASH_VERSION='5.2.21(1)-release' + BUILDDIR=/build/reproducible-path + BUILDUSERGECOS='second user,second room,second work-phone,second home-phone,second other' + BUILDUSERNAME=pbuilder2 + BUILD_ARCH=i386 + DEBIAN_FRONTEND=noninteractive + DEB_BUILD_OPTIONS='buildinfo=+all reproducible=+all parallel=10 ' + DIRSTACK=() + DISTRIBUTION=trixie + EUID=0 + FUNCNAME=([0]="Echo" [1]="main") + GROUPS=() + HOME=/root + HOSTNAME=i-capture-the-hostname + HOSTTYPE=i686 + HOST_ARCH=i386 IFS=' ' - INVOCATION_ID='5b5c9ede5c614869b3ffb9ad28882b85' - LANG='C' - LANGUAGE='en_US:en' - LC_ALL='C' - LD_LIBRARY_PATH='/usr/lib/libeatmydata' - LD_PRELOAD='libeatmydata.so' - 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='28190' - PS1='# ' - PS2='> ' + INVOCATION_ID=fb8287b96b3945aabac37cf840b9216a + LANG=C + LANGUAGE=de_CH:de + LC_ALL=C + LD_LIBRARY_PATH=/usr/lib/libeatmydata + LD_PRELOAD=libeatmydata.so + MACHTYPE=i686-pc-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=35066 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.gicjBdyz/pbuilderrc_ubvM --distribution trixie --hookdir /etc/pbuilder/first-build-hooks --debbuildopts -b --basetgz /var/cache/pbuilder/trixie-reproducible-base.tgz --buildresult /srv/reproducible-results/rbuild-debian/r-b-build.gicjBdyz/b1 --logfile b1/build.log ruby-factory-bot_6.4.2-1.dsc' - SUDO_GID='112' - SUDO_UID='107' - SUDO_USER='jenkins' - TERM='unknown' - TZ='/usr/share/zoneinfo/Etc/GMT+12' - USER='root' - _='/usr/bin/systemd-run' - http_proxy='http://213.165.73.152: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.gicjBdyz/pbuilderrc_FSyk --distribution trixie --hookdir /etc/pbuilder/rebuild-hooks --debbuildopts -b --basetgz /var/cache/pbuilder/trixie-reproducible-base.tgz --buildresult /srv/reproducible-results/rbuild-debian/r-b-build.gicjBdyz/b2 --logfile b2/build.log ruby-factory-bot_6.4.2-1.dsc' + SUDO_GID=112 + SUDO_UID=107 + SUDO_USER=jenkins + TERM=unknown + TZ=/usr/share/zoneinfo/Etc/GMT-14 + UID=0 + USER=root + _='I: set' + http_proxy=http://46.16.76.132:3128 I: uname -a - Linux ionos6-i386 6.1.0-20-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.1.85-1 (2024-04-11) x86_64 GNU/Linux + Linux i-capture-the-hostname 6.1.0-20-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.1.85-1 (2024-04-11) x86_64 GNU/Linux I: ls -l /bin - lrwxrwxrwx 1 root root 7 May 26 17:47 /bin -> usr/bin -I: user script /srv/workspace/pbuilder/28190/tmp/hooks/D02_print_environment finished + lrwxrwxrwx 1 root root 7 Apr 21 07:13 /bin -> usr/bin +I: user script /srv/workspace/pbuilder/35066/tmp/hooks/D02_print_environment finished -> Attempting to satisfy build-dependencies -> Creating pbuilder-satisfydepends-dummy package Package: pbuilder-satisfydepends-dummy @@ -388,7 +420,7 @@ Get: 140 http://deb.debian.org/debian trixie/main i386 ruby-rspec-its all 1.3.0-1 [6864 B] Get: 141 http://deb.debian.org/debian trixie/main i386 ruby-sqlite3 i386 1.4.2-4+b3 [44.9 kB] Get: 142 http://deb.debian.org/debian trixie/main i386 ruby-timecop all 0.9.8-1 [11.1 kB] -Fetched 51.3 MB in 1s (84.5 MB/s) +Fetched 51.3 MB in 1s (66.4 MB/s) debconf: delaying package configuration, since apt-utils is not installed dpkg: libssl3:i386: dependency problems, but removing anyway as you requested: libkrb5-3:i386 depends on libssl3 (>= 3.0.0). @@ -868,8 +900,8 @@ Setting up tzdata (2024a-3) ... Current default time zone: 'Etc/UTC' -Local time is now: Sat May 31 21:49:06 UTC 2025. -Universal Time is now: Sat May 31 21:49:06 UTC 2025. +Local time is now: Sun Apr 28 15:27:02 UTC 2024. +Universal Time is now: Sun Apr 28 15:27:02 UTC 2024. Run 'dpkg-reconfigure tzdata' if you wish to change it. Setting up autotools-dev (20220109.1) ... @@ -997,7 +1029,11 @@ Building tag database... -> Finished parsing the build-deps I: Building the package -I: Running cd /build/reproducible-path/ruby-factory-bot-6.4.2/ && 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.4.2-1_source.changes +I: user script /srv/workspace/pbuilder/35066/tmp/hooks/A99_set_merged_usr starting +Not re-configuring usrmerge for trixie +I: user script /srv/workspace/pbuilder/35066/tmp/hooks/A99_set_merged_usr finished +hostname: Name or service not known +I: Running cd /build/reproducible-path/ruby-factory-bot-6.4.2/ && 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.4.2-1_source.changes dpkg-buildpackage: info: source package ruby-factory-bot dpkg-buildpackage: info: source version 6.4.2-1 dpkg-buildpackage: info: source distribution unstable @@ -1025,7 +1061,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.4.2/debian/ruby-factory-bot -/usr/bin/ruby3.1 -S gem build --config-file /dev/null --verbose /tmp/d20250531-33433-nriqd4/gemspec +/usr/bin/ruby3.1 -S gem build --config-file /dev/null --verbose /tmp/d20240429-42312-2pkayb/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: @@ -1055,7 +1091,7 @@ Name: factory_bot Version: 6.4.2 File: factory_bot-6.4.2.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/d20250531-33433-nriqd4/factory_bot-6.4.2.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/d20240429-42312-2pkayb/factory_bot-6.4.2.gem Failed to load /dev/null because it doesn't contain valid YAML hash /build/reproducible-path/ruby-factory-bot-6.4.2/debian/ruby-factory-bot/usr/share/rubygems-integration/all/gems/factory_bot-6.4.2/lib/factory_bot.rb /build/reproducible-path/ruby-factory-bot-6.4.2/debian/ruby-factory-bot/usr/share/rubygems-integration/all/gems/factory_bot-6.4.2/lib/factory_bot/aliases.rb @@ -1142,594 +1178,810 @@ mv Gemfile.lock ./.gem2deb.Gemfile.lock /usr/bin/ruby3.1 -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 24308 +Randomized with seed 55831 -FactoryBot::Strategy::Stub - it should behave like strategy with callbacks - runs the callbacks [:after_stub] with the evaluation's object - returns the object from the evaluation - it should behave like strategy with association support - finds the factory with the correct factory name - runs the factory with the correct overrides - asking for a result - is expected not to be new record - is expected not to be destroyed - is expected to be persisted - assigns created_at - overriding persistence method: #touch - raises an informative error if the method is called - overrides the method with any arity - overriding persistence method: #destroy - overrides the method with any arity - raises an informative error if the method is called - overriding persistence method: #update - raises an informative error if the method is called - overrides the method with any arity - overriding persistence method: #toggle! - 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 - raises an informative error if the method is called - overriding persistence method: #update_attributes - overrides the method with any arity - raises an informative error if the method is called - overriding persistence method: #decrement! - overrides the method with any arity - raises an informative error if the method is called - overriding persistence method: #destroy! - overrides the method with any arity - raises an informative error if the method is called - overriding persistence method: #update! - overrides the method with any arity - raises an informative error if the method is called - overriding persistence method: #update_attributes! - overrides the method with any arity - raises an informative error if the method is called - overriding persistence method: #increment! - 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 - raises an informative error if the method is called - overriding persistence method: #delete - overrides the method with any arity - raises an informative error if the method is called - overriding persistence method: #reload - overrides the method with any arity - raises an informative error if the method is called - overriding persistence method: #connection - overrides the method with any arity - raises an informative error if the method is called - overriding persistence method: #update_columns - 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: #save! - overrides the method with any arity - raises an informative error if the method is called - it should behave like strategy with strategy: :build - runs the factory with the correct overrides - finds the factory with the correct factory name - -FactoryBot::Attribute::Association with a string name - name - is expected to eq :name - -FactoryBot::Decorator::DisallowsDuplicatesRegistry - delegates #register to the registry when not registered - raises when attempting to #register a previously registered strategy - -FactoryBot::DefinitionProxy#association - declares an association with options - when passing a block raises an error - declares an association +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::Internal - .register_factory - returns the registered factory - registers the provided factory + .factory_by_name + finds a registered factory .sequence_by_name finds a registered sequence .register_strategy register the provided strategy name with the class + .register_factory + registers the provided factory + returns the registered factory + .register_sequence + returns the registered sequence + registers the provided sequence .factory_by_name finds a registered factory + .strategy_by_name + finds a registered strategy .register_trait registers the provided trait returns the registered trait - .rewind_sequences - rewinds the sequences and the internal sequences - .strategy_by_name - finds a registered strategy - .factory_by_name - finds a registered factory .trait_by_name finds a previously registered trait - .register_sequence - registers the provided sequence - returns the registered sequence + .rewind_sequences + rewinds the sequences and the internal sequences .register_factory - registers the provided factory returns the registered factory + registers the provided factory -FactoryBot::Declaration::Dynamic +definition loading + 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 factories.rb + it should behave like finds definitions + is expected to load definitions from factories.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 + 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/person_factory.rb + 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 test/factories + it should behave like finds definitions + 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.rb + is expected to load definitions from spec/factories/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 several factories files under test/factories in non-alphabetical order + loads the files in the right order + 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 a factories file under test + it should behave like finds definitions + is expected to load definitions from test/factories.rb + +FactoryBot::EvaluatorClassDefiner + sets attributes on the evaluator class + 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 + 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::Factory + creates a new factory while overriding the parent class + guesses the build class from the factory name + returns associations + has a factory name + creates a new factory using the class of the parent + has a build class + includes associations from the parent factory + when overriding generated attributes with a hash + returns the overridden value in the generated attributes + overrides a symbol parameter with a string parameter + overriding an attribute with an alias + uses the passed in value for the alias + discards the predefined value for the attribute + +FactoryBot::Attribute::Sequence + assigns the next value in the sequence + name + is expected to eq :first_name + +FactoryBot::NullFactory + delegates constructor to its definition + has an instance of FactoryBot::AttributeList for its attributes attribute + has a nil value for its compile attribute + delegates attributes to its definition + has FactoryBot::Evaluator as its evaluator class + has a nil value for its class_name attribute + delegates defined traits to its definition + delegates callbacks to its definition + +FactoryBot::Factory when defined with a custom class name + has a build_class equal to its custom class name + +FactoryBot::Decorator::AttributeHash + #attributes + returns a hash of attributes + with an attribute called 'attributes' + does not call itself recursively + +FactoryBot::DefinitionProxy#association + declares an association + when passing a block raises an error + declares an association with options + +FactoryBot::DefinitionProxy adding callbacks + adding both a :before_stub and a :before_create callback succeeds + adding an :after_stub callback succeeds + adding both an :after_stub and an :after_create callback succeeds + adding an :after_create callback succeeds + adding both an :after_stub and a :before_create callback succeeds + adding an :after_build callback succeeds + +FactoryBot::Strategy::Create + runs a custom create block + 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 + it should behave like strategy with association support + runs the factory with the correct overrides + finds the factory with the correct factory name + +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 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 string for a name + has a name + +FactoryBot::DefinitionProxy#to_create + accepts a block to run in place of #save! + +FactoryBot::DefinitionProxy#method_missing + declares an implicit declaration when called without args or a block + raises a NoMethodError when called with a static-attribute-like argument (PENDING: No reason given) + declares a dynamic attribute when called with a block + declares an association when called with a ':factory' key + +FactoryBot::AttributeList#associations + returns associations + +FactoryBot::DefinitionProxy#initialize_with + defines the constructor on the definition + +FactoryBot::DefinitionProxy#sequence + creates a new sequence with an overridden starting value + creates a new sequence starting at 1 + creates a new sequence with a block + +FactoryBot::NullObject + does not respond to other methods + responds to the given methods + +FactoryBot::AttributeList#apply_attributes + adds attributes in the order defined + +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::Declaration::Association #== when the attributes are equal the objects are equal - 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 blocks are different + when the names are different the objects are NOT equal when comparing against another type of object the objects are NOT equal -FactoryBot::DefinitionProxy#method_missing - raises a NoMethodError when called with a static-attribute-like argument (PENDING: No reason given) - declares a dynamic attribute when called with a block - declares an implicit declaration when called without args or a block - declares an association when called with a ':factory' key +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::Factory when defined with a custom class - is an instance of that custom class +FactoryBot::Factory when given a class that overrides #to_s + sets build_class correctly -FactoryBot::Factory when defined with a class instead of a name +FactoryBot::DefinitionProxy#transient + makes all attributes added ignored + +FactoryBot::Callback + runs its block with two parameters + runs its block with no parameters + converts strings to symbols has a name - has a build_class + runs its block with one parameter -FactoryBot::Attribute::Dynamic with a string name +FactoryBot::Attribute::Association with a string name name is expected to eq :name -FactoryBot::AttributeList#apply_attributes - adds attributes in the order defined +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::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::AttributeList filter based on ignored attributes + filters #ignored attributes + filters #non_ignored attributes -FactoryBot::AttributeList#define_attribute - raises if an attribute has already been defined - returns the attribute - maintains a list of attributes +FactoryBot::Factory running a factory + returns the result from the strategy when running + creates the right strategy using the build class when running + calls the block and returns the result -FactoryBot::DeclarationList#declare_attribute - adds the declaration to the list when not 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 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::Declaration::Association +FactoryBot::Decorator::DisallowsDuplicatesRegistry + raises when attempting to #register a previously registered strategy + delegates #register to the registry when not registered + +FactoryBot::Declaration::Dynamic #== 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 - when the options are different + when the blocks are different the objects are NOT equal -FactoryBot::EvaluatorClassDefiner - 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 - 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::Attribute + is not an association + converts the name attribute to a symbol + +FactoryBot::Factory when defined with a class instead of a name + has a name + has a build_class + +FactoryBot::DefinitionProxy#factory + with options + without options + with a block + +FactoryBot::Registry + clears registered factories + does not include duplicate objects with registered under different names + is an enumerable + knows that an object is registered by string + finds a registered object + iterates registered objects + knows when an object is not registered + raises when an object cannot be found + adds and returns the object registered + knows that an object is registered by symbol + includes a did_you_mean message + finds a registered object with square brackets FactoryBot::Declaration::Implicit with a known factory has the correct factory name creates an association attribute + with a known sequence + does not create an association attribute + creates a sequence attribute #== - when the attributes are equal - the objects are equal - when the factories are different - the objects are NOT equal - when comparing against another type of object - the objects are NOT equal when one is ignored and the other isn't the objects are NOT equal when the names are different the objects are NOT equal - with a known sequence - does not create an association attribute - creates a sequence attribute + when the factories 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::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::DeclarationList#attributes + returns an AttributeList + defines each attribute on the attribute list -FactoryBot::DefinitionProxy#factory - with options - with a block - without options +FactoryBot::DeclarationList#declare_attribute + adds the declaration to the list when overridable + appends declarations with the same name when NOT overridable + adds the declaration to the list when not overridable + deletes declarations with the same name when overridable + +FactoryBot::AttributeList generating names + knows all its #names for #associations + knows all its #names + knows all its #names for #ignored attributes + knows all its #names for #non_ignored attributes + +FactoryBot::Definition + has a name + creates a new attribute list with the name passed when given a name + adds only unique traits + maintains a list of enum fields + has an overridable declaration list + doesn't expose a separate create strategy when none is specified + exposes a non-default create strategy when one is provided by the user + maintains a list of callbacks + maintains a list of traits + delegates :declare_attribute to declarations + +FactoryBot::Factory human names + parses human names without underscores + parses names without underscores + parses human names with big letters + parses human names with aliases + parses names with aliases + parses human names with underscores + parses names with big letters + parses names with underscores + +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 + maintains a list of attributes + returns the attribute + +FactoryBot::DefinitionProxy#trait + declares a trait 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 - it should behave like strategy with strategy: :build - finds the factory with the correct factory name - runs the factory with the correct overrides -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 block returning its block-level variable + returns self when executing the proc + with a block returning a static value + returns the value when executing the proc + with a block returning a sequence + raises a sequence abuse error + name + is expected to eq :first_name + with a block referencing an attribute on the attribute + evaluates the attribute from the attribute 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 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 1st value after rewinding - has a next value equal to the 2nd value after being incremented + a custom scope increments within the correct scope after rewinding + a custom sequence and scope increments within the correct scope when incrementing 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 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 - names - is expected to eq [:test] name is expected to eq :test - a sequence with custom value and aliases - has the expected names as its names + 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 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 + 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 - a custom sequence + 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 + 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 2nd value after being incremented has a next value equal to the 1st value after rewinding - a sequence with aliases using default 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 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 + 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 + has a next value equal to the 2nd value after being incremented + has a next value equal to its first value -FactoryBot::Definition - delegates :declare_attribute to declarations - doesn't expose a separate create strategy when none is specified - has an overridable declaration list - adds only unique traits - maintains a list of callbacks - exposes a non-default create strategy when one is provided by the user - maintains a list of enum fields - maintains a list of traits - has a name - creates a new attribute list with the name passed when given a name +FactoryBot + finds a registered strategy + .use_parent_strategy + is true by default -FactoryBot::DeclarationList#attributes - returns an AttributeList - defines each attribute on the attribute list +FactoryBot::Strategy::Stub + 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_stub] with the evaluation's object + asking for a result + is expected not to be destroyed + assigns created_at + is expected to be persisted + is expected not to be new record + overriding persistence method: #touch + overrides the method with any arity + raises an informative error if the method is called + overriding persistence method: #update! + raises an informative error if the method is called + overrides the method with any arity + overriding persistence method: #decrement! + raises an informative error if the method is called + overrides the method with any arity + overriding persistence method: #destroy! + overrides the method with any arity + raises an informative error if the method is called + overriding persistence method: #update_attributes + 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 + overriding persistence method: #reload + raises an informative error if the method is called + overrides the method with any arity + overriding persistence method: #connection + raises an informative error if the method is called + overrides the method with any arity + overriding persistence method: #update_column + 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 + 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 + overrides the method with any arity + raises an informative error if the method is called + overriding persistence method: #update + raises an informative error if the method is called + 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: #toggle! + raises an informative error if the method is called + overrides the method with any arity + overriding persistence method: #increment! + overrides the method with any arity + raises an informative error if the method is called + overriding persistence method: #update_attribute + 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 + it should behave like strategy with strategy: :build + runs the factory with the correct overrides + finds the factory with the correct factory name -FactoryBot::DefinitionProxy#to_create - accepts a block to run in place of #save! +FactoryBot::Attribute::Dynamic with a string name + name + is expected to eq :name FactoryBot::Factory with a name ending in s - has a name has a build class - -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::Factory with a string for a name has a name -FactoryBot::DefinitionProxy#initialize_with - defines the constructor on the definition - -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::Factory when defined with a custom class name - has a build_class equal to its custom class name - -FactoryBot::DefinitionProxy adding callbacks - adding an :after_create callback succeeds - adding both a :before_stub and a :before_create callback succeeds - adding an :after_build callback succeeds - adding an :after_stub callback succeeds - adding both an :after_stub and an :after_create callback succeeds - adding both an :after_stub and a :before_create callback succeeds - -FactoryBot::Attribute - is not an association - converts the name attribute to a symbol - -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::NullFactory - delegates attributes to its definition - delegates callbacks to its definition - delegates constructor to its definition - has FactoryBot::Evaluator as its evaluator class - has a nil value for its compile attribute - delegates defined traits to its definition - has a nil value for its class_name attribute - has an instance of FactoryBot::AttributeList for its attributes attribute - -FactoryBot::DefinitionProxy#sequence - creates a new sequence with an overridden starting value - creates a new sequence with a block - creates a new sequence starting at 1 - -FactoryBot::Callback - runs its block with one parameter - converts strings to symbols - has a name - runs its block with two parameters - runs its block with no parameters +FactoryBot aliases + for a foreign key should include both the suffixed and un-suffixed variants + for an attribute which starts with an underscore should not include a non-underscored version + for an attribute should include the original attribute and a version suffixed with '_id' -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 +Pending: (Failures listed here are expected and do not affect your suite's status) -FactoryBot::DefinitionProxy#transient - makes all attributes added ignored + 1) FactoryBot::DefinitionProxy#method_missing raises a NoMethodError when called with a static-attribute-like argument + # No reason given + # ./spec/factory_bot/definition_proxy_spec.rb:66 -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 +Finished in 0.88336 seconds (files took 0.70089 seconds to load) +290 examples, 0 failures, 1 pending -FactoryBot::Decorator::AttributeHash - #attributes - returns a hash of attributes - with an attribute called 'attributes' - does not call itself recursively +Randomized with seed 55831 -FactoryBot::Factory human names - parses names with underscores - parses human names with underscores - parses names with big letters - parses human names with big letters - parses human names with aliases - parses names without underscores - parses human names without underscores - parses names with aliases +/usr/bin/ruby3.1 -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 -definition loading - 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 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 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.rb - is expected to load definitions from spec/factories/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 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 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 test/factories - it should behave like finds definitions - is expected to load definitions from test/factories/person_factory.rb - is expected to load definitions from test/factories/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 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/post_factory.rb - is expected to load definitions from test/factories/person_factory.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 several factories files under test/factories in non-alphabetical order - loads the files in the right order +Randomized with seed 63149 -FactoryBot::NullObject - does not respond to other methods - responds to the given methods +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_stubbed + admin + is expected to equal true + name + is expected to eq "Jack" + adding traits in build + name + is expected to eq "Joe" + admin + is expected to equal true -FactoryBot::AttributeList filter based on ignored attributes - filters #ignored attributes - filters #non_ignored attributes +initialize_with with a hash argument + builds the object correctly -FactoryBot::Attribute::Dynamic - name - is expected to eq :first_name - with a block returning a static value - returns the value when executing the proc - with a block returning a sequence - raises a sequence abuse error - with a block referencing an attribute on the attribute - evaluates the attribute from the attribute - with a block returning its block-level variable - returns self when executing the proc +defaulting `id` + allows overriding id -FactoryBot::Factory when given a class that overrides #to_s - sets build_class correctly +build multiple instances + with a block that receives both the object and an index + correctly uses the set value + with default attributes + overrides the default values + without default attributes + uses the default factory values + builds (but doesn't save) all the posts + length + is expected to eq 20 + with a block + correctly uses the set value -FactoryBot - finds a registered strategy - .use_parent_strategy - is true by default +setting private attributes + raises a NoMethodError -FactoryBot::Registry - knows when an object is not registered - finds a registered object with square brackets - finds a registered object - adds and returns the object registered - does not include duplicate objects with registered under different names - raises when an object cannot be found - knows that an object is registered by string - includes a did_you_mean message - clears registered factories - iterates registered objects - knows that an object is registered by symbol - is an enumerable +traits with to_create + gives base traits normal priority + gives additional traits higher priority than base traits and factory definition + can apply to_create from traits + can apply to_create from the definition + gives base traits lower priority than overrides + gives additional traits higher priority than to_create from the definition -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 +associations overriding :strategy + uses the overridden create strategy to create the association -FactoryBot::Attribute::Sequence - assigns the next value in the sequence - name - is expected to eq :first_name +initialize_with with an 'attributes' attribute + assigns attributes 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 +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 -FactoryBot::Factory - has a factory name - returns associations - creates a new factory while overriding the parent class - includes associations from the parent factory - has a build class - guesses the build class from the factory name - creates a new factory using the class of the parent - 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 +inline traits overriding existing attributes + prefers attributes on factories over attributes from non-inline traits + returns the default status + prefers inline trait attributes over default 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 + prefers inline trait attributes over traits on a factory -FactoryBot after defining an alias - the list of aliases should include a variant with no suffix at all, and one with an '_id' suffix +calling `create` with a block + passes the created instance + returns the created instance -FactoryBot::DefinitionProxy#trait - declares a trait +a built instance with strategy: :create + is expected to be new record + assigns and saves associations -FactoryBot::AttributeList#associations - returns associations +attributes defined using Symbol#to_proc + assigns overridden value correctly + assigns values correctly + assigns value with override correctly -Pending: (Failures listed here are expected and do not affect your suite's status) +finding factories keyed by class instead of symbol + doesn't find the factory - 1) FactoryBot::DefinitionProxy#method_missing raises a NoMethodError when called with a static-attribute-like argument - # No reason given - # ./spec/factory_bot/definition_proxy_spec.rb:66 +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 -Finished in 0.66647 seconds (files took 0.49888 seconds to load) -290 examples, 0 failures, 1 pending +traits with initialize_with + gives base traits normal priority + gives base traits lower priority than overrides + gives additional traits higher priority than base traits and factory definition + can apply initialize_with from the definition + can apply initialize_with from traits + gives additional traits higher priority than initialize_with from the definition -Randomized with seed 24308 +initialize_with non-ORM-backed objects + generates random data + allows for overrides -/usr/bin/ruby3.1 -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 +register custom strategies + allows adding additional 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 + allows overriding default strategies -Randomized with seed 44372 +transient attributes + 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 :rockstar + is expected not to have key :upcased + with a transient variable assigned + generates the correct attributes on a groupie + 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 + without transient variables assigned + uses the default value of the attribute -assigning values from a transient attribute - does not ignore an _id attribute that is an alias for a transient attribute +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 symbol + can be invoked with a string + when trait is defined as struct + can be invoked with a string + can be invoked with a struct + when trait is defined as a symbol + can be invoked with a symbol + can be invoked with a string -global callbacks - triggers after build callbacks for all factories +configuring the starting id + defines which id build_stubbed instances start with -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 +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 + reusing traits + name + is expected to eq "Johnny Rockstar!!!" + email + is expected to eq "Johnny Rockstar!!!@example.com" + login + is expected to eq "JOHNNY ROCKSTAR!!!" + redefining attributes + creating admin + without overrides + name + is expected to eq "Great User" + admin + is expected to equal true + email + is expected to eq "Great User-modified@example.com" + overriding the name + email + is expected to eq "wonderful-modified@example.com" + admin + is expected to equal true + name + is expected to eq "wonderful" + 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 email + name + is expected to eq "Great User" + email + is expected to eq "perfect@example.com" + overriding the name + name + is expected to eq "wonderful" + email + is expected to eq "wonderful-modified@example.com" + without overrides + email + is expected to eq "Great User-modified@example.com" + 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 + login + is expected to eq "GREAT USER" + name + is expected to eq "Great User" + adding callbacks + login + is expected to be nil + name + is expected to eq "great user" -initialize_with with FG attributes that are transient - name - is expected to eq "Handsome Chap from .construct" +calling `build` with a block + passes the built instance + returns the built instance -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 -making sure the factory is properly compiled the first time we want to instantiate it - can honor traits on the very first call +binding a callback to multiple callbacks + binds the callback to stubbing + binds the callback to creation + does not bind the callback to building an instance generated by a factory with multiple traits + factory created with alternate syntax for specifying trait + where trait name and attribute are the same + great + is expected to eq "GREAT!!!" + gender + is expected to eq "Male" + where trait name and attribute are the same and attribute is overridden + great + is expected to eq "SORT OF!!!" + child factory using grandparents' trait + great + is expected to eq "GREAT!!!" 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" - the child class with one trait - is expected to be admin + gender + is expected to be nil + 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 name is expected to eq "John" gender is expected to be nil - factory using global trait - email - is expected to eq "Bill@example.com" - name - is expected to eq "Bill" - the child 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" + the child class with one trait + is expected to be admin + gender + is expected to be nil name - is expected to eq "Jane" + 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 @@ -1739,587 +1991,426 @@ 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" - 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" + name + is expected to eq "Jane" + factory using global trait + email + is expected to eq "Bill@example.com" + name + is expected to eq "Bill" + 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 "Jane" gender is expected to eq "Female" - child class with scoped trait and inherited trait + name + is expected to eq "Jane" + the child with multiple traits is expected to be admin gender is expected to eq "Female" name - is expected to eq "Judy" - child factory using grandparents' trait - great - is expected to eq "GREAT!!!" - 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!!!" - 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!!!" - gender - is expected to eq "Male" - where trait name and attribute are the same - great - is expected to eq "GREAT!!!" + is expected to eq "Jane" -binding a callback to multiple callbacks - does not bind the callback to building - binds the callback to creation - binds the callback to stubbing +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 -custom callbacks - runs a custom after callback when the proper strategy executes - runs a custom before callback when the proper strategy executes - runs a custom callback without prepending before or after when the proper strategy executes +initialize_with doesn't duplicate assignment on attributes accessed from initialize_with + instantiates the correct object -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 +global skip_create + honors overridden to_create + honors inline trait to_create + does not persist any record + does not persist child records -inline traits overriding existing attributes - prefers inline traits over attributes on factories - prefers attributes on factories over attributes from non-inline traits - prefers traits on a factory over default attributes - prefers inline trait attributes over traits on a factory - prefers overridden attributes over attributes from traits, inline traits, or attributes on factories - returns the default status - prefers inline trait attributes over default attributes +a generated stub instance + disables decrement! + disables connection + assigns a default attribute + isn't a new record + generates unique ids + disables increment! + allows toggle + disables save + has an id + disables reload + assigns associations + allows decrement + assigns an overridden attribute + disables update_attribute + disables toggle! + isn't changed + disables destroy + allows increment + assigns associations that aren't new records -build multiple instances - without default attributes - uses the default factory values - builds (but doesn't save) all the posts - length - is expected to eq 20 - with a block - correctly uses the set value - with a block that receives both the object and an index - correctly uses the set value - with default attributes - overrides the default values +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) +a custom create passing in an evaluator + passes the evaluator to the custom create block + +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 + +initialize_with for a constructor that requires a block + executes the block correctly + +assigning values from a transient attribute + does not ignore an _id attribute that is an alias for a transient attribute + aliases and overrides two is expected to be nil one is expected to eq "override" -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 an upcased rockstar - generates the correct attributes on a groupie - generates the correct attributes on a rockstar - returning attributes for a factory - is expected not to have key :upcased - is expected not to have key :four - is expected to have key :email - is expected to have key :name - is expected not to have key :rockstar - defining a child factory before a parent creates admin factories correctly -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 +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 -traits with to_create - can apply to_create from the definition - gives base traits normal priority - gives additional traits higher priority than base traits and factory definition - gives base traits lower priority than overrides - can apply to_create from traits - gives additional traits higher priority than to_create from the definition +making sure the factory is properly compiled the first time we want to instantiate it + can honor traits on the very first call + +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 an instance generated by a factory named a camel case string registers the UserModel factory -FactoryBot.rewind_sequences - still allows global sequences prefixed with a factory name - allows setting sequences within identically named traits - resets inline sequences back to their starting value - resets all sequences back to their starting values - does not collide with globally registered factories - -setting private attributes - raises a NoMethodError - a stubbed instance overriding strategy - acts as if it is saved in the database assigns associations and acts as if it is saved + acts as if it is saved in the database -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" - -initialize_with has access to all attributes for construction - assigns attributes correctly - -defining methods inside FactoryBot - raises with a meaningful message +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 -assigning overrides that are also private methods on object - format - is expected to eq "Great" - more_format - is expected to eq "format: Great" - some_funky_method - is expected to eq "foobar!" - y - is expected to eq 12345 +including FactoryBot::Syntax::Methods when custom strategies have been declared + allows adding additional strategies -traits added via strategy - adding traits in create_list - creates all the records - length - is expected to eq 2 - adding traits in build_stubbed - admin - is expected to equal true - name - is expected to eq "Jack" - adding traits in build - admin - is expected to equal true - name - is expected to eq "Joe" - 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 attributes_for - [:admin] - is expected to equal true - [:name] - is expected to eq "John" - adding traits in build_list - builds all the records - length - is expected to eq 2 +#add_attribute + assigns attributes for reserved words on .build + assigns attributes for reserved words on .attributes_for -a built instance with strategy: :create - is expected to be new record - assigns and saves associations +global callbacks + triggers after build callbacks for all factories global to_create uses to_create globally across FactoryBot.define - handles child to_create - handles child to_create with trait handles base to_create handles inline trait override - -associations overriding :strategy - uses the overridden create strategy to create the association - -initialize_with implicit constructor - instantiates the correct object - -defaulting `created_at` - doesn't add created_at to objects who don't have the method - doesn't allow setting created_at on an object that doesn't define it - allows overriding created_at for objects with created_at - behaves the same as a non-stubbed created_at - is doesn't mark the object as changed - allows assignment of created_at - defaults created_at for objects with created_at - -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 - can apply initialize_with from traits - gives additional traits higher priority than initialize_with from the definition - gives base traits lower priority than overrides - -initialize_with non-ORM-backed objects - allows for overrides - generates random data - -association assignment from nested attributes - assigns the correct amount of comments when overridden - assigns the correct amount of comments - -a custom create passing in an evaluator - passes the evaluator to the custom create block - -associations - when building interrelated associations - assigns the instance passed as an association attribute - connects records with interdependent relationships - when accidentally using an implicit declaration as an override - raises an error - when building collection associations - builds the association according to the given strategy - when accidentally using an implicit declaration for the factory - raises an error - -initialize_with with a hash argument - builds the object correctly - -enum traits - when automatically_define_enum_traits is true - builds traits for each enumerated value using a custom enumerable - builds traits for each enumerated value using a provided list of values as a Hash - builds traits automatically for model enum field - prefers user defined traits over automatically built traits - builds traits for each enumerated value using a provided list of values as an Array - 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 - -looking up traits that don't exist - 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 - when passing an invalid override trait - raises a KeyError - -when a self-referential trait is defined - raises a TraitDefinitionError - raises a TraitDefinitionError + handles child to_create + handles child to_create with trait calling methods on the model instance - with the attribute being overridden - uses the overridden value during attributes_for - uses the overridden value 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 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 -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 - -sequences - generates several values in the correct format - generates few values of the sequence - generates sequential numbers if no block is given - generates aliases for the sequence that reference the same block - generates aliases for the sequence that reference the same block and retains value - -transient sequences - increments sequences correctly - -implicit traits containing callbacks - only runs the callback once - -create multiple instances - 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 default attributes - overrides the default values - with a block - uses the new values - with a block that receives both the object and an index - uses the new values +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 -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 - behaves the same as a non-stubbed updated_at - doesn't add updated_at to objects who don't have the method - allows assignment of updated_at - defaults updated_at for objects with updated_at +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 defining multiple attributes returns the correct value for overridden attributes from traits -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 - -global initialize_with - handles child initialize_with with trait - handles base initialize_with - uses initialize_with globally across FactoryBot.define - handles child initialize_with - handles inline trait override +applying inline traits + applies traits only to the instance generated for that call -calling `build_stubbed` with a block - passes the stub instance - returns the stub instance +initialize_with implicit constructor + instantiates the correct object -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 - adding callbacks - name - is expected to eq "great user" - login - is expected to be nil - redefining attributes - creating user - overriding the name - email - is expected to eq "wonderful-modified@example.com" - name - is expected to eq "wonderful" - without overrides - name - is expected to eq "Great User" - email - is expected to eq "Great User-modified@example.com" - overriding the email - name - is expected to eq "Great User" - email - is expected to eq "perfect@example.com" - creating admin - without overrides - admin - is expected to equal true - name - is expected to eq "Great User" - email - is expected to eq "Great User-modified@example.com" - overriding the name - email - is expected to eq "wonderful-modified@example.com" - admin - is expected to equal true - name - is expected to eq "wonderful" - overriding the email - email - is expected to eq "perfect@example.com" - name - is expected to eq "Great User" - 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!!!" - simple modification - doesn't allow the factory to be subsequently defined - does allow the factory to be subsequently modified - login - is expected to eq "GREAT USER" - name - is expected to eq "Great User" +nested factories with different parents + honors :parent over the factory block nesting -global skip_create - honors overridden to_create - does not persist any record - does not persist child records - honors inline trait to_create +association assignment from nested attributes + assigns the correct amount of comments + assigns the correct amount of comments when overridden -including FactoryBot::Syntax::Methods when custom strategies have been declared - allows adding additional strategies +defaulting `updated_at` + defaults updated_at for objects with updated_at + is doesn't mark the object as changed + doesn't allow setting updated_at on an object that doesn't define it + allows overriding updated_at for objects with updated_at + allows assignment of updated_at + doesn't add updated_at to objects who don't have the method + behaves the same as a non-stubbed updated_at -using ActiveSupport::Instrumentation to track run_factory interaction - tracks proper time of creating the record - builds the correct payload +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" sequences are evaluated in the correct context - builds a sequence calling sprintf correctly - invokes a method with no arguments on the instance invokes the correct method on the instance + invokes a method with no arguments on the instance allows direct reference of a method in a sequence + builds a sequence calling sprintf correctly -a created instance - is expected not to be new record - assigns and saves associations +custom callbacks + runs a custom after callback when the proper strategy executes + runs a custom callback without prepending before or after when the proper strategy executes + runs a custom before callback when the proper strategy executes + +implicit traits containing callbacks + only runs the callback once + +defining methods inside FactoryBot + raises with a meaningful message + +initialize_with has access to all attributes for construction + assigns attributes correctly Ruby 3.0: attributes_for destructuring syntax supports being destructured -calling `build` with a block - passes the built instance - returns the built instance +multiple creates and transient attributes to dynamically build attribute lists + generates the correct number of posts + allows the number of posts to be modified -skipping the default create - doesn't execute anything when creating the instance +an instance generated by a factory + registers the user factory -initialize_with with an 'attributes' attribute - assigns attributes correctly +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" + email + is expected to eq "john@example.com" + login + is expected to eq "john@example.com" + 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 + name + is expected to eq "admin" + email + is expected to eq "admin@example.com" + login + is expected to eq "admin@example.com" + upper_email + is expected to eq "ADMIN@EXAMPLE.COM" -register custom 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 - allows adding additional strategies +create multiple instances + without default attributes + uses the default factory values + creates all the posts + length + is expected to eq 20 + 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 default attributes + overrides the default values + with a block + uses the new values + +when a self-referential trait is defined + raises a TraitDefinitionError + raises a TraitDefinitionError FactoryBot.lint raises when a factory is invalid - does not raise when all factories are valid allows for selective linting - verbose linting - prints the backtrace for each factory error - factory strategy for linting - uses the requested strategy during trait validation - uses the requested strategy + does not raise when all factories are valid 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 during trait validation + uses the requested strategy + verbose linting + prints the backtrace for each factory error -attributes defined using Symbol#to_proc - assigns values correctly - assigns overridden value correctly - assigns value with override correctly +transient sequences + increments sequences correctly + +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 + maintains 'Did you mean?' suggestions at the end of the error message + raises a KeyError including the factory name a custom create uses the custom create block instead of save -a generated stub instance - disables increment! - assigns an overridden attribute - disables reload - assigns a default attribute - allows decrement - disables decrement! - isn't a new record - disables connection - generates unique ids - allows increment - allows toggle - assigns associations that aren't new records - disables toggle! - assigns associations - disables update_attribute - disables destroy - has an id - isn't changed - disables save +an instance generated by a factory with a custom class name + is expected to be admin + is expected to be a kind of User(id: integer, admin: boolean) -an instance generated by a factory - registers the user factory +a generated attributes hash + assigns a lazy, dependent attribute + doesn't assign associations + assigns a default value + assigns an overridden value -finding factories keyed by class instead of symbol - doesn't find the factory +callbacks using Symbol#to_proc + runs the callback correctly -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 - when trait is defined as a symbol - can be invoked with a symbol - can be invoked with a string - when trait is defined as struct - can be invoked with a string - can be invoked with a struct +global initialize_with + handles child initialize_with + handles child initialize_with with trait + uses initialize_with globally across FactoryBot.define + handles inline trait override + handles base initialize_with -traits and dynamic attributes that are applied simultaneously - email - is expected to eq "John@example.com" - name - is expected to eq "John" - combined - is expected to eq "John " +create multiple instances + without default attributes + uses the default factory values + creates all the posts + length + is expected to eq 2 -callbacks using syntax methods without referencing FactoryBot explicitly - works when the callback has no variables - works when the callback has one variable - works when the callback has two variables +`attributes_for` for a class whose constructor has required params + [:name] + is expected to eq "John Doe" + +skipping the default create + doesn't execute anything when creating the instance overridden primary keys conventions a stubbed instance with no primary key builds a stubbed instance behaves like a persisted record a stubbed instance with a uuid primary key + has a uuid primary key builds a stubbed instance behaves like a persisted record - has a uuid primary key - -initialize_with for a constructor that requires a block - executes the block correctly -nested factories with different parents - honors :parent over the factory block nesting +defaulting `created_at` + behaves the same as a non-stubbed created_at + allows assignment of created_at + doesn't add created_at to objects who don't have the method + is doesn't mark the object as changed + defaults created_at for objects with created_at + doesn't allow setting created_at on an object that doesn't define it + allows overriding created_at for objects with created_at -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 +traits with callbacks + executes callbacks in the order assigned + when the factory has an implicit trait + name + is expected to eq "JOHN" + when the factory has a trait passed via arguments + name + is expected to eq "JOHN" -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 +syntax methods within dynamic attributes + can access syntax methods from 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 -multiple creates and transient attributes to dynamically build attribute lists - generates the correct number of posts - allows the number of posts to be modified +a stubbed instance + assigns associations and acts as if it is saved + acts as if it came from the database a built instance is expected to be new record - when the :use_parent_strategy config option is set to true - assigns but does not save associations 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 stubbed instance - acts as if it came from the database - assigns associations and acts as if it is saved +calling `attributes_for` with a block + passes the hash of attributes + returns the hash of attributes -callbacks using Symbol#to_proc - runs the callback correctly +assigning overrides that are also private methods on object + y + is expected to eq 12345 + more_format + is expected to eq "format: Great" + format + is expected to eq "Great" + some_funky_method + is expected to eq "foobar!" -defaulting `id` - allows overriding id +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 -reload - does not reset the value of use_parent_strategy +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 + connects records with interdependent relationships + assigns the instance passed as an association attribute + +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 + when automatically_define_enum_traits is true + 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 automatically for model enum field + prefers user defined traits over automatically built traits + builds traits for each enumerated value using a custom enumerable declaring attributes on a Factory that are private methods on Object link @@ -2329,42 +2420,31 @@ system is expected to eq false -applying inline traits - applies traits only to the instance generated for that call +initialize_with with FG attributes that are transient + name + is expected to eq "Handsome Chap from .construct" -a generated attributes hash - assigns a lazy, dependent attribute - doesn't assign associations - assigns an overridden value - assigns a default value +attribute overrides + with a non-admin posting + secure + is expected to be nil + with an admin posting + secure + is expected to eq false + with no user posting + secure + is expected to be nil callbacks - runs child callback after parent callback - runs the after(:stub) callback when stubbing - runs both the after(:build) and after(:create) callbacks when creating runs the after(:build) callback when building runs both the after(:stub) callback on the factory and the inherited after(:stub) callback + runs both the after(:build) and after(:create) callbacks when creating + runs the after(:stub) callback when stubbing + runs child callback after parent callback -calling `create` with a block - returns the created instance - passes the created instance - -#add_attribute - assigns attributes for reserved words on .attributes_for - assigns attributes for reserved words on .build - -`attributes_for` for a class whose constructor has required params - [:name] - is expected to eq "John Doe" - -syntax methods within dynamic attributes - can access syntax methods from 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 - -initialize_with doesn't duplicate assignment on attributes accessed from initialize_with - instantiates the correct object +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 with non-FG attributes age @@ -2372,62 +2452,18 @@ name is expected to eq "John Doe" -an instance generated by a factory that inherits from another factory - 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) - name - is expected to eq "admin" - login - is expected to eq "admin@example.com" - email - is expected to eq "admin@example.com" - upper_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" - -configuring the starting id - defines which id build_stubbed instances start with - -calling `attributes_for` with a block - passes the hash of attributes - returns the hash of attributes - -traits with callbacks - executes callbacks in the order assigned - when the factory has an implicit trait - name - is expected to eq "JOHN" - when the factory has a trait passed via arguments - name - is expected to eq "JOHN" - -using ActiveSupport::Instrumentation to track compile_factory interaction - tracks proper time of compiling the factory +using ActiveSupport::Instrumentation to track run_factory interaction + tracks proper time of creating the record builds the correct payload - when factory with base traits - builds the correct payload - when factory with additional traits - builds the correct payload -create multiple instances - without default attributes - creates all the posts - uses the default factory values - length - is expected to eq 2 +calling `build_stubbed` with a block + returns the stub instance + passes the stub instance -Finished in 3.18 seconds (files took 0.57912 seconds to load) +Finished in 4.51 seconds (files took 0.72913 seconds to load) 370 examples, 0 failures -Randomized with seed 44372 +Randomized with seed 63149 mv ./.gem2deb.Gemfile.lock Gemfile.lock @@ -2462,12 +2498,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/35066/tmp/hooks/B01_cleanup starting +I: user script /srv/workspace/pbuilder/35066/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/28190 and its subdirectories -I: Current time: Sat May 31 09:49:23 -12 2025 -I: pbuilder-time-stamp: 1748728163 +I: removing directory /srv/workspace/pbuilder/35066 and its subdirectories +I: Current time: Mon Apr 29 05:27:30 +14 2024 +I: pbuilder-time-stamp: 1714318050