Diff of the two buildlogs: -- --- b1/build.log 2021-07-08 19:16:56.870913954 +0000 +++ b2/build.log 2021-07-08 19:18:09.804169785 +0000 @@ -1,6 +1,6 @@ I: pbuilder: network access will be disabled during build -I: Current time: Thu Jul 8 07:15:52 -12 2021 -I: pbuilder-time-stamp: 1625771752 +I: Current time: Thu Aug 11 15:39:59 +14 2022 +I: pbuilder-time-stamp: 1660181999 I: Building the build Environment I: extracting base tarball [/var/cache/pbuilder/bullseye-reproducible-base.tgz] I: copying local configuration @@ -16,8 +16,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.VhzUVL6c/trustedkeys.kbx': General error -gpgv: Signature made Mon Feb 3 03:39:04 2020 -12 +gpgv: keyblock resource '/tmp/dpkg-verify-sig.T2k6180t/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 @@ -29,135 +29,169 @@ 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/11797/tmp/hooks/D02_print_environment starting +I: user script /srv/workspace/pbuilder/23607/tmp/hooks/D01_modify_environment starting +debug: Running on codethink13-arm64. +I: Changing host+domainname to test build reproducibility +I: Adding a custom variable just for the fun of it... +I: Changing /bin/sh to bash +Removing 'diversion of /bin/sh to /bin/sh.distrib by dash' +Adding 'diversion of /bin/sh to /bin/sh.distrib by bash' +Removing 'diversion of /usr/share/man/man1/sh.1.gz to /usr/share/man/man1/sh.distrib.1.gz by dash' +Adding 'diversion of /usr/share/man/man1/sh.1.gz to /usr/share/man/man1/sh.distrib.1.gz by 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/23607/tmp/hooks/D01_modify_environment finished +I: user script /srv/workspace/pbuilder/23607/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='arm64' - DEBIAN_FRONTEND='noninteractive' + 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]="aarch64-unknown-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=arm64 + DEBIAN_FRONTEND=noninteractive DEB_BUILD_OPTIONS='buildinfo=+all reproducible=+all,-fixfilepath parallel=8' - DISTRIBUTION='' - HOME='/var/lib/jenkins' - HOST_ARCH='arm64' + DIRSTACK=() + DISTRIBUTION= + EUID=0 + FUNCNAME=([0]="Echo" [1]="main") + GROUPS=() + HOME=/var/lib/jenkins + HOSTNAME=i-capture-the-hostname + HOSTTYPE=aarch64 + HOST_ARCH=arm64 IFS=' ' - 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='11797' - PS1='# ' - PS2='> ' + LANG=C + LANGUAGE=nl_BE:nl + LC_ALL=C + MACHTYPE=aarch64-unknown-linux-gnu + MAIL=/var/mail/root + OPTERR=1 + OPTIND=1 + OSTYPE=linux-gnu + PATH=/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/i/capture/the/path + PBCURRENTCOMMANDLINEOPERATION=build + PBUILDER_OPERATION=build + PBUILDER_PKGDATADIR=/usr/share/pbuilder + PBUILDER_PKGLIBDIR=/usr/lib/pbuilder + PBUILDER_SYSCONFDIR=/etc + PIPESTATUS=([0]="0") + POSIXLY_CORRECT=y + PPID=23607 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/tmp.GM9reMwlAi/pbuilderrc_YvCe --hookdir /etc/pbuilder/first-build-hooks --debbuildopts -b --basetgz /var/cache/pbuilder/bullseye-reproducible-base.tgz --buildresult /srv/reproducible-results/rbuild-debian/tmp.GM9reMwlAi/b1 --logfile b1/build.log ruby-factory-bot_5.1.1-1.dsc' - SUDO_GID='117' - SUDO_UID='110' - SUDO_USER='jenkins' - TERM='unknown' - TZ='/usr/share/zoneinfo/Etc/GMT+12' - USER='root' - USERNAME='root' - _='/usr/bin/systemd-run' - http_proxy='http://192.168.101.16: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/tmp.GM9reMwlAi/pbuilderrc_CA2N --hookdir /etc/pbuilder/rebuild-hooks --debbuildopts -b --basetgz /var/cache/pbuilder/bullseye-reproducible-base.tgz --buildresult /srv/reproducible-results/rbuild-debian/tmp.GM9reMwlAi/b2 --logfile b2/build.log --extrapackages usrmerge ruby-factory-bot_5.1.1-1.dsc' + SUDO_GID=117 + SUDO_UID=110 + SUDO_USER=jenkins + TERM=unknown + TZ=/usr/share/zoneinfo/Etc/GMT-14 + UID=0 + USER=root + USERNAME=root + _='I: set' + http_proxy=http://192.168.101.16:3128 I: uname -a - Linux codethink10-arm64 4.15.0-147-generic #151-Ubuntu SMP Fri Jun 18 19:18:37 UTC 2021 aarch64 GNU/Linux + Linux i-capture-the-hostname 4.15.0-147-generic #151-Ubuntu SMP Fri Jun 18 19:18:37 UTC 2021 aarch64 GNU/Linux I: ls -l /bin total 5252 - -rwxr-xr-x 1 root root 1282512 Jun 21 14:26 bash - -rwxr-xr-x 3 root root 34808 Jul 20 2020 bunzip2 - -rwxr-xr-x 3 root root 34808 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 34808 Jul 20 2020 bzip2 - -rwxr-xr-x 1 root root 14264 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 39832 Sep 22 2020 cat - -rwxr-xr-x 1 root root 64512 Sep 22 2020 chgrp - -rwxr-xr-x 1 root root 60368 Sep 22 2020 chmod - -rwxr-xr-x 1 root root 64528 Sep 22 2020 chown - -rwxr-xr-x 1 root root 138896 Sep 22 2020 cp - -rwxr-xr-x 1 root root 129544 Dec 10 2020 dash - -rwxr-xr-x 1 root root 101384 Sep 22 2020 date - -rwxr-xr-x 1 root root 80984 Sep 22 2020 dd - -rwxr-xr-x 1 root root 89824 Sep 22 2020 df - -rwxr-xr-x 1 root root 143088 Sep 22 2020 dir - -rwxr-xr-x 1 root root 76152 Feb 7 02:38 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 35632 Sep 22 2020 echo - -rwxr-xr-x 1 root root 28 Nov 9 2020 egrep - -rwxr-xr-x 1 root root 31512 Sep 22 2020 false - -rwxr-xr-x 1 root root 28 Nov 9 2020 fgrep - -rwxr-xr-x 1 root root 64856 Feb 7 02:38 findmnt - -rwsr-xr-x 1 root root 34824 Feb 26 04:12 fusermount - -rwxr-xr-x 1 root root 178400 Nov 9 2020 grep - -rwxr-xr-x 2 root root 2346 Mar 2 11:30 gunzip - -rwxr-xr-x 1 root root 6376 Mar 2 11:30 gzexe - -rwxr-xr-x 1 root root 93744 Mar 2 11:30 gzip - -rwxr-xr-x 1 root root 18440 Nov 6 2019 hostname - -rwxr-xr-x 1 root root 68720 Sep 22 2020 ln - -rwxr-xr-x 1 root root 52720 Feb 7 2020 login - -rwxr-xr-x 1 root root 143088 Sep 22 2020 ls - -rwxr-xr-x 1 root root 161960 Feb 7 02:38 lsblk - -rwxr-xr-x 1 root root 85200 Sep 22 2020 mkdir - -rwxr-xr-x 1 root root 68744 Sep 22 2020 mknod - -rwxr-xr-x 1 root root 43976 Sep 22 2020 mktemp - -rwxr-xr-x 1 root root 51368 Feb 7 02:38 more - -rwsr-xr-x 1 root root 51360 Feb 7 02:38 mount - -rwxr-xr-x 1 root root 14496 Feb 7 02:38 mountpoint - -rwxr-xr-x 1 root root 134808 Sep 22 2020 mv - lrwxrwxrwx 1 root root 8 Nov 6 2019 nisdomainname -> hostname - lrwxrwxrwx 1 root root 14 Apr 18 03:38 pidof -> /sbin/killall5 - -rwxr-xr-x 1 root root 35720 Sep 22 2020 pwd - lrwxrwxrwx 1 root root 4 Jun 21 14:26 rbash -> bash - -rwxr-xr-x 1 root root 43872 Sep 22 2020 readlink - -rwxr-xr-x 1 root root 68592 Sep 22 2020 rm - -rwxr-xr-x 1 root root 43880 Sep 22 2020 rmdir - -rwxr-xr-x 1 root root 19208 Sep 27 2020 run-parts - -rwxr-xr-x 1 root root 114016 Dec 22 2018 sed - lrwxrwxrwx 1 root root 4 Jul 6 21:24 sh -> dash - -rwxr-xr-x 1 root root 35656 Sep 22 2020 sleep - -rwxr-xr-x 1 root root 72640 Sep 22 2020 stty - -rwsr-xr-x 1 root root 67776 Feb 7 02:38 su - -rwxr-xr-x 1 root root 35672 Sep 22 2020 sync - -rwxr-xr-x 1 root root 535768 Feb 16 21:55 tar - -rwxr-xr-x 1 root root 10568 Sep 27 2020 tempfile - -rwxr-xr-x 1 root root 89120 Sep 22 2020 touch - -rwxr-xr-x 1 root root 31512 Sep 22 2020 true - -rwxr-xr-x 1 root root 14264 Feb 26 04:12 ulockmgr_server - -rwsr-xr-x 1 root root 30880 Feb 7 02:38 umount - -rwxr-xr-x 1 root root 35640 Sep 22 2020 uname - -rwxr-xr-x 2 root root 2346 Mar 2 11:30 uncompress - -rwxr-xr-x 1 root root 143088 Sep 22 2020 vdir - -rwxr-xr-x 1 root root 59584 Feb 7 02:38 wdctl - lrwxrwxrwx 1 root root 8 Nov 6 2019 ypdomainname -> hostname - -rwxr-xr-x 1 root root 1984 Mar 2 11:30 zcat - -rwxr-xr-x 1 root root 1678 Mar 2 11:30 zcmp - -rwxr-xr-x 1 root root 5880 Mar 2 11:30 zdiff - -rwxr-xr-x 1 root root 29 Mar 2 11:30 zegrep - -rwxr-xr-x 1 root root 29 Mar 2 11:30 zfgrep - -rwxr-xr-x 1 root root 2081 Mar 2 11:30 zforce - -rwxr-xr-x 1 root root 7585 Mar 2 11:30 zgrep - -rwxr-xr-x 1 root root 2206 Mar 2 11:30 zless - -rwxr-xr-x 1 root root 1842 Mar 2 11:30 zmore - -rwxr-xr-x 1 root root 4553 Mar 2 11:30 znew -I: user script /srv/workspace/pbuilder/11797/tmp/hooks/D02_print_environment finished + -rwxr-xr-x 1 root root 1282512 Jun 22 2021 bash + -rwxr-xr-x 3 root root 34808 Jul 21 2020 bunzip2 + -rwxr-xr-x 3 root root 34808 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 34808 Jul 21 2020 bzip2 + -rwxr-xr-x 1 root root 14264 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 39832 Sep 23 2020 cat + -rwxr-xr-x 1 root root 64512 Sep 23 2020 chgrp + -rwxr-xr-x 1 root root 60368 Sep 23 2020 chmod + -rwxr-xr-x 1 root root 64528 Sep 23 2020 chown + -rwxr-xr-x 1 root root 138896 Sep 23 2020 cp + -rwxr-xr-x 1 root root 129544 Dec 11 2020 dash + -rwxr-xr-x 1 root root 101384 Sep 23 2020 date + -rwxr-xr-x 1 root root 80984 Sep 23 2020 dd + -rwxr-xr-x 1 root root 89824 Sep 23 2020 df + -rwxr-xr-x 1 root root 143088 Sep 23 2020 dir + -rwxr-xr-x 1 root root 76152 Feb 8 2021 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 35632 Sep 23 2020 echo + -rwxr-xr-x 1 root root 28 Nov 10 2020 egrep + -rwxr-xr-x 1 root root 31512 Sep 23 2020 false + -rwxr-xr-x 1 root root 28 Nov 10 2020 fgrep + -rwxr-xr-x 1 root root 64856 Feb 8 2021 findmnt + -rwsr-xr-x 1 root root 34824 Feb 27 2021 fusermount + -rwxr-xr-x 1 root root 178400 Nov 10 2020 grep + -rwxr-xr-x 2 root root 2346 Mar 3 2021 gunzip + -rwxr-xr-x 1 root root 6376 Mar 3 2021 gzexe + -rwxr-xr-x 1 root root 93744 Mar 3 2021 gzip + -rwxr-xr-x 1 root root 18440 Nov 8 2019 hostname + -rwxr-xr-x 1 root root 68720 Sep 23 2020 ln + -rwxr-xr-x 1 root root 52720 Feb 8 2020 login + -rwxr-xr-x 1 root root 143088 Sep 23 2020 ls + -rwxr-xr-x 1 root root 161960 Feb 8 2021 lsblk + -rwxr-xr-x 1 root root 85200 Sep 23 2020 mkdir + -rwxr-xr-x 1 root root 68744 Sep 23 2020 mknod + -rwxr-xr-x 1 root root 43976 Sep 23 2020 mktemp + -rwxr-xr-x 1 root root 51368 Feb 8 2021 more + -rwsr-xr-x 1 root root 51360 Feb 8 2021 mount + -rwxr-xr-x 1 root root 14496 Feb 8 2021 mountpoint + -rwxr-xr-x 1 root root 134808 Sep 23 2020 mv + lrwxrwxrwx 1 root root 8 Nov 8 2019 nisdomainname -> hostname + lrwxrwxrwx 1 root root 14 Apr 19 2021 pidof -> /sbin/killall5 + -rwxr-xr-x 1 root root 35720 Sep 23 2020 pwd + lrwxrwxrwx 1 root root 4 Jun 22 2021 rbash -> bash + -rwxr-xr-x 1 root root 43872 Sep 23 2020 readlink + -rwxr-xr-x 1 root root 68592 Sep 23 2020 rm + -rwxr-xr-x 1 root root 43880 Sep 23 2020 rmdir + -rwxr-xr-x 1 root root 19208 Sep 28 2020 run-parts + -rwxr-xr-x 1 root root 114016 Dec 23 2018 sed + lrwxrwxrwx 1 root root 4 Aug 11 15:40 sh -> bash + lrwxrwxrwx 1 root root 4 Aug 10 05:48 sh.distrib -> dash + -rwxr-xr-x 1 root root 35656 Sep 23 2020 sleep + -rwxr-xr-x 1 root root 72640 Sep 23 2020 stty + -rwsr-xr-x 1 root root 67776 Feb 8 2021 su + -rwxr-xr-x 1 root root 35672 Sep 23 2020 sync + -rwxr-xr-x 1 root root 535768 Feb 17 2021 tar + -rwxr-xr-x 1 root root 10568 Sep 28 2020 tempfile + -rwxr-xr-x 1 root root 89120 Sep 23 2020 touch + -rwxr-xr-x 1 root root 31512 Sep 23 2020 true + -rwxr-xr-x 1 root root 14264 Feb 27 2021 ulockmgr_server + -rwsr-xr-x 1 root root 30880 Feb 8 2021 umount + -rwxr-xr-x 1 root root 35640 Sep 23 2020 uname + -rwxr-xr-x 2 root root 2346 Mar 3 2021 uncompress + -rwxr-xr-x 1 root root 143088 Sep 23 2020 vdir + -rwxr-xr-x 1 root root 59584 Feb 8 2021 wdctl + lrwxrwxrwx 1 root root 8 Nov 8 2019 ypdomainname -> hostname + -rwxr-xr-x 1 root root 1984 Mar 3 2021 zcat + -rwxr-xr-x 1 root root 1678 Mar 3 2021 zcmp + -rwxr-xr-x 1 root root 5880 Mar 3 2021 zdiff + -rwxr-xr-x 1 root root 29 Mar 3 2021 zegrep + -rwxr-xr-x 1 root root 29 Mar 3 2021 zfgrep + -rwxr-xr-x 1 root root 2081 Mar 3 2021 zforce + -rwxr-xr-x 1 root root 7585 Mar 3 2021 zgrep + -rwxr-xr-x 1 root root 2206 Mar 3 2021 zless + -rwxr-xr-x 1 root root 1842 Mar 3 2021 zmore + -rwxr-xr-x 1 root root 4553 Mar 3 2021 znew +I: user script /srv/workspace/pbuilder/23607/tmp/hooks/D02_print_environment finished -> Attempting to satisfy build-dependencies -> Creating pbuilder-satisfydepends-dummy package Package: pbuilder-satisfydepends-dummy @@ -352,7 +386,7 @@ Get: 141 http://deb.debian.org/debian bullseye/main arm64 ruby-rspec-its all 1.3.0-1 [6864 B] Get: 142 http://deb.debian.org/debian bullseye/main arm64 ruby-sqlite3 arm64 1.4.2-3 [43.0 kB] Get: 143 http://deb.debian.org/debian bullseye/main arm64 ruby-timecop all 0.9.1-1 [10.2 kB] -Fetched 44.3 MB in 2s (23.6 MB/s) +Fetched 44.3 MB in 1s (51.3 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 ... 19646 files and directories currently installed.) @@ -948,8 +982,45 @@ Writing extended state information... Building tag database... -> Finished parsing the build-deps +Reading package lists... +Building dependency tree... +Reading state information... +The following additional packages will be installed: + libfile-find-rule-perl libnumber-compare-perl libtext-glob-perl +The following NEW packages will be installed: + libfile-find-rule-perl libnumber-compare-perl libtext-glob-perl usrmerge +0 upgraded, 4 newly installed, 0 to remove and 0 not upgraded. +Need to get 59.5 kB of archives. +After this operation, 157 kB of additional disk space will be used. +Get:1 http://deb.debian.org/debian bullseye/main arm64 libnumber-compare-perl all 0.03-1.1 [6956 B] +Get:2 http://deb.debian.org/debian bullseye/main arm64 libtext-glob-perl all 0.11-1 [8888 B] +Get:3 http://deb.debian.org/debian bullseye/main arm64 libfile-find-rule-perl all 0.34-1 [30.6 kB] +Get:4 http://deb.debian.org/debian bullseye/main arm64 usrmerge all 25 [13.0 kB] +debconf: delaying package configuration, since apt-utils is not installed +Fetched 59.5 kB in 0s (2789 kB/s) +Selecting previously unselected package libnumber-compare-perl. +(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 ... 28028 files and directories currently installed.) +Preparing to unpack .../libnumber-compare-perl_0.03-1.1_all.deb ... +Unpacking libnumber-compare-perl (0.03-1.1) ... +Selecting previously unselected package libtext-glob-perl. +Preparing to unpack .../libtext-glob-perl_0.11-1_all.deb ... +Unpacking libtext-glob-perl (0.11-1) ... +Selecting previously unselected package libfile-find-rule-perl. +Preparing to unpack .../libfile-find-rule-perl_0.34-1_all.deb ... +Unpacking libfile-find-rule-perl (0.34-1) ... +Selecting previously unselected package usrmerge. +Preparing to unpack .../archives/usrmerge_25_all.deb ... +Unpacking usrmerge (25) ... +Setting up libtext-glob-perl (0.11-1) ... +Setting up libnumber-compare-perl (0.03-1.1) ... +Setting up libfile-find-rule-perl (0.34-1) ... +Setting up usrmerge (25) ... +The system has been successfully converted. +Processing triggers for man-db (2.9.4-2) ... +Not building database; man-db/auto-update is not 'true'. 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 +hostname: Temporary failure in name resolution +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 @@ -1073,173 +1144,164 @@ 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/aarch64-linux-gnu/ruby/gems/2.7.0:/usr/share/rubygems-integration/2.7.0:/usr/share/rubygems-integration/all:/usr/lib/aarch64-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 59158 - -FactoryBot::Strategy::Build - it should behave like strategy with strategy: :build - runs the factory with the correct overrides - finds the factory with the correct factory name - it should behave like strategy with association support - finds the factory with the correct factory name - runs the factory with the correct overrides - it should behave like strategy with callbacks - runs the callbacks [:after_build] with the evaluation's object - returns the object from the evaluation +Randomized with seed 25070 FactoryBot::Factory with a name ending in s - build_class - is expected to eq Business name is expected to eq :business + build_class + is expected to eq Business -FactoryBot::DefinitionProxy#factory - with options - with a block - without options +FactoryBot::Attribute::Association + builds the association when calling the proc + is expected to be association + builds the association when calling the proc + name + is expected to eq :author -FactoryBot::Registry - knows when an object is not registered - does not include duplicate objects with registered under different names - finds a registered object - clears registered factories - is expected to be a kind of Enumerable - iterates registered objects - raises when an object cannot be found - knows that an object is registered by symbol - knows that an object is registered by string - finds a registered object with square brackets - adds and returns the object registered +FactoryBot::DefinitionProxy#initialize_with + defines the constructor on the definition -FactoryBot aliases - aliases for a foreign key - is expected to include :test - is expected to include :test_id - aliases for an attribute - is expected to include :test - is expected to include :test_id - aliases for an attribute starting with an underscore - is expected not to include :id +FactoryBot::DeclarationList#declare_attribute + when not overridable + adds the declaration to the list + when overridable + deletes declarations with the same name + adds the declaration to the list -FactoryBot::Factory human names - factory name with big letters - human_names - is expected to eq ["lol"] - names - is expected to eq [:LoL] - 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 underscores - names - is expected to eq [:happy_user] - human_names - is expected to eq ["happy user"] - factory name without underscores - names - is expected to eq [:user] - human_names - is expected to eq ["user"] +FactoryBot::Attribute::Dynamic with a string name + name + is expected to eq :name -FactoryBot::Factory when given a class that overrides #to_s - sets build_class correctly +FactoryBot::AttributeList generating names + knows all its #names for #associations + knows all its #names for #non_ignored attributes + knows all its #names for #ignored attributes + knows all its #names FactoryBot::Attribute::Association with a string name name is expected to eq :name -FactoryBot::DefinitionProxy#trait - declares a trait +FactoryBot::Strategy::Create + runs a custom create block + it should behave like strategy with association support + runs the factory with the correct overrides + finds the factory with the correct factory name + it should behave like strategy with callbacks + returns the object from the evaluation + runs the callbacks [:after_build, :before_create, :after_create] with the evaluation's object -definition loading - with several factories files under spec/factories in non-alphabetical order - loads the files in the right order - with several factories files under test/factories in non-alphabetical order - loads the files in the right order - with several factories files under spec/factories - it should behave like finds definitions - is expected to load definitions from spec/factories/person_factory.rb - is expected to load definitions from spec/factories/post_factory.rb - with nested and unnested factories files under spec - it should behave like finds definitions - is expected to load definitions from spec/factories/person_factory.rb - is expected to load definitions from spec/factories/post_factory.rb - is expected to load definitions from spec/factories.rb - with nested and unnested factories files under test - it should behave like finds definitions - is expected to load definitions from test/factories.rb - is expected to load definitions from test/factories/person_factory.rb - is expected to load definitions from test/factories/post_factory.rb - with 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 deeply nested factory files under test - it should behave like finds definitions - is expected to load definitions from test/factories/subdirectory/person_factory.rb - is expected to load definitions from test/factories/subdirectory/post_factory.rb - with a factories file under test - it should behave like finds definitions - is expected to load definitions from test/factories.rb - with factories.rb - it should behave like finds definitions - is expected to load definitions from factories.rb - with a factories file under test/factories - it should behave like finds definitions - is expected to load definitions from test/factories/post_factory.rb - with deeply nested factory files under spec - it should behave like finds definitions - is expected to load definitions from spec/factories/subdirectory/post_factory.rb - is expected to load definitions from spec/factories/subdirectory/person_factory.rb - with a factories file under spec - it should behave like finds definitions - is expected to load definitions from spec/factories.rb +FactoryBot::DefinitionProxy#to_create + accepts a block to run in place of #save! -FactoryBot::Factory when defined with a custom class name - build_class - is expected to eq ArgumentError +FactoryBot::Factory with a string for a name + name + is expected to eq :string + +FactoryBot + finds a registered strategy + finds a registered sequence + finds a registered factory + finds a registered trait + .use_parent_strategy + is true by default FactoryBot::NullFactory + is expected to delegate :constructor is expected to delegate :attributes is expected to delegate :defined_traits - is expected to delegate :constructor is expected to delegate :callbacks - class_name - is expected to be nil compile is expected to be nil attributes is expected to be an instance of FactoryBot::AttributeList + class_name + is expected to be nil evaluator_class is expected to eq FactoryBot::Evaluator FactoryBot::EvaluatorClassDefiner - evaluates the block in the context of the evaluator - adds each attribute to the evaluator - sets attributes on the evaluator class returns an evaluator when accessing the evaluator class + evaluates the block in the context of the evaluator only instance_execs the block once even when returning nil + sets attributes on the evaluator class + adds each attribute to the evaluator with a custom evaluator as a parent class bases its attribute lists on itself and its parent evaluator -FactoryBot::AttributeList#apply_attributes - adds attributes in the order defined +FactoryBot::Internal + .factory_by_name + finds a registered factory + default strategies and callbacks + registers the build strategy by default + registers the create strategy by default + registers the after_build by default + registers the after_create by default + registers the build_stubbed strategy by default + registers the after_create by default + registers the after_stub by default + registers the attributes_for strategy by default + registers the null strategy by default + .strategy_by_name + finds a registered strategy + .register_strategy + register the provided strategy name with the class + .register_sequence + registers the provided sequence + returns the registered sequence + .sequence_by_name + finds a registered sequence + .factory_by_name + finds a registered factory + .rewind_sequences + rewinds the sequences and the internal sequences + .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 + .trait_by_name + finds a previously registered trait -FactoryBot::DefinitionProxy#add_attribute when the proxy ignores attributes - declares a dynamic attribute on the factory +FactoryBot::DefinitionProxy#association + declares an association + declares an association with options + when passing a block + raises an error -FactoryBot::Callback - raises if an invalid callback name is assigned - runs its block with one parameter - has a name - runs its block with two parameters - converts strings to symbols - allows valid callback names to be assigned - runs its block with no parameters +FactoryBot::Factory when given a class that overrides #to_s + sets build_class correctly + +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::Factory when defined with a custom class + build_class + is expected to eq Float + +FactoryBot::Registry + raises when an object cannot be found + knows that an object is registered by symbol + is expected to be a kind of Enumerable + iterates registered objects + adds and returns the object registered + finds a registered object with square brackets + finds a registered object + clears registered factories + knows that an object is registered by string + knows when an object is not registered + does not include duplicate objects with registered under different names FactoryBot::Factory when defined with a class instead of a name name @@ -1247,21 +1309,14 @@ build_class is expected to eq ArgumentError -FactoryBot::Attribute::Association - builds the association when calling the proc - builds the association when calling the proc - is expected to be association - name - is expected to eq :author - -FactoryBot::AttributeList#define_attribute - maintains a list of attributes - raises if an attribute has already been defined - returns the attribute +FactoryBot::DefinitionProxy#add_attribute when the proxy ignores attributes + declares a dynamic attribute on the factory -FactoryBot::DeclarationList#attributes - defines each attribute on the attribute list - returns an AttributeList +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::Decorator::AttributeHash #attributes @@ -1269,242 +1324,163 @@ with an attribute called 'attributes' does not call itself recursively -FactoryBot::Factory running a factory - returns the result from the strategy when running - calls the block and returns the result - creates the right strategy using the build class when running - -FactoryBot::Attribute::Dynamic - with a block returning a static value - returns the value when executing the proc - with a block returning a sequence - raises a sequence abuse error - with a block referencing an attribute on the attribute - evaluates the attribute from the attribute - name - is expected to eq :first_name - with a block returning its block-level variable - returns self when executing the proc - -FactoryBot::DefinitionProxy#association - declares an association - declares an association with options - when passing a block - raises an error - -FactoryBot::Factory when defined with a custom class - build_class - is expected to eq Float +FactoryBot::AttributeList filter based on ignored attributes + filters #non_ignored attributes + filters #ignored attributes -FactoryBot::DefinitionProxy#method_missing - when called with a static-attribute-like argument - raises a NoMethodError - when called with a block - declares a dynamic attribute - when called without args or a block - declares an implicit declaration - when called with a ':factory' key - declares an association +FactoryBot::NullObject + does not respond to other methods + responds to the given methods FactoryBot::Definition is expected to delegate :declare_attribute - #to_create - returns the assigned value when given a block - to_create - is expected to be nil with a name creates a new attribute list with the name passed + adding callbacks + maintains a list of callbacks #name returns the name #overridable sets the declaration list as overridable defining traits - maintains a list of traits adds only unique traits - adding callbacks - maintains a list of callbacks + maintains a list of traits + #to_create + returns the assigned value when given a block + to_create + is expected to be nil -FactoryBot::DefinitionProxy#to_create - accepts a block to run in place of #save! +FactoryBot::AttributeList#define_attribute + maintains a list of attributes + returns the attribute + raises if an attribute has already been defined -FactoryBot::Strategy::Stub - it should behave like strategy with strategy: :build - runs the factory with the correct overrides - finds the factory with the correct factory name - asking for a result - is expected not to be new record - is expected not to be destroyed - is expected to be persisted - assigns created_at - overriding persistence method: #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: #decrement! - raises an informative error if the method is called - overrides the method with any arity - overriding persistence method: #update_column - raises an informative error if the method is called - overrides the method with any arity - overriding persistence method: #update! - 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: #reload - 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 - raises an informative error if the method is called - overrides the method with any arity - overriding persistence method: #save - overrides the method with any arity - raises an informative error if the method is called - overriding persistence method: #connection - raises an informative error if the method is called - overrides the method with any arity - overriding persistence method: #increment! - overrides the method with any arity - raises an informative error if the method is called - overriding persistence method: #update_columns - 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: #save! - 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 - raises an informative error if the method is called - overrides the method with any arity - overriding persistence method: #update - raises an informative error if the method is called - overrides the method with any arity - it should behave like strategy with association support - finds the factory with the correct factory name - runs the factory with the correct overrides - it should behave like strategy with callbacks - runs the callbacks [:after_stub] with the evaluation's object - returns the object from the evaluation +FactoryBot::DeclarationList#attributes + returns an AttributeList + defines each attribute on the attribute list -FactoryBot::Attribute::Sequence - assigns the next value in the sequence +FactoryBot::Attribute::Dynamic name is expected to eq :first_name + with a block returning a static value + returns the value when executing the proc + with a block returning its block-level variable + returns self when executing the proc + with a block returning a sequence + raises a sequence abuse error + with a block referencing an attribute on the attribute + evaluates the attribute from the attribute -FactoryBot - finds a registered sequence - finds a registered trait - finds a registered strategy - finds a registered factory - .use_parent_strategy - is true by default - -FactoryBot::Attribute::Dynamic with a string name - name - is expected to eq :name - -FactoryBot::DefinitionProxy#add_attribute - declares a dynamic attribute on the factory - -FactoryBot after defining an alias - is expected to include :test_suffix_id - is expected to include :test - -FactoryBot::DefinitionProxy#initialize_with - defines the constructor on the definition +FactoryBot::DefinitionProxy#transient + makes all attributes added ignored -FactoryBot::StrategyCalculator - when a class - returns the class passed - when a symbol - finds the strategy by name - returns the strategy found +FactoryBot::Declaration::Dynamic + #== + when the names are different + the objects are NOT equal + when comparing against another type of object + the objects are NOT equal + when the attributes are equal + the objects are equal + when one is ignored and the other isn't + the objects are NOT equal + when the blocks are different + the objects are NOT equal -FactoryBot::DefinitionProxy adding callbacks - #after(:stub, :create) - is expected to have callback :after_create - is expected to have callback :after_stub - #after(:stub) - is expected to have callback :after_stub - #after(:create) - is expected to have callback :after_create - #after(:build) - is expected to have callback :after_build - #before(:stub, :create) - is expected to have callback :before_stub - is expected to have callback :before_create - #callback(:after_stub, :before_create) - is expected to have callback :after_stub - is expected to have callback :before_create +definition loading + with deeply nested factory files under spec + it should behave like finds definitions + is expected to load definitions from spec/factories/subdirectory/person_factory.rb + is expected to load definitions from spec/factories/subdirectory/post_factory.rb + with 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 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 spec/factories in non-alphabetical order + loads the files in the right order + with a factories file under spec + it should behave like finds definitions + is expected to load definitions from spec/factories.rb + with a factories file under test/factories + it should behave like finds definitions + is expected to load definitions from test/factories/post_factory.rb + with a factories file under spec/factories + it should behave like finds definitions + is expected to load definitions from spec/factories/post_factory.rb + with factories.rb + it should behave like finds definitions + is expected to load definitions from factories.rb + with several factories files under test/factories + it should behave like finds definitions + is expected to load definitions from test/factories/person_factory.rb + is expected to load definitions from test/factories/post_factory.rb + with nested and unnested factories files under test + it should behave like finds definitions + is expected to load definitions from test/factories/post_factory.rb + is expected to load definitions from test/factories.rb + is expected to load definitions from test/factories/person_factory.rb + with nested and unnested factories files under spec + it should behave like finds definitions + is expected to load definitions from spec/factories.rb + is expected to load definitions from spec/factories/person_factory.rb + is expected to load definitions from spec/factories/post_factory.rb + with several factories files under test/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 FactoryBot::Sequence - a sequence with aliases using default value - names - is expected to eq [:test, :alias, :other] + iterating over items in an enumerator + navigates to the next items until no items remain behaves like a sequence - after rewinding - next - is expected to eq "=1" next - is expected to eq "=1" + is expected to eq "=foo" when incrementing next - is expected to eq "=2" - a basic sequence without a block - behaves like a sequence - when incrementing + is expected to eq "=bar" + after rewinding next - is expected to eq 2 + is expected to eq "=foo" + a custom sequence without a block + behaves like a sequence after rewinding next - is expected to eq 1 + is expected to eq "A" next - is expected to eq 1 + is expected to eq "A" + when incrementing + next + is expected to eq "B" a sequence with custom value and aliases names is expected to eq [:test, :alias, :other] behaves like a sequence next is expected to eq "=3" - after rewinding - next - is expected to eq "=3" when incrementing next is expected to eq "=4" - a custom sequence without a block - behaves like a sequence after rewinding next - is expected to eq "A" + is expected to eq "=3" + a basic sequence without a block + behaves like a sequence next - is expected to eq "A" + is expected to eq 1 when incrementing next - is expected to eq "B" - iterating over items in an enumerator - navigates to the next items until no items remain - behaves like a sequence - next - is expected to eq "=foo" + is expected to eq 2 after rewinding next - is expected to eq "=foo" - when incrementing - next - is expected to eq "=bar" - a basic sequence + is expected to eq 1 + a sequence with aliases using default value + names + is expected to eq [:test, :alias, :other] behaves like a sequence after rewinding next @@ -1514,10 +1490,26 @@ when incrementing next is expected to eq "=2" + a custom sequence and scope + increments within the correct scope + when incrementing + increments within the correct scope + after rewinding + increments within the correct scope + a basic sequence name is expected to eq :test names is expected to eq [:test] + behaves like a sequence + next + is expected to eq "=1" + after rewinding + next + is expected to eq "=1" + when incrementing + next + is expected to eq "=2" a custom sequence behaves like a sequence when incrementing @@ -1528,469 +1520,287 @@ is expected to eq "=A" next is expected to eq "=A" - 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#transient - makes all attributes added ignored +FactoryBot::Attribute::Sequence + assigns the next value in the sequence + name + is expected to eq :first_name -FactoryBot::Declaration::Dynamic - #== - when the names are different - the objects are NOT equal - when the blocks are different - the objects are NOT equal - when comparing against another type of object - the objects are NOT equal - when the attributes are equal - the objects are equal - when one is ignored and the other isn't - the objects are NOT equal +FactoryBot aliases + aliases for a foreign key + is expected to include :test_id + is expected to include :test + aliases for an attribute + is expected to include :test_id + is expected to include :test + aliases for an attribute starting with an underscore + is expected not to include :id -FactoryBot::Attribute - is expected not to be association - name - is expected to eq :user +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 + +FactoryBot::DefinitionProxy#trait + declares a trait + +FactoryBot::AttributeList#apply_attributes + adds attributes in the order defined + +FactoryBot::StrategyCalculator + when a class + returns the class passed + when a symbol + finds the strategy by name + returns the strategy found + +FactoryBot::DefinitionProxy#factory + without options + with options + with a block + +FactoryBot::Factory human names + 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 with underscores + names + is expected to eq [:happy_user] + human_names + is expected to eq ["happy user"] + factory name without underscores + names + is expected to eq [:user] + human_names + is expected to eq ["user"] FactoryBot::Factory - creates a new factory while overriding the parent class - has a factory name + returns associations guesses the build class from the factory name has a build class - creates a new factory using the class of the parent - returns associations + has a factory name + creates a new factory while overriding the parent class 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 + returns the overridden value in the generated attributes overriding an attribute with an alias - uses the passed in value for the alias discards the predefined value for the attribute + uses the passed in value for the alias + +FactoryBot::Factory running a factory + returns the result from the strategy when running + creates the right strategy using the build class when running + calls the block and returns the result + +FactoryBot::Strategy::Stub + it should behave like strategy with callbacks + runs the callbacks [:after_stub] with the evaluation's object + returns the object from the evaluation + it should behave like strategy with strategy: :build + finds the factory with the correct factory name + runs the factory with the correct overrides + it should behave like strategy with association support + runs the factory with the correct overrides + finds the factory with the correct factory name + asking for a result + is expected to be persisted + is expected not to be destroyed + assigns created_at + is expected not to be new record + overriding persistence method: #update_attributes! + overrides the method with any arity + raises an informative error if the method is called + overriding persistence method: #update_columns + raises an informative error if the method is called + overrides the method with any arity + overriding persistence method: #save + raises an informative error if the method is called + overrides the method with any arity + overriding persistence method: #update_column + overrides the method with any arity + raises an informative error if the method is called + overriding persistence method: #connection + raises an informative error if the method is called + overrides the method with any arity + overriding persistence method: #destroy! + raises an informative error if the method is called + overrides the method with any arity + overriding persistence method: #delete + overrides the method with any arity + raises an informative error if the method is called + overriding persistence method: #update_attribute + overrides the method with any arity + raises an informative error if the method is called + overriding persistence method: #touch + raises an informative error if the method is called + overrides the method with any arity + overriding persistence method: #save! + overrides the method with any arity + raises an informative error if the method is called + overriding persistence method: #decrement! + overrides the method with any arity + raises an informative error if the method is called + overriding persistence method: #reload + raises an informative error if the method is called + overrides the method with any arity + overriding persistence method: #toggle! + overrides the method with any arity + raises an informative error if the method is called + overriding persistence method: #increment! + raises an informative error if the method is called + overrides the method with any arity + overriding persistence method: #update_attributes + 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: #destroy + overrides the method with any arity + raises an informative error if the method is called + overriding persistence method: #update! + raises an informative error if the method is called + overrides the method with any arity + +FactoryBot::AttributeList#associations + returns associations + +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#define_attribute with a named attribute list - does not raise when the attribute is not a self-referencing association raises when the attribute is a self-referencing association + does not raise when the attribute is not a self-referencing association + +FactoryBot::Strategy::Build + it should behave like strategy with callbacks + returns the object from the evaluation + runs the callbacks [:after_build] with the evaluation's object + it should behave like strategy with association support + finds the factory with the correct factory name + runs the factory with the correct overrides + it should behave like strategy with strategy: :build + runs the factory with the correct overrides + finds the factory with the correct factory name FactoryBot::Declaration::Implicit - with a known sequence - does not create an assocition attribute - creates a sequence attribute #== - when the attributes are equal - the objects are equal - when one is ignored and the other isn't - the objects are NOT equal - when the names are different + when comparing against another type of object the objects are NOT equal when the factories are different the objects are NOT equal - when comparing against another type of object + when one is ignored and the other isn't the objects are NOT equal + when the attributes are equal + the objects are equal + when the names are different + the objects are NOT equal + with a known sequence + does not create an assocition attribute + creates a sequence attribute with a known factory creates an association attribute has the correct factory name -FactoryBot::Internal - .register_strategy - register the provided strategy name with the class - .strategy_by_name - finds a registered strategy - .sequence_by_name - finds a registered sequence - .register_sequence - registers the provided sequence - returns the registered sequence - .factory_by_name - finds a registered factory - .register_factory - returns the registered factory - registers the provided factory - .factory_by_name - finds a registered factory - .rewind_sequences - rewinds the sequences and the internal sequences - .register_factory - returns the registered factory - registers the provided factory - default strategies and callbacks - registers the after_build by default - registers the after_stub by default - registers the build strategy by default - registers the after_create by default - registers the create strategy by default - registers the attributes_for strategy by default - registers the null strategy by default - registers the after_create by default - registers the build_stubbed strategy by default - .trait_by_name - finds a previously registered trait - .register_trait - registers the provided trait - returns the registered trait - -FactoryBot::Factory with a string for a name - name - is expected to eq :string +FactoryBot::DefinitionProxy adding callbacks + #after(:create) + is expected to have callback :after_create + #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_create + is expected to have callback :after_stub + #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(:build) + is expected to have callback :after_build -FactoryBot::NullObject - responds to the given methods - does not respond to other methods +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::Declaration::Association #== - 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 + when the names are different + the objects are NOT equal when the attributes are equal the objects are equal -FactoryBot::Strategy::Create - runs a custom create block - it should behave like strategy with association support - runs the factory with the correct overrides - finds the factory with the correct factory name - it should behave like strategy with callbacks - returns the object from the evaluation - runs the callbacks [:after_build, :before_create, :after_create] with the evaluation's object - -FactoryBot::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 - -FactoryBot::AttributeList filter based on ignored attributes - filters #ignored attributes - filters #non_ignored attributes - -FactoryBot::AttributeList#associations - returns associations - -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::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::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::Callback + raises if an invalid callback name is assigned + runs its block with one parameter + runs its block with two parameters + allows valid callback names to be assigned + has a name + runs its block with no parameters + converts strings to symbols -FactoryBot::Decorator::DisallowsDuplicatesRegistry - raises when attempting to #register a previously registered strategy - delegates #register to the registry when not registered +FactoryBot::DefinitionProxy#method_missing + when called without args or a block + declares an implicit declaration + when called with a ':factory' key + declares an association + when called with a block + declares a dynamic attribute + when called with a static-attribute-like argument + raises a NoMethodError -FactoryBot::DeclarationList#declare_attribute - when overridable - adds the declaration to the list - deletes declarations with the same name - when not overridable - adds the declaration to the list +FactoryBot after defining an alias + is expected to include :test_suffix_id + is expected to include :test -Finished in 1.28 seconds (files took 1.54 seconds to load) +Finished in 1.24 seconds (files took 1.52 seconds to load) 307 examples, 0 failures -Randomized with seed 59158 +Randomized with seed 25070 /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 -Randomized with seed 59820 - -callbacks - runs child callback after parent callback - runs the after(:build) callback when building - 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 - -an instance generated by a factory with multiple traits - the other child class with one trait - is expected not to be admin - gender - is expected to eq "Female" - name - is expected to eq "Jane" - the child class with one trait - is expected to be admin - name - is expected to eq "John" - gender - is expected to be nil - the child with multiple traits - is expected to be admin - gender - is expected to eq "Female" - name - is expected to eq "Jane" - the parent class - is expected not to be admin - gender - is expected to be nil - name - is expected to eq "John" - factory using global trait - name - is expected to eq "Bill" - email - is expected to eq "Bill@example.com" - factory outside of scope - raises an error - 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 male assigns name after female - is expected to be admin - gender - is expected to eq "Male" - name - is expected to eq "Joe" - when the female assigns name after male - is expected to be admin - gender - is expected to eq "Female" - name - is expected to eq "Jane" - factory with trait defined multiple times - great - is expected to eq "GREAT!!!" - child factory redefining trait - great - is expected to eq "EVEN GREATER!!!" - the child with multiple traits and overridden attributes - is expected to be admin - gender - is expected to be nil - name - is expected to eq "Jill" - child class with scoped trait and inherited trait - is expected to be admin - name - is expected to eq "Judy" - gender - is expected to eq "Female" - child factory created where trait attributes are inherited - gender - is expected to eq "Male" - date_of_birth - is expected to eq Sat, 01 Jan 2000 - -a custom create - uses the custom create block instead of save +Randomized with seed 15422 nested implicit traits - defined inside the factory + defined outside the factory it should behave like assigning data from traits assigns the correct values - defined outside the factory + defined inside the factory it should behave like assigning data from traits assigns the correct values -build multiple instances - without default attributes - builds (but doesn't save) all the posts - uses the default factory values - length - is expected to eq 20 - with a block - correctly uses the set value - with default attributes - overrides the default values - -binding a callback to multiple callbacks - binds the callback to creation - binds the callback to stubbing - does not bind the callback to building - -a generated stub instance - disables decrement! - disables update_attribute - generates unique ids - assigns a default attribute - disables destroy - has an id - disables save - disables connection - allows decrement - disables toggle! - disables reload - isn't changed - assigns associations - allows toggle - allows increment - isn't a new record - disables increment! - assigns an overridden attribute - assigns associations that aren't new records - -global skip_create - does not persist any record - honors overridden to_create - does not persist child records - honors inline trait to_create - -global callbacks - triggers after build callbacks for all factories - -`attributes_for` for a class whose constructor has required params - [:name] - is expected to eq "John Doe" - -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" - -associations without overriding :strategy - when the :use_parent_strategy config option is set to false - uses the overridden strategy on the association - when the :use_parent_strategy config option is set to true - uses the parent strategy on the association - -traits with to_create - can apply to_create from traits - gives base traits normal priority - can apply to_create from the definition - gives additional traits higher priority than base traits and factory definition - gives additional traits higher priority than to_create from the definition - gives base traits lower priority than overrides - -traits with initialize_with - can apply initialize_with from the definition - gives base traits normal priority - gives additional traits higher priority than initialize_with from the definition - gives additional traits higher priority than base traits and factory definition - can apply initialize_with from traits - gives base traits lower priority than overrides - -setting private attributes - raises a NoMethodError - -global to_create - handles child to_create - handles inline trait override - uses to_create globally across FactoryBot.define - handles base to_create - handles child to_create with trait - -a custom create passing in an evaluator - passes the evaluator to the custom create block - -initialize_with non-ORM-backed objects - generates random data - allows for overrides - -assigning overrides that are also private methods on object - y - is expected to eq 12345 - more_format - is expected to eq "format: Great" - format - is expected to eq "Great" - some_funky_method - is expected to eq "foobar!" - -finding factories keyed by class instead of symbol - doesn't find the factory - -a stubbed instance with no primary key - behaves like a persisted record - builds a stubbed instance - -initialize_with with non-FG attributes - age - is expected to eq 21 - name - is expected to eq "John Doe" - -an instance generated by a factory - registers the user factory - -calling `attributes_for` with a block - passes the hash of attributes - returns the hash of attributes - -calling `create` with a block - passes the created instance - returns the created instance - -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 +calling `build` with a block + returns the built instance + passes the built instance -initialize_with with FG attributes that are transient - name - is expected to eq "Handsome Chap from .construct" +attributes defined using Symbol#to_proc + assigns overridden value correctly + assigns value with override correctly + assigns values correctly a built instance with strategy: :create - is expected to be new record assigns and saves associations - -defaulting `id` - allows overriding id - -defaulting `created_at` - behaves the same as a non-stubbed created_at - doesn't allow setting created_at on an object that doesn't define it - is doesn't mark the object as changed - allows assignment of created_at - doesn't add created_at to objects who don't have the method - allows overriding created_at for objects with created_at - defaults created_at for objects with created_at - -initialize_with for a constructor that requires a block - executes the block correctly - -FactoryBot.lint - allows for selective linting - does not raise when all factories are valid - raises when a factory is invalid - 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 - factory strategy for linting - uses the requested strategy - uses the requested strategy during trait validation - verbose linting - prints the backtrace for each factory error + is expected to be new record attribute aliases assigning an association by passing factory @@ -1998,170 +1808,129 @@ assigning an association by foreign key doesn't assign both an association and its foreign key -a created instance, specifying strategy: :build - saves associations (strategy: :build only affects build, not create) - -inline traits overriding existing attributes - prefers traits on a factory over default attributes - prefers overridden attributes over attributes from traits, inline traits, or attributes on factories - prefers inline traits over attributes on factories - prefers attributes on factories over attributes from non-inline traits - returns the default status - prefers inline trait attributes over default attributes - prefers inline trait attributes over traits on a factory - -making sure the factory is properly compiled the first time we want to instantiate it - can honor traits on the very first call - -aliases and overrides - two - is expected to be nil - one - is expected to eq "override" - -applying inline traits - applies traits only to the instance generated for that call - -when a self-referential trait is defined - raises a TraitDefinitionError - raises a TraitDefinitionError - -a created instance - is expected not to be new record - assigns and saves associations - -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 - -traits used in associations - allows inline traits with the default association - allows inline traits with a specific factory for an association - allows assigning traits for the factory of an association - calling methods on the model instance without the attribute being overridden - returns the correct value from the instance - doesn't instantiate a record with attributes_for returns nil during attributes_for - with the referenced attribute being overridden - uses the overridden value during attributes_for - uses the overridden value + doesn't instantiate a record with attributes_for + returns the correct value from the instance with the attribute being overridden + uses the overridden value uses the overridden value during attributes_for + with the referenced attribute being overridden uses the overridden value + uses the overridden value during attributes_for -accessing methods from the instance within a dynamic attribute that is also a private method on object - more_format - is expected to eq "format: This is an awesome format" - -a stubbed instance overriding strategy - acts as if it is saved in the database - assigns associations and acts as if it is saved - -calling `build_stubbed` with a block - passes the stub instance - returns the stub instance +using ActiveSupport::Instrumentation to track factory interaction + builds the correct payload + tracks proper time of creating the record -defining methods inside FactoryBot - raises with a meaningful message +`attributes_for` for a class whose constructor has required params + [:name] + is expected to eq "John Doe" -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 +create multiple instances + without default attributes + creates all the posts + uses the default factory values + length + is expected to eq 2 -FactoryBot.rewind_sequences - resets inline sequences back to their starting value - still allows global sequences prefixed with a factory name - does not collide with globally registered factories - allows setting sequences within identically named traits - resets all sequences back to their starting values +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 -defaulting `updated_at` +defaulting `created_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 - defaults updated_at for objects with updated_at - behaves the same as a non-stubbed updated_at - doesn't add updated_at to objects who don't have the method - allows assignment of updated_at - -callbacks using Symbol#to_proc - runs the callback correctly + doesn't allow setting created_at on an object that doesn't define it + doesn't add created_at to objects who don't have the method + allows assignment of created_at + 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 -including FactoryBot::Syntax::Methods when custom strategies have been declared - allows adding additional strategies +traits with initialize_with + can apply initialize_with from traits + gives base traits lower priority than overrides + can apply initialize_with from the definition + 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 -callbacks using syntax methods without referencing FactoryBot explicitly - works when the callback has one variable - works when the callback has no variables - works when the callback has two variables +aliases and overrides + one + is expected to eq "override" + two + is expected to be nil -modifying inherited factories with traits - returns the correct value for overridden attributes from traits defining multiple attributes - returns the correct value for overridden attributes from traits - allows modification of attributes created via traits +create multiple instances + with default attributes + overrides the default values + without default attributes + uses the default factory values + creates all the posts + length + is expected to eq 20 + without the count + raise ArgumentError with the proper error message + with a block + uses the new values modifying factories - raises an exception if the factory was not defined before - allows for overriding child classes doesn't overwrite already defined child's attributes - adding callbacks - login - is expected to be nil - name - is expected to eq "great user" + allows for overriding child classes + raises an exception if the factory was not defined before redefining attributes creating user - overriding the email - email - is expected to eq "perfect@example.com" - name - is expected to eq "Great User" overriding the name - name - is expected to eq "wonderful" email is expected to eq "wonderful-modified@example.com" - without overrides name - is expected to eq "Great User" + is expected to eq "wonderful" + without overrides email is expected to eq "Great User-modified@example.com" - creating admin - overriding the name name - is expected to eq "wonderful" - admin - is expected to equal true - email - is expected to eq "wonderful-modified@example.com" + is expected to eq "Great User" overriding the email + name + is expected to eq "Great User" email is expected to eq "perfect@example.com" + creating admin + without overrides + email + is expected to eq "Great User-modified@example.com" admin is expected to equal true name is expected to eq "Great User" - without overrides + overriding the name admin is expected to equal true + email + is expected to eq "wonderful-modified@example.com" name - is expected to eq "Great User" + is expected to eq "wonderful" + overriding the email + admin + is expected to equal true email - is expected to eq "Great User-modified@example.com" + is expected to eq "perfect@example.com" + name + is expected to eq "Great User" simple modification - does allow the factory to be subsequently modified doesn't allow the factory to be subsequently defined + does allow the factory to be subsequently modified login is expected to eq "GREAT USER" name is expected to eq "Great User" + adding callbacks + login + is expected to be nil + name + is expected to eq "great user" reusing traits name is expected to eq "Johnny Rockstar!!!" @@ -2170,113 +1939,40 @@ login is expected to eq "JOHNNY ROCKSTAR!!!" -traits with callbacks - executes callbacks in the order assigned - when the factory has a trait passed via arguments - name - is expected to eq "JOHN" - when the factory has an implicit trait - name - is expected to eq "JOHN" +callbacks using syntax methods without referencing FactoryBot explicitly + works when the callback has one variable + works when the callback has no variables + works when the callback has two variables + +making sure the factory is properly compiled the first time we want to instantiate it + can honor traits on the very first call an instance generated by a factory named a camel case string registers the UserModel factory -initialize_with with an 'attributes' attribute - assigns attributes correctly - -associations overriding :strategy - uses the overridden create strategy to create the association - -reload - does not reset the value of use_parent_strategy - -transient attributes - returning attributes for a factory - is expected not to have key :upcased - is expected not to have key :rockstar - is expected not to have key :four - is expected to have key :email - is expected to have key :name - without transient variables assigned - uses the default value of the attribute - with a transient variable assigned - generates the correct attributes on a groupie - generates the correct attributes on a rockstar with a name - generates the correct attributes on a rockstar - generates the correct attributes on an upcased rockstar - -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 - -implicit traits containing callbacks - only runs the callback once - -association assignment from nested attributes - assigns the correct amount of comments when overridden - assigns the correct amount of comments - -initialize_with doesn't duplicate assignment on attributes accessed from initialize_with - instantiates the correct object +traits used in associations + allows inline traits with the default association + allows inline traits with a specific factory for an association + allows assigning traits for the factory of an association -skipping the default create - doesn't execute anything when creating the instance +a custom create + uses the custom create block instead of save -global initialize_with +global to_create handles inline trait override - handles child initialize_with - handles base initialize_with - uses initialize_with globally across FactoryBot.define - handles child initialize_with with trait - -an instance generated by a factory that inherits from another factory - the child class redefining parent's attributes - is expected to be a kind of User(id: integer, name: string, admin: boolean, email: string, upper_email: string, login: string) - is expected to be admin - email - is expected to eq "admin@example.com" - name - is expected to eq "admin" - login - is expected to eq "admin@example.com" - upper_email - is expected to eq "ADMIN@EXAMPLE.COM" - the parent class - is expected not to be admin - name - is expected to eq "John" - email - is expected to eq "john@example.com" - login - is expected to eq "john@example.com" - -initialize_with parent and child factories - uses the parent's constructor when the child factory doesn't assign it - allows child factories to override initialize_with - -a generated attributes hash - assigns a default value - assigns a lazy, dependent attribute - doesn't assign associations - assigns an overridden value - -multiple creates and transient attributes to dynamically build attribute lists - generates the correct number of posts - allows the number of posts to be modified - -custom callbacks - runs a custom before callback when the proper strategy executes - runs a custom after callback when the proper strategy executes - runs a custom callback without prepending before or after when the proper strategy executes + handles child to_create with trait + handles child to_create + uses to_create globally across FactoryBot.define + handles base to_create -assigning values from a transient attribute - does not ignore an _id attribute that is an alias for a transient attribute +callbacks using Symbol#to_proc + runs the callback correctly -attributes defined using Symbol#to_proc - assigns value with override correctly - assigns values correctly - assigns overridden value correctly +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 declaring attributes on a Factory that are private methods on Object system @@ -2286,109 +1982,222 @@ sleep is expected to eq -5 +callbacks + runs the after(:build) callback when building + 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(:stub) callback when stubbing + runs child callback after parent callback + +associations + when accidentally using an implicit delcaration for the factory + raises an error about the trait not being registered + +defining a child factory before a parent + creates admin factories correctly + trait indifferent access - when trait is defined as a symbol - 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 when trait is defined as struct + can be invoked with a string can be invoked with a struct + when trait is defined as a symbol can be invoked with a string - when trait is defined as a string 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 -attribute overrides - with an admin posting - secure - is expected to eq false - with a non-admin posting - secure - is expected to be nil - with no user posting - secure - is expected to be nil +skipping the default create + doesn't execute anything when creating the instance -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 +multiple creates and transient attributes to dynamically build attribute lists + generates the correct number of posts + allows the number of posts to be modified -create multiple instances - without default attributes - creates all the posts - uses the default factory values - length - is expected to eq 2 +nested factories with different parents + honors :parent over the factory block nesting + +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" + +when a self-referential trait is defined + raises a TraitDefinitionError + raises a TraitDefinitionError + +a created instance, specifying strategy: :build + saves associations (strategy: :build only affects build, not create) sequences are evaluated in the correct context + invokes the correct method on the instance invokes a method with no arguments on the instance - allows direct reference of a method in a sequence builds a sequence calling sprintf correctly - invokes the correct method on the instance + allows direct reference of a method in a sequence -using ActiveSupport::Instrumentation to track factory interaction - tracks proper time of creating the record - builds the correct payload +defaulting `updated_at` + behaves the same as a non-stubbed updated_at + is doesn't mark the object as changed + defaults updated_at for objects with updated_at + allows overriding updated_at for objects with updated_at + doesn't add updated_at to objects who don't have the method + doesn't allow setting updated_at on an object that doesn't define it + allows assignment of updated_at + +assigning overrides that are also private methods on object + y + is expected to eq 12345 + more_format + is expected to eq "format: Great" + some_funky_method + is expected to eq "foobar!" + format + is expected to eq "Great" + +finding factories keyed by class instead of symbol + doesn't find the factory + +reload + does not reset the value of use_parent_strategy + +calling `build_stubbed` with a block + passes the stub instance + returns the stub instance + +build multiple instances + with default attributes + overrides the default values + 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 + +defaulting `id` + allows overriding id sequences - generates sequential numbers if no block is given generates several values in the correct format + generates aliases for the sequence that reference the same block and retains value + generates sequential numbers if no block is given generates aliases for the sequence that reference the same block generates few values of the sequence - generates aliases for the sequence that reference the same block and retains value -transient sequences - increments sequences correctly +an instance generated by a factory + registers the user factory a stubbed instance - acts as if it came from the database assigns associations and acts as if it is saved + acts as if it came from the database -calling `build` with a block - passes the built instance - returns the built instance +an instance generated by a factory that inherits from another factory + the child class redefining parent's attributes + is expected to be a kind of User(id: integer, name: string, admin: boolean, email: string, upper_email: string, login: string) + is expected to be admin + login + is expected to eq "admin@example.com" + upper_email + is expected to eq "ADMIN@EXAMPLE.COM" + email + is expected to eq "admin@example.com" + name + is expected to eq "admin" + the parent class + is expected not to be admin + login + is expected to eq "john@example.com" + email + is expected to eq "john@example.com" + name + is expected to eq "John" -defining a child factory before a parent - creates admin factories correctly +association assignment from nested attributes + assigns the correct amount of comments when overridden + assigns the correct amount of comments -associations - when accidentally using an implicit delcaration for the factory - raises an error about the trait not being registered +including FactoryBot::Syntax::Methods when custom strategies have been declared + allows adding additional strategies + +initialize_with non-ORM-backed objects + allows for overrides + generates random data traits added via strategy - adding traits in build_list - builds all the records - length - is expected to eq 2 adding traits in create_list creates all the records length is expected to eq 2 adding traits in create doesn't modify the user factory - name - is expected to eq "JOE" admin is expected to equal true - adding traits in build_stubbed name - is expected to eq "Jack" + is expected to eq "JOE" + adding traits in build + name + is expected to eq "Joe" admin is expected to equal true adding traits in attributes_for - [:admin] - is expected to equal true [:name] is expected to eq "John" - adding traits in build + [:admin] + is expected to equal true + adding traits in build_stubbed admin is expected to equal true name - is expected to eq "Joe" + is expected to eq "Jack" + adding traits in build_list + builds all the records + length + is expected to eq 2 + +transient attributes + returning attributes for a factory + is expected not to have key :upcased + is expected to have key :email + is expected not to have key :rockstar + is expected to have key :name + is expected not to have key :four + without transient variables assigned + uses the default value of the attribute + 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 + +assigning values from a transient attribute + does not ignore an _id attribute that is an alias for a transient attribute + +initialize_with doesn't duplicate assignment on attributes accessed from initialize_with + instantiates the correct object + +traits with to_create + gives base traits lower priority than overrides + gives additional traits higher priority than base traits and factory definition + can apply to_create from traits + gives base traits normal priority + gives additional traits higher priority than to_create from the definition + can apply to_create from the definition + +traits and dynamic attributes that are applied simultaneously + combined + is expected to eq "John " + name + is expected to eq "John" + email + is expected to eq "John@example.com" + +binding a callback to multiple callbacks + binds the callback to stubbing + does not bind the callback to building + binds the callback to creation initialize_with has access to all attributes for construction assigns attributes correctly @@ -2396,22 +2205,284 @@ initialize_with implicit constructor instantiates the correct object -looking up traits that don't exist - raises a KeyError +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 -nested factories with different parents - honors :parent over the factory block nesting +calling `create` with a block + returns the created instance + passes the created instance + +initialize_with for a constructor that requires a block + executes the block correctly + +initialize_with with an 'attributes' attribute + assigns attributes correctly + +register custom strategies + allows overriding default strategies + allows using the *_list method to build a list using a custom strategy + allows using the *_pair method to build a list using a custom strategy + allows adding additional strategies + +applying inline traits + applies traits only to the instance generated for that call + +inline traits overriding existing attributes + prefers inline traits over attributes on factories + prefers overridden attributes over attributes from traits, inline traits, or attributes on factories + prefers traits on a factory over default attributes + prefers inline trait attributes over default attributes + returns the default status + prefers attributes on factories over attributes from non-inline traits + prefers inline trait attributes over traits on a factory + +associations overriding :strategy + uses the overridden create strategy to create the association + +global callbacks + triggers after build callbacks for all factories + +FactoryBot.rewind_sequences + resets all sequences back to their starting values + resets inline sequences back to their starting value + allows setting sequences within identically named traits + does not collide with globally registered factories + still allows global sequences prefixed with a factory name + +a stubbed instance overriding strategy + assigns associations and acts as if it is saved + acts as if it is saved in the database + +attribute overrides + with an admin posting + secure + is expected to eq false + with no user posting + secure + is expected to be nil + with a non-admin posting + secure + is expected to be nil + +a generated attributes hash + assigns a lazy, dependent attribute + doesn't assign associations + assigns a default value + assigns an overridden value + +initialize_with with FG attributes that are transient + name + is expected to eq "Handsome Chap from .construct" + +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 + +setting private attributes + raises a NoMethodError + +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" + +global initialize_with + handles child initialize_with + handles inline trait override + handles child initialize_with with trait + uses initialize_with globally across FactoryBot.define + handles base initialize_with + +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 + +implicit traits containing callbacks + only runs the callback once + +initialize_with parent and child factories + uses the parent's constructor when the child factory doesn't assign it + allows child factories to override initialize_with syntax methods within dynamic attributes can access syntax methods from dynamic attributes - allows syntax methods to be used when the block has an arity of 1 - can access methods already existing on the class can access syntax methods from dynamic attributes + can access methods already existing on the class + allows syntax methods to be used when the block has an arity of 1 + +looking up traits that don't exist + raises a KeyError + +initialize_with with non-FG attributes + age + is expected to eq 21 + name + is expected to eq "John Doe" + +FactoryBot.lint + raises when a factory is invalid + 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 + trait validation + enabled + does not raise if a trait produces a valid object + raises if a trait produces an invalid object + disabled + does not raises if a trait produces an invalid object + verbose linting + prints the backtrace for each factory error + +a stubbed instance with no primary key + behaves like a persisted record + builds a stubbed instance + +a created instance + assigns and saves associations + is expected not to be new record + +a custom create passing in an evaluator + passes the evaluator to the custom create block + +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 + +defining methods inside FactoryBot + raises with a meaningful message + +transient sequences + increments sequences correctly + +a generated stub instance + isn't a new record + assigns associations that aren't new records + assigns an overridden attribute + disables increment! + allows increment + assigns a default attribute + disables destroy + allows decrement + generates unique ids + allows toggle + isn't changed + disables decrement! + has an id + disables reload + assigns associations + disables connection + disables update_attribute + disables save + disables toggle! + +calling `attributes_for` with a block + returns the hash of attributes + passes the hash of attributes + +global skip_create + honors overridden to_create + honors inline trait to_create + does not persist any record + does not persist child records + +an instance generated by a factory with multiple traits + the child with multiple traits and overridden attributes + is expected to be admin + gender + is expected to be nil + name + is expected to eq "Jill" + factory 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 parent class + is expected not to be admin + name + is expected to eq "John" + gender + is expected to be nil + the child class with one trait + is expected 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 + name + is expected to eq "Jane" + gender + is expected to eq "Female" + factory outside of scope + raises an error + the child with multiple traits who override the same attribute + 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 + name + is expected to eq "Jane" + gender + is expected to eq "Female" + child factory created where trait attributes are inherited + gender + is expected to eq "Male" + date_of_birth + is expected to eq Sat, 01 Jan 2000 + factory using global trait + name + is expected to eq "Bill" + email + is expected to eq "Bill@example.com" + the child with multiple traits + is expected 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 + gender + is expected to eq "Female" + name + is expected to eq "Judy" + child factory using grandparents' trait + great + is expected to eq "GREAT!!!" + factory with trait defined multiple times + child factory redefining trait + great + is expected to eq "EVEN GREATER!!!" + great + is expected to eq "GREAT!!!" -Finished in 9.45 seconds (files took 1.58 seconds to load) +Finished in 8.06 seconds (files took 1.52 seconds to load) 343 examples, 0 failures -Randomized with seed 59820 +Randomized with seed 15422 ┌──────────────────────────────────────────────────────────────────────────────┐ @@ -2471,12 +2542,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/23607/tmp/hooks/B01_cleanup starting +I: user script /srv/workspace/pbuilder/23607/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/11797 and its subdirectories -I: Current time: Thu Jul 8 07:16:56 -12 2021 -I: pbuilder-time-stamp: 1625771816 +I: removing directory /srv/workspace/pbuilder/23607 and its subdirectories +I: Current time: Thu Aug 11 15:41:08 +14 2022 +I: pbuilder-time-stamp: 1660182068