Diff of the two buildlogs: -- --- b1/build.log 2023-08-07 00:36:15.308855212 +0000 +++ b2/build.log 2023-08-07 00:37:04.607192019 +0000 @@ -1,6 +1,6 @@ I: pbuilder: network access will be disabled during build -I: Current time: Sat Sep 7 18:58:39 -12 2024 -I: pbuilder-time-stamp: 1725778719 +I: Current time: Mon Aug 7 14:36:17 +14 2023 +I: pbuilder-time-stamp: 1691368577 I: Building the build Environment I: extracting base tarball [/var/cache/pbuilder/bullseye-reproducible-base.tgz] I: copying local configuration @@ -17,8 +17,8 @@ I: copying [./ruby-factory-bot_5.1.1-1.debian.tar.xz] I: Extracting source gpgv: unknown type of key resource 'trustedkeys.kbx' -gpgv: keyblock resource '/tmp/dpkg-verify-sig.9KlVA0YB/trustedkeys.kbx': General error -gpgv: Signature made Mon Feb 3 03:39:04 2020 -12 +gpgv: keyblock resource '/tmp/dpkg-verify-sig.3Sx5z5z2/trustedkeys.kbx': General error +gpgv: Signature made Tue Feb 4 05:39:04 2020 +14 gpgv: using EDDSA key C47EBFCC4E57E9FC32CA3400461BEE5D240A9E91 gpgv: Can't check signature: No public key dpkg-source: warning: failed to verify signature on ./ruby-factory-bot_5.1.1-1.dsc @@ -30,135 +30,166 @@ 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/4185135/tmp/hooks/D02_print_environment starting +I: user script /srv/workspace/pbuilder/1165299/tmp/hooks/D01_modify_environment starting +debug: Running on ionos1-amd64. +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 Aug 7 14:36 /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/1165299/tmp/hooks/D01_modify_environment finished +I: user script /srv/workspace/pbuilder/1165299/tmp/hooks/D02_print_environment starting I: set - BUILDDIR='/build' - BUILDUSERGECOS='first user,first room,first work-phone,first home-phone,first other' - BUILDUSERNAME='pbuilder1' - BUILD_ARCH='amd64' - DEBIAN_FRONTEND='noninteractive' - DEB_BUILD_OPTIONS='buildinfo=+all reproducible=+all,-fixfilepath parallel=16 ' - DISTRIBUTION='bullseye' - HOME='/root' - HOST_ARCH='amd64' + BASH=/bin/sh + BASHOPTS=checkwinsize:cmdhist:complete_fullquote:extquote:force_fignore:globasciiranges:hostcomplete:interactive_comments:progcomp:promptvars:sourcepath + BASH_ALIASES=() + BASH_ARGC=() + BASH_ARGV=() + BASH_CMDS=() + BASH_LINENO=([0]="12" [1]="0") + BASH_SOURCE=([0]="/tmp/hooks/D02_print_environment" [1]="/tmp/hooks/D02_print_environment") + BASH_VERSINFO=([0]="5" [1]="1" [2]="4" [3]="1" [4]="release" [5]="x86_64-pc-linux-gnu") + BASH_VERSION='5.1.4(1)-release' + BUILDDIR=/build + BUILDUSERGECOS='second user,second room,second work-phone,second home-phone,second other' + BUILDUSERNAME=pbuilder2 + BUILD_ARCH=amd64 + DEBIAN_FRONTEND=noninteractive + DEB_BUILD_OPTIONS='buildinfo=+all reproducible=+all,-fixfilepath parallel=15 ' + DIRSTACK=() + DISTRIBUTION=bullseye + EUID=0 + FUNCNAME=([0]="Echo" [1]="main") + GROUPS=() + HOME=/root + HOSTNAME=i-capture-the-hostname + HOSTTYPE=x86_64 + HOST_ARCH=amd64 IFS=' ' - INVOCATION_ID='7a2e8455065d4b10be38445432731a2b' - 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='4185135' - PS1='# ' - PS2='> ' + INVOCATION_ID=f073ff97944f416d895d690124dd0033 + LANG=C + LANGUAGE=et_EE:et + LC_ALL=C + MACHTYPE=x86_64-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=1165299 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.02er7acY/pbuilderrc_8ELj --distribution bullseye --hookdir /etc/pbuilder/first-build-hooks --debbuildopts -b --basetgz /var/cache/pbuilder/bullseye-reproducible-base.tgz --buildresult /srv/reproducible-results/rbuild-debian/r-b-build.02er7acY/b1 --logfile b1/build.log ruby-factory-bot_5.1.1-1.dsc' - SUDO_GID='110' - SUDO_UID='105' - SUDO_USER='jenkins' - TERM='unknown' - TZ='/usr/share/zoneinfo/Etc/GMT+12' - USER='root' - _='/usr/bin/systemd-run' - http_proxy='http://85.184.249.68: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.02er7acY/pbuilderrc_QDvX --distribution bullseye --hookdir /etc/pbuilder/rebuild-hooks --debbuildopts -b --basetgz /var/cache/pbuilder/bullseye-reproducible-base.tgz --buildresult /srv/reproducible-results/rbuild-debian/r-b-build.02er7acY/b2 --logfile b2/build.log ruby-factory-bot_5.1.1-1.dsc' + SUDO_GID=110 + SUDO_UID=105 + SUDO_USER=jenkins + TERM=unknown + TZ=/usr/share/zoneinfo/Etc/GMT-14 + UID=0 + USER=root + _='I: set' + http_proxy=http://78.137.99.97:3128 I: uname -a - Linux ionos5-amd64 6.1.0-10-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.1.38-2 (2023-07-27) x86_64 GNU/Linux + Linux i-capture-the-hostname 6.1.0-10-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.1.38-2 (2023-07-27) x86_64 GNU/Linux I: ls -l /bin total 5476 - -rwxr-xr-x 1 root root 1234376 Mar 27 2022 bash - -rwxr-xr-x 3 root root 38984 Jul 20 2020 bunzip2 - -rwxr-xr-x 3 root root 38984 Jul 20 2020 bzcat - lrwxrwxrwx 1 root root 6 Jul 20 2020 bzcmp -> bzdiff - -rwxr-xr-x 1 root root 2225 Jul 20 2020 bzdiff - lrwxrwxrwx 1 root root 6 Jul 20 2020 bzegrep -> bzgrep - -rwxr-xr-x 1 root root 4877 Sep 4 2019 bzexe - lrwxrwxrwx 1 root root 6 Jul 20 2020 bzfgrep -> bzgrep - -rwxr-xr-x 1 root root 3775 Jul 20 2020 bzgrep - -rwxr-xr-x 3 root root 38984 Jul 20 2020 bzip2 - -rwxr-xr-x 1 root root 18424 Jul 20 2020 bzip2recover - lrwxrwxrwx 1 root root 6 Jul 20 2020 bzless -> bzmore - -rwxr-xr-x 1 root root 1297 Jul 20 2020 bzmore - -rwxr-xr-x 1 root root 43936 Sep 23 2020 cat - -rwxr-xr-x 1 root root 72672 Sep 23 2020 chgrp - -rwxr-xr-x 1 root root 64448 Sep 23 2020 chmod - -rwxr-xr-x 1 root root 72672 Sep 23 2020 chown - -rwxr-xr-x 1 root root 151168 Sep 23 2020 cp - -rwxr-xr-x 1 root root 125560 Dec 10 2020 dash - -rwxr-xr-x 1 root root 113664 Sep 23 2020 date - -rwxr-xr-x 1 root root 80968 Sep 23 2020 dd - -rwxr-xr-x 1 root root 93936 Sep 23 2020 df - -rwxr-xr-x 1 root root 147176 Sep 23 2020 dir - -rwxr-xr-x 1 root root 84440 Jan 20 2022 dmesg - lrwxrwxrwx 1 root root 8 Nov 6 2019 dnsdomainname -> hostname - lrwxrwxrwx 1 root root 8 Nov 6 2019 domainname -> hostname - -rwxr-xr-x 1 root root 39712 Sep 23 2020 echo - -rwxr-xr-x 1 root root 28 Jan 24 2023 egrep - -rwxr-xr-x 1 root root 39680 Sep 23 2020 false - -rwxr-xr-x 1 root root 28 Jan 24 2023 fgrep - -rwxr-xr-x 1 root root 69032 Jan 20 2022 findmnt - -rwsr-xr-x 1 root root 34896 Feb 26 2021 fusermount - -rwxr-xr-x 1 root root 203072 Jan 24 2023 grep - -rwxr-xr-x 2 root root 2346 Apr 9 2022 gunzip - -rwxr-xr-x 1 root root 6447 Apr 9 2022 gzexe - -rwxr-xr-x 1 root root 98048 Apr 9 2022 gzip - -rwxr-xr-x 1 root root 22600 Nov 6 2019 hostname - -rwxr-xr-x 1 root root 72840 Sep 23 2020 ln - -rwxr-xr-x 1 root root 56952 Feb 7 2020 login - -rwxr-xr-x 1 root root 147176 Sep 23 2020 ls - -rwxr-xr-x 1 root root 149736 Jan 20 2022 lsblk - -rwxr-xr-x 1 root root 85184 Sep 23 2020 mkdir - -rwxr-xr-x 1 root root 76896 Sep 23 2020 mknod - -rwxr-xr-x 1 root root 48064 Sep 23 2020 mktemp - -rwxr-xr-x 1 root root 59632 Jan 20 2022 more - -rwsr-xr-x 1 root root 55528 Jan 20 2022 mount - -rwxr-xr-x 1 root root 18664 Jan 20 2022 mountpoint - -rwxr-xr-x 1 root root 147080 Sep 23 2020 mv - lrwxrwxrwx 1 root root 8 Nov 6 2019 nisdomainname -> hostname - lrwxrwxrwx 1 root root 14 Dec 16 2021 pidof -> /sbin/killall5 - -rwxr-xr-x 1 root root 43872 Sep 23 2020 pwd - lrwxrwxrwx 1 root root 4 Mar 27 2022 rbash -> bash - -rwxr-xr-x 1 root root 52032 Sep 23 2020 readlink - -rwxr-xr-x 1 root root 72704 Sep 23 2020 rm - -rwxr-xr-x 1 root root 52032 Sep 23 2020 rmdir - -rwxr-xr-x 1 root root 27472 Sep 27 2020 run-parts - -rwxr-xr-x 1 root root 122224 Dec 22 2018 sed - lrwxrwxrwx 1 root root 4 Aug 8 03:47 sh -> dash - -rwxr-xr-x 1 root root 43808 Sep 23 2020 sleep - -rwxr-xr-x 1 root root 84928 Sep 23 2020 stty - -rwsr-xr-x 1 root root 71912 Jan 20 2022 su - -rwxr-xr-x 1 root root 39744 Sep 23 2020 sync - -rwxr-xr-x 1 root root 531928 Feb 16 2021 tar - -rwxr-xr-x 1 root root 14456 Sep 27 2020 tempfile - -rwxr-xr-x 1 root root 101408 Sep 23 2020 touch - -rwxr-xr-x 1 root root 39680 Sep 23 2020 true - -rwxr-xr-x 1 root root 14328 Feb 26 2021 ulockmgr_server - -rwsr-xr-x 1 root root 35040 Jan 20 2022 umount - -rwxr-xr-x 1 root root 39744 Sep 23 2020 uname - -rwxr-xr-x 2 root root 2346 Apr 9 2022 uncompress - -rwxr-xr-x 1 root root 147176 Sep 23 2020 vdir - -rwxr-xr-x 1 root root 63744 Jan 20 2022 wdctl - lrwxrwxrwx 1 root root 8 Nov 6 2019 ypdomainname -> hostname - -rwxr-xr-x 1 root root 1984 Apr 9 2022 zcat - -rwxr-xr-x 1 root root 1678 Apr 9 2022 zcmp - -rwxr-xr-x 1 root root 5898 Apr 9 2022 zdiff - -rwxr-xr-x 1 root root 29 Apr 9 2022 zegrep - -rwxr-xr-x 1 root root 29 Apr 9 2022 zfgrep - -rwxr-xr-x 1 root root 2081 Apr 9 2022 zforce - -rwxr-xr-x 1 root root 8049 Apr 9 2022 zgrep - -rwxr-xr-x 1 root root 2206 Apr 9 2022 zless - -rwxr-xr-x 1 root root 1842 Apr 9 2022 zmore - -rwxr-xr-x 1 root root 4577 Apr 9 2022 znew -I: user script /srv/workspace/pbuilder/4185135/tmp/hooks/D02_print_environment finished + -rwxr-xr-x 1 root root 1234376 Mar 28 2022 bash + -rwxr-xr-x 3 root root 38984 Jul 21 2020 bunzip2 + -rwxr-xr-x 3 root root 38984 Jul 21 2020 bzcat + lrwxrwxrwx 1 root root 6 Jul 21 2020 bzcmp -> bzdiff + -rwxr-xr-x 1 root root 2225 Jul 21 2020 bzdiff + lrwxrwxrwx 1 root root 6 Jul 21 2020 bzegrep -> bzgrep + -rwxr-xr-x 1 root root 4877 Sep 5 2019 bzexe + lrwxrwxrwx 1 root root 6 Jul 21 2020 bzfgrep -> bzgrep + -rwxr-xr-x 1 root root 3775 Jul 21 2020 bzgrep + -rwxr-xr-x 3 root root 38984 Jul 21 2020 bzip2 + -rwxr-xr-x 1 root root 18424 Jul 21 2020 bzip2recover + lrwxrwxrwx 1 root root 6 Jul 21 2020 bzless -> bzmore + -rwxr-xr-x 1 root root 1297 Jul 21 2020 bzmore + -rwxr-xr-x 1 root root 43936 Sep 24 2020 cat + -rwxr-xr-x 1 root root 72672 Sep 24 2020 chgrp + -rwxr-xr-x 1 root root 64448 Sep 24 2020 chmod + -rwxr-xr-x 1 root root 72672 Sep 24 2020 chown + -rwxr-xr-x 1 root root 151168 Sep 24 2020 cp + -rwxr-xr-x 1 root root 125560 Dec 11 2020 dash + -rwxr-xr-x 1 root root 113664 Sep 24 2020 date + -rwxr-xr-x 1 root root 80968 Sep 24 2020 dd + -rwxr-xr-x 1 root root 93936 Sep 24 2020 df + -rwxr-xr-x 1 root root 147176 Sep 24 2020 dir + -rwxr-xr-x 1 root root 84440 Jan 21 2022 dmesg + lrwxrwxrwx 1 root root 8 Nov 8 2019 dnsdomainname -> hostname + lrwxrwxrwx 1 root root 8 Nov 8 2019 domainname -> hostname + -rwxr-xr-x 1 root root 39712 Sep 24 2020 echo + -rwxr-xr-x 1 root root 28 Jan 25 2023 egrep + -rwxr-xr-x 1 root root 39680 Sep 24 2020 false + -rwxr-xr-x 1 root root 28 Jan 25 2023 fgrep + -rwxr-xr-x 1 root root 69032 Jan 21 2022 findmnt + -rwsr-xr-x 1 root root 34896 Feb 27 2021 fusermount + -rwxr-xr-x 1 root root 203072 Jan 25 2023 grep + -rwxr-xr-x 2 root root 2346 Apr 10 2022 gunzip + -rwxr-xr-x 1 root root 6447 Apr 10 2022 gzexe + -rwxr-xr-x 1 root root 98048 Apr 10 2022 gzip + -rwxr-xr-x 1 root root 22600 Nov 8 2019 hostname + -rwxr-xr-x 1 root root 72840 Sep 24 2020 ln + -rwxr-xr-x 1 root root 56952 Feb 8 2020 login + -rwxr-xr-x 1 root root 147176 Sep 24 2020 ls + -rwxr-xr-x 1 root root 149736 Jan 21 2022 lsblk + -rwxr-xr-x 1 root root 85184 Sep 24 2020 mkdir + -rwxr-xr-x 1 root root 76896 Sep 24 2020 mknod + -rwxr-xr-x 1 root root 48064 Sep 24 2020 mktemp + -rwxr-xr-x 1 root root 59632 Jan 21 2022 more + -rwsr-xr-x 1 root root 55528 Jan 21 2022 mount + -rwxr-xr-x 1 root root 18664 Jan 21 2022 mountpoint + -rwxr-xr-x 1 root root 147080 Sep 24 2020 mv + lrwxrwxrwx 1 root root 8 Nov 8 2019 nisdomainname -> hostname + lrwxrwxrwx 1 root root 14 Dec 17 2021 pidof -> /sbin/killall5 + -rwxr-xr-x 1 root root 43872 Sep 24 2020 pwd + lrwxrwxrwx 1 root root 4 Mar 28 2022 rbash -> bash + -rwxr-xr-x 1 root root 52032 Sep 24 2020 readlink + -rwxr-xr-x 1 root root 72704 Sep 24 2020 rm + -rwxr-xr-x 1 root root 52032 Sep 24 2020 rmdir + -rwxr-xr-x 1 root root 27472 Sep 28 2020 run-parts + -rwxr-xr-x 1 root root 122224 Dec 23 2018 sed + lrwxrwxrwx 1 root root 9 Aug 7 14:36 sh -> /bin/bash + -rwxr-xr-x 1 root root 43808 Sep 24 2020 sleep + -rwxr-xr-x 1 root root 84928 Sep 24 2020 stty + -rwsr-xr-x 1 root root 71912 Jan 21 2022 su + -rwxr-xr-x 1 root root 39744 Sep 24 2020 sync + -rwxr-xr-x 1 root root 531928 Feb 17 2021 tar + -rwxr-xr-x 1 root root 14456 Sep 28 2020 tempfile + -rwxr-xr-x 1 root root 101408 Sep 24 2020 touch + -rwxr-xr-x 1 root root 39680 Sep 24 2020 true + -rwxr-xr-x 1 root root 14328 Feb 27 2021 ulockmgr_server + -rwsr-xr-x 1 root root 35040 Jan 21 2022 umount + -rwxr-xr-x 1 root root 39744 Sep 24 2020 uname + -rwxr-xr-x 2 root root 2346 Apr 10 2022 uncompress + -rwxr-xr-x 1 root root 147176 Sep 24 2020 vdir + -rwxr-xr-x 1 root root 63744 Jan 21 2022 wdctl + lrwxrwxrwx 1 root root 8 Nov 8 2019 ypdomainname -> hostname + -rwxr-xr-x 1 root root 1984 Apr 10 2022 zcat + -rwxr-xr-x 1 root root 1678 Apr 10 2022 zcmp + -rwxr-xr-x 1 root root 5898 Apr 10 2022 zdiff + -rwxr-xr-x 1 root root 29 Apr 10 2022 zegrep + -rwxr-xr-x 1 root root 29 Apr 10 2022 zfgrep + -rwxr-xr-x 1 root root 2081 Apr 10 2022 zforce + -rwxr-xr-x 1 root root 8049 Apr 10 2022 zgrep + -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/1165299/tmp/hooks/D02_print_environment finished -> Attempting to satisfy build-dependencies -> Creating pbuilder-satisfydepends-dummy package Package: pbuilder-satisfydepends-dummy @@ -353,7 +384,7 @@ Get: 141 http://deb.debian.org/debian bullseye/main amd64 ruby-rspec-its all 1.3.0-1 [6864 B] Get: 142 http://deb.debian.org/debian bullseye/main amd64 ruby-sqlite3 amd64 1.4.2-3 [44.4 kB] Get: 143 http://deb.debian.org/debian bullseye/main amd64 ruby-timecop all 0.9.1-1 [10.2 kB] -Fetched 45.2 MB in 1s (87.4 MB/s) +Fetched 45.2 MB in 1s (54.0 MB/s) debconf: delaying package configuration, since apt-utils is not installed Selecting previously unselected package bsdextrautils. (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 ... 19707 files and directories currently installed.) @@ -950,7 +981,11 @@ Building tag database... -> Finished parsing the build-deps I: Building the package -I: Running cd /build/ruby-factory-bot-5.1.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_5.1.1-1_source.changes +I: user script /srv/workspace/pbuilder/1165299/tmp/hooks/A99_set_merged_usr starting +Not re-configuring usrmerge for bullseye +I: user script /srv/workspace/pbuilder/1165299/tmp/hooks/A99_set_merged_usr finished +hostname: Name or service not known +I: Running cd /build/ruby-factory-bot-5.1.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_5.1.1-1_source.changes dpkg-buildpackage: info: source package ruby-factory-bot dpkg-buildpackage: info: source version 5.1.1-1 dpkg-buildpackage: info: source distribution unstable @@ -1074,80 +1109,163 @@ RUBYLIB=/build/ruby-factory-bot-5.1.1/debian/ruby-factory-bot/usr/lib/ruby/vendor_ruby:. GEM_PATH=/build/ruby-factory-bot-5.1.1/debian/ruby-factory-bot/usr/share/rubygems-integration/all:/var/lib/gems/2.7.0:/usr/local/lib/ruby/gems/2.7.0:/usr/lib/ruby/gems/2.7.0:/usr/lib/x86_64-linux-gnu/ruby/gems/2.7.0:/usr/share/rubygems-integration/2.7.0:/usr/share/rubygems-integration/all:/usr/lib/x86_64-linux-gnu/rubygems-integration/2.7.0 ruby2.7 -S rake -f debian/ruby-tests.rake /usr/bin/ruby2.7 -I/usr/share/rubygems-integration/all/gems/rspec-support-3.9.3/lib:/usr/share/rubygems-integration/all/gems/rspec-core-3.9.2/lib /usr/share/rubygems-integration/all/gems/rspec-core-3.9.2/exe/rspec --pattern spec/\{\*_spec.rb,factory_bot/\*\*/\*_spec.rb\} --format documentation -Randomized with seed 18323 +Randomized with seed 62884 -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 - 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: #update - 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: #decrement! - 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 - overriding persistence method: #update_column - 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: #delete - 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: #update_attributes - raises an informative error if the method is called - overrides the method with any arity - overriding persistence method: #reload - overrides the method with any arity - raises an informative error if the method is called - overriding persistence method: #increment! - 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: #destroy - raises an informative error if the method is called - overrides the method with any arity - overriding persistence method: #touch - raises an informative error if the method is called - overrides the method with any arity - overriding persistence method: #update_columns - raises an informative error if the method is called - overrides the method with any arity - overriding persistence method: #connection - overrides the method with any arity - raises an informative error if the method is called - overriding persistence method: #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 - 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 when defined with a custom class name + build_class + is expected to eq ArgumentError -FactoryBot::DefinitionProxy#add_attribute - declares a dynamic attribute on the factory +FactoryBot::AttributeList#apply_attributes + adds attributes in the order defined + +FactoryBot::StrategyCalculator + when a symbol + returns the strategy found + finds the strategy by name + when a class + returns the class passed + +FactoryBot aliases + aliases for an attribute starting with an underscore + is expected not to include :id + aliases for an attribute + is expected to include :test_id + is expected to include :test + aliases for a foreign key + is expected to include :test + is expected to include :test_id + +FactoryBot::Attribute::Dynamic with a string name + name + is expected to eq :name + +FactoryBot::AttributeList filter based on ignored attributes + filters #ignored attributes + filters #non_ignored attributes + +FactoryBot::Definition + is expected to delegate :declare_attribute + #overridable + sets the declaration list as overridable + #to_create + returns the assigned value when given a block + to_create + is expected to be nil + adding callbacks + maintains a list of callbacks + #name + returns the name + defining traits + adds only unique traits + maintains a list of traits + with a name + creates a new attribute list with the name passed + +FactoryBot::Declaration::Dynamic + #== + 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 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 + the objects are NOT equal + +FactoryBot::Registry + finds a registered object with square brackets + adds and returns the object registered + finds a registered object + raises when an object cannot be found + knows when an object is not registered + knows that an object is registered by string + clears registered factories + knows that an object is registered by symbol + does not include duplicate objects with registered under different names + is expected to be a kind of Enumerable + iterates registered objects + +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::Attribute::Association with a string name + name + is expected to eq :name + +FactoryBot::Attribute::Association + is expected to be association + builds the association when calling the proc + builds the association when calling the proc + name + is expected to eq :author + +FactoryBot::Factory with a string for a name + name + is expected to eq :string + +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::Internal + .register_strategy + register the provided strategy name with the class + .register_trait + registers the provided trait + returns the registered trait + .trait_by_name + finds a previously registered trait + .register_factory + registers the provided factory + returns the registered factory + .register_factory + registers the provided factory + returns the registered factory + .register_sequence + returns the registered sequence + registers the provided sequence + .rewind_sequences + rewinds the sequences and the internal sequences + .sequence_by_name + finds a registered sequence + default strategies and callbacks + registers the build_stubbed strategy by default + registers the after_create by default + registers the attributes_for strategy by default + registers the null strategy by default + registers the create strategy by default + registers the build strategy by default + registers the after_stub by default + registers the after_create by default + registers the after_build by default + .strategy_by_name + finds a registered strategy + .factory_by_name + finds a registered factory + .factory_by_name + finds a registered factory + +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 referencing an attribute on the attribute + evaluates the attribute from the attribute + with a block returning a sequence + raises a sequence abuse error + with a block returning its block-level variable + returns self when executing the proc + +FactoryBot::DefinitionProxy#association + declares an association with options + declares an association + when passing a block + raises an error FactoryBot::Decorator::AttributeHash #attributes @@ -1155,6 +1273,107 @@ with an attribute called 'attributes' does not call itself recursively +FactoryBot::Factory + has a build class + guesses the build class from the factory name + has a factory name + creates a new factory while overriding the parent class + returns associations + includes associations from the parent factory + creates a new factory using the class of the parent + 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::Factory when defined with a class instead of a name + build_class + is expected to eq ArgumentError + name + is expected to eq :argument_error + +FactoryBot::DefinitionProxy#add_attribute + declares a dynamic attribute on the factory + +FactoryBot::Factory when given a class that overrides #to_s + sets build_class correctly + +FactoryBot::DefinitionProxy#initialize_with + defines the constructor on the definition + +FactoryBot::Declaration::Implicit + with a known factory + creates an association attribute + has the correct factory name + with a known sequence + creates a sequence attribute + does not create an assocition attribute + #== + when one is ignored and the other isn't + the objects are NOT equal + when the attributes are equal + the objects are equal + when the factories are different + the objects are NOT equal + when the names are different + the objects are NOT equal + when comparing against another type of object + the objects are NOT equal + +FactoryBot::DefinitionProxy#method_missing + when called with a static-attribute-like argument + raises a NoMethodError + when called without args or a block + declares an implicit declaration + when called with a block + declares a dynamic attribute + when called with a ':factory' key + declares an association + +FactoryBot::AttributeList generating names + knows all its #names for #associations + knows all its #names + knows all its #names for #non_ignored attributes + knows all its #names for #ignored attributes + +FactoryBot::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 + build_class + is expected to eq Float + +FactoryBot::NullObject + responds to the given methods + does not respond to other methods + +FactoryBot::EvaluatorClassDefiner + sets attributes on the evaluator class + evaluates the block in the context of the evaluator + returns an evaluator when accessing the evaluator class + only instance_execs the block once even when returning nil + 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 + finds a registered sequence + finds a registered strategy + finds a registered factory + finds a registered trait + .use_parent_strategy + is true by default + +FactoryBot::DefinitionProxy#sequence + creates a new sequence with a block + creates a new sequence with an overridden starting vaue + creates a new sequence starting at 1 + FactoryBot::NullFactory is expected to delegate :attributes is expected to delegate :constructor @@ -1169,61 +1388,49 @@ attributes is expected to be an instance of FactoryBot::AttributeList +FactoryBot::AttributeList#define_attribute + maintains a list of attributes + returns the attribute + raises if an attribute has already been defined + +FactoryBot::Decorator::DisallowsDuplicatesRegistry + delegates #register to the registry when not registered + raises when attempting to #register a previously registered strategy + +FactoryBot::Attribute + is expected not to be association + name + is expected to eq :user + FactoryBot::Sequence - a custom sequence - behaves like a sequence - next - is expected to eq "=A" - when incrementing - next - is expected to eq "=B" - after rewinding - next - is expected to eq "=A" - a basic sequence without a block - behaves like a sequence - when incrementing - next - is expected to eq 2 - next - is expected to eq 1 - after rewinding - next - is expected to eq 1 - a sequence with custom value and aliases - behaves like a sequence - when incrementing - next - is expected to eq "=4" - next - is expected to eq "=3" - after rewinding - next - is expected to eq "=3" - names - is expected to eq [:test, :alias, :other] a sequence with aliases using default value names is expected to eq [:test, :alias, :other] behaves like a sequence + when incrementing + next + is expected to eq "=2" after rewinding next is expected to eq "=1" next is expected to eq "=1" - when incrementing - next - is expected to eq "=2" - a custom sequence without a block + a basic sequence without a block behaves like a sequence - when incrementing - next - is expected to eq "B" after rewinding next - is expected to eq "A" + is expected to eq 1 + when incrementing + next + is expected to eq 2 next - is expected to eq "A" + is expected to eq 1 + a custom sequence and scope + increments within the correct scope + after rewinding + increments within the correct scope + when incrementing + increments within the correct scope iterating over items in an enumerator navigates to the next items until no items remain behaves like a sequence @@ -1243,577 +1450,458 @@ behaves like a sequence next is expected to eq "=1" + when incrementing + next + is expected to eq "=2" after rewinding next is expected to eq "=1" + a custom sequence without a block + behaves like a sequence + next + is expected to eq "A" + after rewinding + next + is expected to eq "A" when incrementing next - is expected to eq "=2" - a custom sequence and scope - increments within the correct scope - after rewinding - increments within the correct scope - when incrementing - increments within the correct scope - -FactoryBot::DefinitionProxy#to_create - accepts a block to run in place of #save! - -FactoryBot::Declaration::Dynamic - #== - when one is ignored and the other isn't - 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 blocks are different - the objects are NOT equal - when the names are different - the objects are NOT equal - -FactoryBot::StrategyCalculator - when a symbol - finds the strategy by name - returns the strategy found - when a class - returns the class passed + is expected to eq "B" + a sequence with custom value and aliases + names + is expected to eq [:test, :alias, :other] + behaves like a sequence + when incrementing + next + is expected to eq "=4" + after rewinding + next + is expected to eq "=3" + next + is expected to eq "=3" + a custom sequence + behaves like a sequence + next + is expected to eq "=A" + when incrementing + next + is expected to eq "=B" + after rewinding + next + is expected to eq "=A" -FactoryBot::Declaration::Implicit - with a known factory - creates an association attribute - has the correct factory name - with a known sequence - does not create an assocition 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 names are different - the objects are NOT equal - when the attributes are equal - the objects are equal - when one is ignored and the other isn't - the objects are NOT equal +FactoryBot::DefinitionProxy#factory + with a block + without options + with options -FactoryBot::AttributeList filter based on ignored attributes - filters #non_ignored attributes - filters #ignored attributes +FactoryBot::DefinitionProxy adding callbacks + #before(:stub, :create) + is expected to have callback :before_stub + is expected to have callback :before_create + #after(:create) + is expected to have callback :after_create + #after(:build) + is expected to have callback :after_build + #after(:stub) + is expected to have callback :after_stub + #callback(:after_stub, :before_create) + is expected to have callback :before_create + is expected to have callback :after_stub + #after(:stub, :create) + is expected to have callback :after_stub + is expected to have callback :after_create 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 + returns the object from the evaluation it should behave like strategy with association support runs the factory with the correct overrides finds the factory with the correct factory name -FactoryBot::AttributeList generating names - knows all its #names - knows all its #names for #associations - knows all its #names for #non_ignored attributes - knows all its #names for #ignored attributes - -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::Factory - creates a new factory while overriding the parent class - has a build class - returns associations - guesses the build class from the factory name - has a factory name - creates a new factory using the class of the parent - 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 - discards the predefined value for the attribute - uses the passed in value for the alias +FactoryBot::Factory with a name ending in s + build_class + is expected to eq Business + name + is expected to eq :business -FactoryBot::Registry - adds and returns the object registered - does not include duplicate objects with registered under different names - clears registered factories - knows when an object is not registered - is expected to be a kind of Enumerable - iterates registered objects - finds a registered object - knows that an object is registered by symbol - finds a registered object with square brackets - knows that an object is registered by string - raises when an object cannot be found +FactoryBot::Callback + runs its block with one parameter + allows valid callback names to be assigned + runs its block with no parameters + converts strings to symbols + runs its block with two parameters + has a name + raises if an invalid callback name is assigned -FactoryBot::NullObject - responds to the given methods - does not respond to other methods +FactoryBot::DefinitionProxy#transient + makes all attributes added ignored -FactoryBot::Strategy::Build +FactoryBot::Strategy::Stub 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 to be persisted + is expected not to be destroyed + assigns created_at + overriding persistence method: #reload + 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: #destroy! + overrides the method with any arity + raises an informative error if the method is called + overriding persistence method: #toggle! + raises an informative error if the method is called + overrides the method with any arity + overriding persistence method: #update_attributes + raises an informative error if the method is called + overrides the method with any arity + overriding persistence method: #touch + raises an informative error if the method is called + overrides the method with any arity + overriding persistence method: #update_attribute + 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: #update_columns + 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: #update_column + 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: #destroy + 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: #decrement! + 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: #increment! + 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 it should behave like strategy with callbacks returns the object from the evaluation - runs the callbacks [:after_build] with the evaluation's object + runs the callbacks [:after_stub] with the evaluation's object it should behave like strategy with strategy: :build - finds the factory with the correct factory name runs the factory with the correct overrides + finds the factory with the correct factory name -FactoryBot aliases - aliases for an attribute starting with an underscore - is expected not to include :id - aliases for an attribute - is expected to include :test - is expected to include :test_id - aliases for a foreign key - is expected to include :test - is expected to include :test_id +FactoryBot::Factory for namespaced class + with a namespaced class with Namespace::Class syntax + sets build_class correctly + with a namespaced class with namespace/class syntax + sets build_class correctly -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::DefinitionProxy#to_create + accepts a block to run in place of #save! -FactoryBot::EvaluatorClassDefiner - sets attributes on the evaluator class - only instance_execs the block once even when returning nil - returns an evaluator when accessing the evaluator class - 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 after defining an alias + is expected to include :test_suffix_id + is expected to include :test -FactoryBot::DefinitionProxy#association - declares an association - declares an association with options - when passing a block - raises an error +FactoryBot::DefinitionProxy#trait + declares a trait -FactoryBot::Factory when defined with a class instead of a name - name - is expected to eq :argument_error - build_class - is expected to eq ArgumentError +FactoryBot::Declaration::Association + #== + when the attributes are equal + the objects are equal + when the names are different + the objects are NOT equal + when the options are different + the objects are NOT equal + when comparing against another type of object + the objects are NOT equal FactoryBot::AttributeList#associations returns associations +FactoryBot::DefinitionProxy#add_attribute when the proxy ignores attributes + declares a dynamic attribute on the factory + +FactoryBot::DeclarationList#declare_attribute + when not overridable + adds the declaration to the list + when overridable + adds the declaration to the list + deletes declarations with the same name + +FactoryBot::Factory human names + factory name with aliases + human_names + is expected to eq ["happy user", "gleeful user", "person"] + names + is expected to eq [:happy_user, :gleeful_user, :person] + factory name with underscores + names + is expected to eq [:happy_user] + human_names + is expected to eq ["happy user"] + factory name without underscores + human_names + is expected to eq ["user"] + names + is expected to eq [:user] + factory name with big letters + names + is expected to eq [:LoL] + human_names + is expected to eq ["lol"] + +FactoryBot::Strategy::Build + 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 strategy: :build + 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 + +FactoryBot::Attribute::Sequence + assigns the next value in the sequence + name + is expected to eq :first_name + definition loading - with a factories file under test + with nested and unnested factories files under test it should behave like finds definitions is expected to load definitions from test/factories.rb - with a factories file under spec/factories + is expected to load definitions from test/factories/person_factory.rb + is expected to load definitions from test/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/post_factory.rb + 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 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 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 spec/factories + it should behave like finds definitions + is expected to load definitions from spec/factories/post_factory.rb + with several factories files under spec/factories + it should behave like finds definitions + is expected to load definitions from spec/factories/post_factory.rb + is expected to load definitions from spec/factories/person_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 - 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 factories.rb it should behave like finds definitions is expected to load definitions from factories.rb - with deeply nested factory files under spec - it should behave like finds definitions - is expected to load definitions from spec/factories/subdirectory/post_factory.rb - is expected to load definitions from spec/factories/subdirectory/person_factory.rb - with several factories files under spec/factories - it should behave like finds definitions - is expected to load definitions from spec/factories/post_factory.rb - is expected to load definitions from spec/factories/person_factory.rb - with several factories files under test/factories in non-alphabetical order - loads the files in the right order - with nested and unnested factories files under test + with a factories file under spec 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 several factories files under spec/factories in non-alphabetical order - loads the files in the right order + is expected to load definitions from spec/factories.rb with deeply nested factory files under test it should behave like finds definitions is expected to load definitions from test/factories/subdirectory/person_factory.rb is expected to load definitions from test/factories/subdirectory/post_factory.rb - with a factories file under spec - it should behave like finds definitions - is expected to load definitions from spec/factories.rb - -FactoryBot::Callback - runs its block with two parameters - raises if an invalid callback name is assigned - runs its block with one parameter - converts strings to symbols - runs its block with no parameters - has a name - allows valid callback names to be assigned - -FactoryBot::DefinitionProxy#method_missing - when called with a static-attribute-like argument - raises a NoMethodError - when called with a ':factory' key - declares an association - when called without args or a block - declares an implicit declaration - when called with a block - declares a dynamic attribute - -FactoryBot::Internal - .strategy_by_name - finds a registered strategy - .rewind_sequences - rewinds the sequences and the internal sequences - .register_sequence - returns the registered sequence - registers the provided 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 - .register_trait - registers the provided trait - returns the registered trait - .register_strategy - register the provided strategy name with the class - default strategies and callbacks - registers the null strategy by default - registers the after_stub by default - registers the build_stubbed strategy by default - registers the after_create by default - registers the create strategy by default - registers the after_create by default - registers the after_build by default - registers the attributes_for strategy by default - registers the build strategy by default - .sequence_by_name - finds a registered sequence - .factory_by_name - finds a registered factory - .factory_by_name - finds a registered factory - -FactoryBot::Factory when defined with a custom class - build_class - is expected to eq Float - -FactoryBot::DefinitionProxy#initialize_with - defines the constructor on the definition - -FactoryBot::Factory human names - factory name with underscores - names - is expected to eq [:happy_user] - human_names - is expected to eq ["happy user"] - factory name with aliases - names - is expected to eq [:happy_user, :gleeful_user, :person] - human_names - is expected to eq ["happy user", "gleeful user", "person"] - factory name with big letters - names - is expected to eq [:LoL] - human_names - is expected to eq ["lol"] - factory name without underscores - names - is expected to eq [:user] - human_names - is expected to eq ["user"] - -FactoryBot after defining an alias - is expected to include :test_suffix_id - is expected to include :test - -FactoryBot::DefinitionProxy#factory - without options - with options - with a block - -FactoryBot::AttributeList#apply_attributes - adds attributes in the order defined - -FactoryBot::DeclarationList#declare_attribute - when overridable - deletes declarations with the same name - adds the declaration to the list - when not overridable - adds the declaration to the list - -FactoryBot - finds a registered factory - finds a registered sequence - finds a registered strategy - finds a registered trait - .use_parent_strategy - is true by default - -FactoryBot::Factory with a string for a name - name - is expected to eq :string - -FactoryBot::Factory when defined with a custom class name - build_class - is expected to eq ArgumentError - -FactoryBot::Factory when given a class that overrides #to_s - sets build_class correctly - -FactoryBot::Attribute::Dynamic - name - is expected to eq :first_name - with a block referencing an attribute on the attribute - evaluates the attribute from the attribute - 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 returning its block-level variable - returns self when executing the proc - -FactoryBot::Attribute::Sequence - assigns the next value in the sequence - name - is expected to eq :first_name - -FactoryBot::Attribute - is expected not to be association - name - is expected to eq :user + with several factories files under test/factories in non-alphabetical order + loads the files in the right order -FactoryBot::DefinitionProxy#transient - makes all attributes added ignored +FactoryBot::DeclarationList#attributes + defines each attribute on the attribute list + returns an AttributeList -FactoryBot::AttributeList#define_attribute - maintains a list of attributes - returns the attribute - raises if an attribute has already been defined +Finished in 0.6326 seconds (files took 0.83169 seconds to load) +307 examples, 0 failures -FactoryBot::DefinitionProxy#sequence - creates a new sequence with an overridden starting vaue - creates a new sequence starting at 1 - creates a new sequence with a block +Randomized with seed 62884 -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 +/usr/bin/ruby2.7 -I/usr/share/rubygems-integration/all/gems/rspec-support-3.9.3/lib:/usr/share/rubygems-integration/all/gems/rspec-core-3.9.2/lib /usr/share/rubygems-integration/all/gems/rspec-core-3.9.2/exe/rspec --pattern spec/acceptance/\*\*/\*_spec.rb --format documentation -FactoryBot::Attribute::Association with a string name - name - is expected to eq :name +Randomized with seed 16514 -FactoryBot::Declaration::Association - #== - when the options are different - the objects are NOT equal - when the names are different - the objects are NOT equal - when the attributes are equal - the objects are equal - when comparing against another type of object - the objects are NOT equal +a stubbed instance overriding strategy + acts as if it is saved in the database + assigns associations and acts as if it is saved -FactoryBot::Attribute::Dynamic with a string name - name - is expected to eq :name +defaulting `id` + allows overriding id -FactoryBot::DeclarationList#attributes - defines each attribute on the attribute list - returns an AttributeList +declaring attributes on a Factory that are private methods on Object + sleep + is expected to eq -5 + link + is expected to eq "http://example.com" + system + is expected to eq false -FactoryBot::Decorator::DisallowsDuplicatesRegistry - raises when attempting to #register a previously registered strategy - delegates #register to the registry when not registered +`attributes_for` for a class whose constructor has required params + [:name] + is expected to eq "John Doe" -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 +traits with to_create + gives base traits lower priority than overrides + gives additional traits higher priority than to_create from the definition + gives base traits normal priority + gives additional traits higher priority than base traits and factory definition + can apply to_create from the definition + can apply to_create from traits -FactoryBot::Definition - is expected to delegate :declare_attribute - with a name - creates a new attribute list with the name passed - #overridable - sets the declaration list as overridable - #to_create - returns the assigned value when given a block - to_create - is expected to be nil - #name - returns the name - adding callbacks - maintains a list of callbacks - defining traits - adds only unique traits - maintains a list of traits +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 -FactoryBot::Factory with a name ending in s - build_class - is expected to eq Business - name - is expected to eq :business +defaulting `updated_at` + 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 + is doesn't mark the object as changed + doesn't allow setting updated_at on an object that doesn't define it + defaults updated_at for objects with updated_at -FactoryBot::DefinitionProxy adding callbacks - #before(:stub, :create) - is expected to have callback :before_create - is expected to have callback :before_stub - #after(:stub, :create) - is expected to have callback :after_stub - is expected to have callback :after_create - #after(:stub) - is expected to have callback :after_stub - #after(:build) - is expected to have callback :after_build - #callback(:after_stub, :before_create) - is expected to have callback :before_create - is expected to have callback :after_stub - #after(:create) - is expected to have callback :after_create +callbacks using Symbol#to_proc + runs the callback correctly -FactoryBot::DefinitionProxy#trait - declares a trait +register custom 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 + allows adding additional strategies -FactoryBot::DefinitionProxy#add_attribute when the proxy ignores attributes - declares a dynamic attribute on the factory +associations + when accidentally using an implicit delcaration for the factory + raises an error about the trait not being registered -FactoryBot::Factory for namespaced class - with a namespaced class with Namespace::Class syntax - sets build_class correctly - with a namespaced class with namespace/class syntax - sets build_class correctly +modifying inherited factories with traits + returns the correct value for overridden attributes from traits defining multiple attributes + allows modification of attributes created via traits + returns the correct value for overridden attributes from traits -Finished in 0.63619 seconds (files took 0.88246 seconds to load) -307 examples, 0 failures +a built instance + is expected to be new record + when the :use_parent_strategy config option is set to false + assigns and saves associations + when the :use_parent_strategy config option is set to true + assigns but does not save associations -Randomized with seed 18323 +initialize_with doesn't duplicate assignment on attributes accessed from initialize_with + instantiates the correct object -/usr/bin/ruby2.7 -I/usr/share/rubygems-integration/all/gems/rspec-support-3.9.3/lib:/usr/share/rubygems-integration/all/gems/rspec-core-3.9.2/lib /usr/share/rubygems-integration/all/gems/rspec-core-3.9.2/exe/rspec --pattern spec/acceptance/\*\*/\*_spec.rb --format documentation +when a self-referential trait is defined + raises a TraitDefinitionError + raises a TraitDefinitionError -Randomized with seed 59868 +an instance generated by a factory + registers the user factory -implicit traits containing callbacks - only runs the callback once +transient attributes + with a transient variable assigned + generates the correct attributes on a rockstar + generates the correct attributes on a groupie + generates the correct attributes on a rockstar with a name + generates the correct attributes on an upcased rockstar + without transient variables assigned + uses the default value of the attribute + returning attributes for a factory + is expected not to have key :four + is expected not to have key :rockstar + is expected not to have key :upcased + is expected to have key :name + is expected to have key :email -a built instance with strategy: :create - is expected to be new record - assigns and saves associations +reload + does not reset the value of use_parent_strategy create multiple instances without default attributes creates all the posts uses the default factory values length - is expected to eq 20 - with a block - uses the new values - with default attributes - overrides the default values - without the count - raise ArgumentError with the proper error message + is expected to eq 2 -setting private attributes - raises a NoMethodError +initialize_with for a constructor that requires a block + executes the block correctly + +initialize_with with FG attributes that are transient + name + is expected to eq "Handsome Chap from .construct" 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 + allows child factories to override initialize_with -a created instance - is expected not to be new record - assigns and saves associations - -global to_create - handles base to_create - uses to_create globally across FactoryBot.define - handles inline trait override - handles child to_create with trait - handles child to_create - -calling `build` with a block - returns the built instance - passes the built instance +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 -making sure the factory is properly compiled the first time we want to instantiate it - can honor traits on the very first call +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 -a generated stub instance - generates unique ids - disables decrement! - disables connection - disables toggle! - assigns a default attribute - allows toggle - assigns an overridden attribute - disables reload - disables increment! - assigns associations - allows decrement - assigns associations that aren't new records - allows increment - disables destroy - disables save - isn't a new record - disables update_attribute - isn't changed - has an id +associations overriding :strategy + uses the overridden create strategy to create the association -initialize_with for a constructor that requires a block - executes the block correctly +calling `attributes_for` with a block + returns the hash of attributes + passes the hash of attributes -assigning values from a transient attribute - does not ignore an _id attribute that is an alias for a transient attribute +global callbacks + triggers after build callbacks for all factories -including FactoryBot::Syntax::Methods when custom strategies have been declared - allows adding additional strategies +global skip_create + does not persist child records + honors overridden to_create + does not persist any record + honors inline trait to_create a created instance, specifying strategy: :build saves associations (strategy: :build only affects build, not create) -register custom strategies - allows adding additional strategies - allows overriding default 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 - -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 - looking up traits that don't exist raises a KeyError -calling `build_stubbed` with a block - passes the stub instance - returns the stub instance - -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 +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 aliases and overrides one @@ -1821,598 +1909,545 @@ two is expected to be nil -initialize_with doesn't duplicate assignment on attributes accessed from initialize_with - instantiates the correct object - -callbacks using Symbol#to_proc - runs the callback correctly +a custom create + uses the custom create block instead of save -sequences are evaluated in the correct context - invokes the correct method on the instance - builds a sequence calling sprintf correctly - invokes a method with no arguments on the instance - allows direct reference of a method in a sequence +an instance generated by a factory named a camel case string + registers the UserModel factory -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" +applying inline traits + applies traits only to the instance generated for that call -modifying factories - raises an exception if the factory was not defined before - allows for overriding child classes - doesn't overwrite already defined child's attributes - simple modification - doesn't allow the factory to be subsequently defined - does allow the factory to be subsequently modified - login - is expected to eq "GREAT USER" - name - is expected to eq "Great User" - reusing traits - login - is expected to eq "JOHNNY ROCKSTAR!!!" +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) + upper_email + is expected to eq "ADMIN@EXAMPLE.COM" email - is expected to eq "Johnny Rockstar!!!@example.com" + is expected to eq "admin@example.com" + login + is expected to eq "admin@example.com" name - is expected to eq "Johnny Rockstar!!!" - redefining attributes - creating admin - without overrides - name - is expected to eq "Great User" - email - is expected to eq "Great User-modified@example.com" - admin - is expected to equal true - overriding the email - email - is expected to eq "perfect@example.com" - admin - is expected to equal true - 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" - admin - is expected to equal true - creating user - overriding the email - name - is expected to eq "Great User" - email - is expected to eq "perfect@example.com" - without overrides - 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" - name - is expected to eq "wonderful" - adding callbacks + is expected to eq "admin" + the parent class + is expected not to be admin login - is expected to be nil + is expected to eq "john@example.com" name - is expected to eq "great user" + is expected to eq "John" + email + is expected to eq "john@example.com" + +build multiple instances + with a block + correctly uses the set value + without default attributes + uses the default factory values + builds (but doesn't save) all the posts + length + is expected to eq 20 + with default attributes + overrides the default values + +create multiple instances + with a block + uses the new values + without the count + raise ArgumentError with the proper error message + with default attributes + overrides the default values + without default attributes + creates all the posts + uses the default factory values + length + is expected to eq 20 FactoryBot.lint raises when a factory is invalid - allows for selective linting does not raise when all factories are valid + allows for selective linting factory strategy for linting - uses the requested strategy uses the requested strategy during trait validation - verbose linting - prints the backtrace for each factory error + uses the requested strategy 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 + does not raise if a trait produces a valid object + disabled + does not raises if a trait produces an invalid object + verbose linting + prints the backtrace for each factory error -initialize_with has access to all attributes for construction - 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 -initialize_with implicit constructor - instantiates the correct object +a custom create passing in an evaluator + passes the evaluator to the custom create block -`attributes_for` for a class whose constructor has required params - [:name] - is expected to eq "John Doe" +association assignment from nested attributes + assigns the correct amount of comments + assigns the correct amount of comments when overridden + +calling `build` with a block + returns the built instance + passes the built instance + +including FactoryBot::Syntax::Methods when custom strategies have been declared + allows adding additional strategies + +defaulting `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 + allows assignment of created_at + behaves the same as a non-stubbed created_at + +a generated stub instance + assigns associations + allows decrement + isn't changed + disables destroy + assigns an overridden attribute + has an id + allows increment + disables reload + disables save + disables connection + assigns a default attribute + disables update_attribute + disables decrement! + disables toggle! + disables increment! + generates unique ids + allows toggle + assigns associations that aren't new records + isn't a new record + +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 + +assigning values from a transient attribute + does not ignore an _id attribute that is an alias for a transient attribute inline traits overriding existing attributes - prefers inline trait attributes over default attributes 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 inline trait attributes over traits on a factory - prefers inline traits over attributes on factories - prefers traits on a factory over default attributes prefers attributes on factories over attributes from non-inline traits + prefers traits on a factory over default attributes + prefers inline traits over attributes on factories -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 - -when a self-referential trait is defined - raises a TraitDefinitionError - raises a TraitDefinitionError +finding factories keyed by class instead of symbol + doesn't find the factory -calling `attributes_for` with a block - returns the hash of attributes - passes the hash of attributes +transient sequences + increments sequences correctly -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 +binding a callback to multiple callbacks + binds the callback to creation + does not bind the callback to building + binds the callback to stubbing trait indifferent access - when trait is defined as a symbol - can be invoked with a symbol - can be invoked with a string when trait is defined as integer can be invoked with as integer can be invoked with a string when trait is defined as a string - can be invoked with a symbol can be invoked with a string + can be invoked with a symbol when trait is defined as struct can be invoked with a string can be invoked with a struct - -a stubbed instance overriding strategy - acts as if it is saved in the database - assigns associations and acts as if it is saved - -global skip_create - honors overridden to_create - honors inline trait to_create - does not persist child records - does not persist any record - -associations overriding :strategy - uses the overridden create strategy to create the association - -defining a child factory before a parent - creates admin factories correctly - -attribute overrides - with no user posting - secure - is expected to be nil - with a non-admin posting - secure - is expected to be nil - with an admin posting - secure - is expected to eq false - -global callbacks - triggers after build callbacks for all factories - -traits added via strategy - adding traits in build_list - builds all the records - length - is expected to eq 2 - adding traits in create - doesn't modify the user factory - 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 attributes_for - [:admin] - is expected to equal true - [:name] - is expected to eq "John" - adding traits in build - admin - is expected to equal true - name - is expected to eq "Joe" - adding traits in create_list - creates all the records - length - is expected to eq 2 - -association assignment from nested attributes - assigns the correct amount of comments - assigns the correct amount of comments when overridden + when trait is defined as a symbol + can be invoked with a string + can be invoked with a symbol syntax methods within dynamic attributes - can access methods already existing on the class 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 -a stubbed instance - assigns associations and acts as if it is saved - acts as if it came from the database - -global initialize_with - uses initialize_with globally across FactoryBot.define - handles base initialize_with - handles child initialize_with - handles inline trait override - handles child initialize_with with trait - -a custom create passing in an evaluator - passes the evaluator to the custom create block - FactoryBot.rewind_sequences - allows setting sequences within identically named traits resets all sequences back to their starting values - resets inline sequences back to their starting value does not collide with globally registered factories still allows global sequences prefixed with a factory name - -applying inline traits - applies traits only to the instance generated for that call - -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" - -finding factories keyed by class instead of symbol - doesn't find the factory - -calling `create` with a block - passes the created instance - returns the created instance - -a custom create - uses the custom create block instead of save - -callbacks using syntax methods without referencing FactoryBot explicitly - works when the callback has one variable - works when the callback has two variables - works when the callback has no variables - -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 - -using ActiveSupport::Instrumentation to track factory interaction - builds the correct payload - tracks proper time of creating the record - -skipping the default create - doesn't execute anything when creating the instance - -transient attributes - 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 not to have key :rockstar - is expected to have key :name - with a transient variable assigned - generates the correct attributes on an upcased rockstar - generates the correct attributes on a rockstar with a name - generates the correct attributes on a rockstar - generates the correct attributes on a groupie - without transient variables assigned - uses the default value of the attribute - -defaulting `created_at` - is doesn't mark the object as changed - doesn't add created_at to objects who don't have the method - allows assignment of created_at - doesn't allow setting created_at on an object that doesn't define it - defaults created_at for objects with created_at - behaves the same as a non-stubbed created_at - allows overriding created_at for objects with created_at - -defaulting `id` - allows overriding id + resets inline sequences back to their starting value + allows setting sequences within identically named traits multiple creates and transient attributes to dynamically build attribute lists generates the correct number of posts allows the number of posts to be modified -traits with to_create - gives additional traits higher priority than to_create from the definition - can apply to_create from traits - gives additional traits higher priority than base traits and factory definition - can apply to_create from the definition - gives base traits normal priority - gives base traits lower priority than overrides - -a stubbed instance with no primary key - behaves like a persisted record - builds a stubbed instance - -binding a callback to multiple callbacks - binds the callback to creation - binds the callback to stubbing - does not bind the callback to building - -an instance generated by a factory with a custom class name - is expected to be a kind of User(id: integer, admin: boolean) - is expected to be admin +initialize_with with non-FG attributes + age + is expected to eq 21 + name + is expected to eq "John Doe" -modifying inherited factories with traits - returns the correct value for overridden attributes from traits defining multiple attributes - allows modification of attributes created via traits - returns the correct value for overridden attributes from traits +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" an instance generated by a factory with multiple traits - 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 other child class with one trait - is expected not to be admin - name - is expected to eq "Jane" - gender - is expected to eq "Female" - the parent class - is expected not to be admin - gender - is expected to be nil - name - is expected to eq "John" - the child with multiple traits + factory outside of scope + raises an error + the child with multiple traits and overridden attributes is expected to be admin gender - is expected to eq "Female" - name - is expected to eq "Jane" - factory using global trait - email - is expected to eq "Bill@example.com" + is expected to be nil name - is expected to eq "Bill" + is expected to eq "Jill" the child class with one trait is expected to be admin name is expected to eq "John" gender is expected to be nil + child factory using grandparents' trait + great + is expected to eq "GREAT!!!" + factory created with alternate syntax for specifying trait + where trait name and attribute are the same and attribute is overridden + great + is expected to eq "SORT OF!!!" + where trait name and attribute are the same + great + is expected to eq "GREAT!!!" + gender + is expected to eq "Male" the child with multiple traits who override the same attribute + when the female assigns name after male + is expected to be admin + name + is expected to eq "Jane" + gender + is expected to eq "Female" when the male assigns name after female is expected to be admin name is expected to eq "Joe" gender is expected to eq "Male" - when the female assigns name after male - is expected 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 + factory using global trait + email + is expected to eq "Bill@example.com" name - is expected to eq "Jill" + is expected to eq "Bill" + the parent class + is expected not to be admin gender is expected to be nil + name + is expected to eq "John" + 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" child class with scoped trait and inherited trait is expected to be admin - name - is expected to eq "Judy" gender is expected to eq "Female" - factory created with alternate syntax for specifying trait - where trait name and attribute are the same - great - is expected to eq "GREAT!!!" - where trait name and attribute are the same and attribute is overridden - great - is expected to eq "SORT OF!!!" + name + is expected to eq "Judy" + child factory created where trait attributes are inherited gender is expected to eq "Male" - factory outside of scope - raises an error + date_of_birth + is expected to eq Sat, 01 Jan 2000 + the child with multiple traits + is expected to be admin + name + is expected to eq "Jane" + gender + is expected to eq "Female" factory with trait defined multiple times + great + is expected to eq "GREAT!!!" child factory redefining trait great is expected to eq "EVEN GREATER!!!" - great - is expected to eq "GREAT!!!" - child factory using grandparents' trait - great - is expected to eq "GREAT!!!" - -assigning overrides that are also private methods on object - some_funky_method - is expected to eq "foobar!" - y - is expected to eq 12345 - format - is expected to eq "Great" - more_format - is expected to eq "format: Great" -initialize_with with non-FG attributes - age - is expected to eq 21 - name - is expected to eq "John Doe" +defining a child factory before a parent + creates admin factories 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" - 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) - login - is expected to eq "admin@example.com" - name - is expected to eq "admin" - email - is expected to eq "admin@example.com" - upper_email - is expected to eq "ADMIN@EXAMPLE.COM" +defining methods inside FactoryBot + raises with a meaningful message -defaulting `updated_at` - doesn't add updated_at to objects who don't have the method - defaults updated_at for objects with updated_at - allows assignment of updated_at - behaves the same as a non-stubbed 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 +a created instance + is expected not to be new record + assigns and saves associations -an instance generated by a factory named a camel case string - registers the UserModel factory +skipping the default create + doesn't execute anything when creating the instance -reload - does not reset the value of use_parent_strategy +global to_create + handles child to_create + handles inline trait override + handles base to_create + uses to_create globally across FactoryBot.define + handles child to_create with trait -initialize_with non-ORM-backed objects - allows for overrides - generates random data +global initialize_with + handles child initialize_with + handles inline trait override + handles base initialize_with + uses initialize_with globally across FactoryBot.define + handles child initialize_with with trait -initialize_with with FG attributes that are transient - name - is expected to eq "Handsome Chap from .construct" +initialize_with has access to all attributes for construction + assigns attributes correctly -an instance generated by a factory - registers the user factory +modifying factories + allows for overriding child classes + doesn't overwrite already defined child's attributes + raises an exception if the factory was not defined before + 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 + 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" + redefining attributes + 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 + email + is expected to eq "Great User-modified@example.com" + name + is expected to eq "Great User" + creating admin + overriding the name + email + is expected to eq "wonderful-modified@example.com" + admin + is expected to equal true + name + is expected to eq "wonderful" + overriding the email + admin + is expected to equal true + 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" + admin + is expected to equal true + adding callbacks + login + is expected to be nil + name + is expected to eq "great user" -a generated attributes hash - assigns a default value - doesn't assign associations - assigns an overridden value - assigns a lazy, dependent attribute +calling `create` with a block + passes the created instance + returns the created instance -custom callbacks - runs a custom callback without prepending before or after when the proper strategy executes - runs a custom after callback when the proper strategy executes - runs a custom before callback when the proper strategy executes +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" -attributes defined using Symbol#to_proc - assigns values correctly - assigns value with override correctly - assigns overridden value correctly +implicit traits containing callbacks + only runs the callback once traits with initialize_with - gives additional traits higher priority than initialize_with from the definition - gives base traits normal priority - gives base traits lower priority than overrides can apply initialize_with from traits + gives base traits normal priority gives additional traits higher priority than base traits and factory definition + 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 -nested factories with different parents - honors :parent over the factory block nesting - -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 both the after(:stub) callback on the factory and the inherited after(:stub) callback - runs the after(:build) callback when building - -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 " +sequences are evaluated in the correct context + invokes a method with no arguments on the instance + allows direct reference of a method in a sequence + builds a sequence calling sprintf correctly + invokes the correct method on the instance -build multiple instances - with a block - correctly uses the set value - without default attributes - builds (but doesn't save) all the posts - uses the default factory values - length - is expected to eq 20 - with default attributes - overrides the default values +a stubbed instance with no primary key + builds a stubbed instance + behaves like a persisted record -transient sequences - increments sequences correctly +making sure the factory is properly compiled the first time we want to instantiate it + can honor traits on the very first call -declaring attributes on a Factory that are private methods on Object - link - is expected to eq "http://example.com" - sleep - is expected to eq -5 - system - is expected to eq false +initialize_with implicit constructor + instantiates the correct object calling methods on the model instance - with the attribute being overridden + 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 referenced attribute being overridden - uses the overridden value during attributes_for + returns nil during attributes_for + with the attribute being overridden uses the overridden value + uses the overridden value during attributes_for -create multiple instances - without default attributes - creates all the posts - uses the default factory values +a generated attributes hash + doesn't assign associations + assigns a default value + assigns an overridden value + assigns a lazy, dependent attribute + +traits added via strategy + adding traits in build_list + builds all the records length is expected to eq 2 + adding traits in attributes_for + [:admin] + is expected to equal true + [:name] + is expected to eq "John" + 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 create_list + creates all the records + length + is expected to eq 2 + adding traits in build + admin + is expected to equal true + name + is expected to eq "Joe" + adding traits in build_stubbed + admin + is expected to equal true + name + is expected to eq "Jack" -associations - when accidentally using an implicit delcaration for the factory - raises an error about the trait not being registered +a stubbed instance + acts as if it came from the database + assigns associations and acts as if it is saved -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 +callbacks + runs both the after(:build) and after(:create) callbacks when creating + runs both the after(:stub) callback on the factory and the inherited after(:stub) callback + runs the after(:build) callback when building + runs the after(:stub) callback when stubbing + runs child callback after parent callback sequences - generates aliases for the sequence that reference the same block and retains value - generates sequential numbers if no block is given generates several values in the correct format - generates few values of the sequence + generates aliases for the sequence that reference the same block and retains value generates aliases for the sequence that reference the same block + generates few values of the sequence + generates sequential numbers if no block is given + +setting private attributes + raises a NoMethodError + +using ActiveSupport::Instrumentation to track factory interaction + builds the correct payload + tracks proper time of creating the 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 + +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 factories with different parents + honors :parent over the factory block nesting + +initialize_with non-ORM-backed objects + generates random data + allows for overrides + +traits used in associations + allows assigning traits for the factory of an association + allows inline traits with the default association + allows inline traits with a specific factory for an association + +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 initialize_with with an 'attributes' attribute assigns attributes correctly -defining methods inside FactoryBot - raises with a meaningful message +calling `build_stubbed` with a block + returns the stub instance + passes the stub instance + +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 + +a built instance with strategy: :create + assigns and saves associations + is expected to be new record + +attributes defined using Symbol#to_proc + assigns values correctly + assigns value with override correctly + assigns overridden value correctly -Finished in 4.01 seconds (files took 0.77048 seconds to load) +Finished in 4.22 seconds (files took 0.88642 seconds to load) 343 examples, 0 failures -Randomized with seed 59868 +Randomized with seed 16514 ┌──────────────────────────────────────────────────────────────────────────────┐ @@ -2472,12 +2507,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/1165299/tmp/hooks/B01_cleanup starting +I: user script /srv/workspace/pbuilder/1165299/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/4185135 and its subdirectories -I: Current time: Sat Sep 7 18:59:19 -12 2024 -I: pbuilder-time-stamp: 1725778759 +I: removing directory /srv/workspace/pbuilder/1165299 and its subdirectories +I: Current time: Mon Aug 7 14:37:04 +14 2023 +I: pbuilder-time-stamp: 1691368624