Diff of the two buildlogs: -- --- b1/build.log 2023-06-10 07:59:12.436612568 +0000 +++ b2/build.log 2023-06-10 08:03:52.864349096 +0000 @@ -1,6 +1,6 @@ I: pbuilder: network access will be disabled during build -I: Current time: Fri Jun 9 19:55:31 -12 2023 -I: pbuilder-time-stamp: 1686383731 +I: Current time: Sat Jun 10 21:59:21 +14 2023 +I: pbuilder-time-stamp: 1686383962 I: Building the build Environment I: extracting base tarball [/var/cache/pbuilder/bookworm-reproducible-base.tgz] I: copying local configuration @@ -16,7 +16,7 @@ I: copying [./ruby-factory-bot_6.2.1.orig.tar.gz] I: copying [./ruby-factory-bot_6.2.1-1.debian.tar.xz] I: Extracting source -gpgv: Signature made Sat Oct 22 04:14:52 2022 -12 +gpgv: Signature made Sun Oct 23 06:14:52 2022 +14 gpgv: using EDDSA key C47EBFCC4E57E9FC32CA3400461BEE5D240A9E91 gpgv: Can't check signature: No public key dpkg-source: warning: cannot verify inline signature for ./ruby-factory-bot_6.2.1-1.dsc: no acceptable signature found @@ -29,135 +29,167 @@ 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/20597/tmp/hooks/D02_print_environment starting +I: user script /srv/workspace/pbuilder/17777/tmp/hooks/D01_modify_environment starting +debug: Running on jtx1a. +I: Changing host+domainname to test build reproducibility +I: Adding a custom variable just for the fun of it... +I: Changing /bin/sh to bash +'/bin/sh' -> '/bin/bash' +lrwxrwxrwx 1 root root 9 Jun 10 22:00 /bin/sh -> /bin/bash +I: Setting pbuilder2's login shell to /bin/bash +I: Setting pbuilder2's GECOS to second user,second room,second work-phone,second home-phone,second other +I: user script /srv/workspace/pbuilder/17777/tmp/hooks/D01_modify_environment finished +I: user script /srv/workspace/pbuilder/17777/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='armhf' - DEBIAN_FRONTEND='noninteractive' - DEB_BUILD_OPTIONS='buildinfo=+all reproducible=+all parallel=3 ' - DISTRIBUTION='bookworm' - HOME='/root' - HOST_ARCH='armhf' + BASH=/bin/sh + BASHOPTS=checkwinsize:cmdhist:complete_fullquote:extquote:force_fignore:globasciiranges:globskipdots:hostcomplete:interactive_comments:patsub_replacement:progcomp:promptvars:sourcepath + BASH_ALIASES=() + BASH_ARGC=() + BASH_ARGV=() + BASH_CMDS=() + BASH_LINENO=([0]="12" [1]="0") + BASH_LOADABLES_PATH=/usr/local/lib/bash:/usr/lib/bash:/opt/local/lib/bash:/usr/pkg/lib/bash:/opt/pkg/lib/bash:. + BASH_SOURCE=([0]="/tmp/hooks/D02_print_environment" [1]="/tmp/hooks/D02_print_environment") + BASH_VERSINFO=([0]="5" [1]="2" [2]="15" [3]="1" [4]="release" [5]="arm-unknown-linux-gnueabihf") + BASH_VERSION='5.2.15(1)-release' + BUILDDIR=/build + BUILDUSERGECOS='second user,second room,second work-phone,second home-phone,second other' + BUILDUSERNAME=pbuilder2 + BUILD_ARCH=armhf + DEBIAN_FRONTEND=noninteractive + DEB_BUILD_OPTIONS='buildinfo=+all reproducible=+all parallel=4 ' + DIRSTACK=() + DISTRIBUTION=bookworm + EUID=0 + FUNCNAME=([0]="Echo" [1]="main") + GROUPS=() + HOME=/root + HOSTNAME=i-capture-the-hostname + HOSTTYPE=arm + HOST_ARCH=armhf IFS=' ' - INVOCATION_ID='7cad1fe692614d74874193b1f0470d5d' - 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='20597' - PS1='# ' - PS2='> ' + INVOCATION_ID=9f899ec39cea4eadb996c2f793b9596b + LANG=C + LANGUAGE=it_CH:it + LC_ALL=C + MACHTYPE=arm-unknown-linux-gnueabihf + MAIL=/var/mail/root + OPTERR=1 + OPTIND=1 + OSTYPE=linux-gnueabihf + 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=17777 PS4='+ ' - PWD='/' - SHELL='/bin/bash' - SHLVL='2' - SUDO_COMMAND='/usr/bin/timeout -k 18.1h 18h /usr/bin/ionice -c 3 /usr/bin/nice /usr/sbin/pbuilder --build --configfile /srv/reproducible-results/rbuild-debian/r-b-build.ojnBVtbY/pbuilderrc_d0X9 --distribution bookworm --hookdir /etc/pbuilder/first-build-hooks --debbuildopts -b --basetgz /var/cache/pbuilder/bookworm-reproducible-base.tgz --buildresult /srv/reproducible-results/rbuild-debian/r-b-build.ojnBVtbY/b1 --logfile b1/build.log ruby-factory-bot_6.2.1-1.dsc' - SUDO_GID='113' - SUDO_UID='107' - SUDO_USER='jenkins' - TERM='unknown' - TZ='/usr/share/zoneinfo/Etc/GMT+12' - USER='root' - _='/usr/bin/systemd-run' - http_proxy='http://10.0.0.15:3142/' + PWD=/ + SHELL=/bin/bash + SHELLOPTS=braceexpand:errexit:hashall:interactive-comments:posix + SHLVL=3 + SUDO_COMMAND='/usr/bin/timeout -k 24.1h 24h /usr/bin/ionice -c 3 /usr/bin/nice -n 11 /usr/bin/unshare --uts -- /usr/sbin/pbuilder --build --configfile /srv/reproducible-results/rbuild-debian/r-b-build.ojnBVtbY/pbuilderrc_670f --distribution bookworm --hookdir /etc/pbuilder/rebuild-hooks --debbuildopts -b --basetgz /var/cache/pbuilder/bookworm-reproducible-base.tgz --buildresult /srv/reproducible-results/rbuild-debian/r-b-build.ojnBVtbY/b2 --logfile b2/build.log --extrapackages usrmerge ruby-factory-bot_6.2.1-1.dsc' + SUDO_GID=114 + SUDO_UID=108 + SUDO_USER=jenkins + TERM=unknown + TZ=/usr/share/zoneinfo/Etc/GMT-14 + UID=0 + USER=root + _='I: set' + http_proxy=http://10.0.0.15:3142/ I: uname -a - Linux virt32a 5.10.0-23-armmp-lpae #1 SMP Debian 5.10.179-1 (2023-05-12) armv7l GNU/Linux + Linux i-capture-the-hostname 5.10.0-23-arm64 #1 SMP Debian 5.10.179-1 (2023-05-12) aarch64 GNU/Linux I: ls -l /bin total 5072 - -rwxr-xr-x 1 root root 838488 Apr 23 09:24 bash - -rwxr-xr-x 3 root root 67144 Sep 18 2022 bunzip2 - -rwxr-xr-x 3 root root 67144 Sep 18 2022 bzcat - lrwxrwxrwx 1 root root 6 Sep 18 2022 bzcmp -> bzdiff - -rwxr-xr-x 1 root root 2225 Sep 18 2022 bzdiff - lrwxrwxrwx 1 root root 6 Sep 18 2022 bzegrep -> bzgrep - -rwxr-xr-x 1 root root 4893 Nov 27 2021 bzexe - lrwxrwxrwx 1 root root 6 Sep 18 2022 bzfgrep -> bzgrep - -rwxr-xr-x 1 root root 3775 Sep 18 2022 bzgrep - -rwxr-xr-x 3 root root 67144 Sep 18 2022 bzip2 - -rwxr-xr-x 1 root root 67112 Sep 18 2022 bzip2recover - lrwxrwxrwx 1 root root 6 Sep 18 2022 bzless -> bzmore - -rwxr-xr-x 1 root root 1297 Sep 18 2022 bzmore - -rwxr-xr-x 1 root root 67632 Sep 20 2022 cat - -rwxr-xr-x 1 root root 67676 Sep 20 2022 chgrp - -rwxr-xr-x 1 root root 67644 Sep 20 2022 chmod - -rwxr-xr-x 1 root root 67684 Sep 20 2022 chown - -rwxr-xr-x 1 root root 133532 Sep 20 2022 cp - -rwxr-xr-x 1 root root 132868 Jan 5 01:20 dash - -rwxr-xr-x 1 root root 133220 Sep 20 2022 date - -rwxr-xr-x 1 root root 67732 Sep 20 2022 dd - -rwxr-xr-x 1 root root 68104 Sep 20 2022 df - -rwxr-xr-x 1 root root 133632 Sep 20 2022 dir - -rwxr-xr-x 1 root root 59128 Mar 22 21:02 dmesg - lrwxrwxrwx 1 root root 8 Dec 19 01:33 dnsdomainname -> hostname - lrwxrwxrwx 1 root root 8 Dec 19 01:33 domainname -> hostname - -rwxr-xr-x 1 root root 67560 Sep 20 2022 echo - -rwxr-xr-x 1 root root 41 Jan 24 02:43 egrep - -rwxr-xr-x 1 root root 67548 Sep 20 2022 false - -rwxr-xr-x 1 root root 41 Jan 24 02:43 fgrep - -rwxr-xr-x 1 root root 55748 Mar 22 21:02 findmnt - -rwsr-xr-x 1 root root 26208 Mar 22 20:15 fusermount - -rwxr-xr-x 1 root root 128608 Jan 24 02:43 grep - -rwxr-xr-x 2 root root 2346 Apr 9 2022 gunzip - -rwxr-xr-x 1 root root 6447 Apr 9 2022 gzexe - -rwxr-xr-x 1 root root 64220 Apr 9 2022 gzip - -rwxr-xr-x 1 root root 67032 Dec 19 01:33 hostname - -rwxr-xr-x 1 root root 67720 Sep 20 2022 ln - -rwxr-xr-x 1 root root 35132 Mar 22 21:51 login - -rwxr-xr-x 1 root root 133632 Sep 20 2022 ls - -rwxr-xr-x 1 root root 136808 Mar 22 21:02 lsblk - -rwxr-xr-x 1 root root 67800 Sep 20 2022 mkdir - -rwxr-xr-x 1 root root 67764 Sep 20 2022 mknod - -rwxr-xr-x 1 root root 67596 Sep 20 2022 mktemp - -rwxr-xr-x 1 root root 38504 Mar 22 21:02 more - -rwsr-xr-x 1 root root 38496 Mar 22 21:02 mount - -rwxr-xr-x 1 root root 9824 Mar 22 21:02 mountpoint - -rwxr-xr-x 1 root root 133532 Sep 20 2022 mv - lrwxrwxrwx 1 root root 8 Dec 19 01:33 nisdomainname -> hostname - lrwxrwxrwx 1 root root 14 Apr 2 18:25 pidof -> /sbin/killall5 - -rwxr-xr-x 1 root root 67608 Sep 20 2022 pwd - lrwxrwxrwx 1 root root 4 Apr 23 09:24 rbash -> bash - -rwxr-xr-x 1 root root 67600 Sep 20 2022 readlink - -rwxr-xr-x 1 root root 67672 Sep 20 2022 rm - -rwxr-xr-x 1 root root 67600 Sep 20 2022 rmdir - -rwxr-xr-x 1 root root 67400 Nov 2 2022 run-parts - -rwxr-xr-x 1 root root 133372 Jan 5 07:55 sed - lrwxrwxrwx 1 root root 4 Jan 5 01:20 sh -> dash - -rwxr-xr-x 1 root root 67584 Sep 20 2022 sleep - -rwxr-xr-x 1 root root 67644 Sep 20 2022 stty - -rwsr-xr-x 1 root root 50800 Mar 22 21:02 su - -rwxr-xr-x 1 root root 67584 Sep 20 2022 sync - -rwxr-xr-x 1 root root 336764 Apr 6 02:25 tar - -rwxr-xr-x 1 root root 67144 Nov 2 2022 tempfile - -rwxr-xr-x 1 root root 133224 Sep 20 2022 touch - -rwxr-xr-x 1 root root 67548 Sep 20 2022 true - -rwxr-xr-x 1 root root 9768 Mar 22 20:15 ulockmgr_server - -rwsr-xr-x 1 root root 22108 Mar 22 21:02 umount - -rwxr-xr-x 1 root root 67572 Sep 20 2022 uname - -rwxr-xr-x 2 root root 2346 Apr 9 2022 uncompress - -rwxr-xr-x 1 root root 133632 Sep 20 2022 vdir - -rwxr-xr-x 1 root root 42608 Mar 22 21:02 wdctl - lrwxrwxrwx 1 root root 8 Dec 19 01:33 ypdomainname -> hostname - -rwxr-xr-x 1 root root 1984 Apr 9 2022 zcat - -rwxr-xr-x 1 root root 1678 Apr 9 2022 zcmp - -rwxr-xr-x 1 root root 6460 Apr 9 2022 zdiff - -rwxr-xr-x 1 root root 29 Apr 9 2022 zegrep - -rwxr-xr-x 1 root root 29 Apr 9 2022 zfgrep - -rwxr-xr-x 1 root root 2081 Apr 9 2022 zforce - -rwxr-xr-x 1 root root 8103 Apr 9 2022 zgrep - -rwxr-xr-x 1 root root 2206 Apr 9 2022 zless - -rwxr-xr-x 1 root root 1842 Apr 9 2022 zmore - -rwxr-xr-x 1 root root 4577 Apr 9 2022 znew -I: user script /srv/workspace/pbuilder/20597/tmp/hooks/D02_print_environment finished + -rwxr-xr-x 1 root root 838488 Apr 24 11:24 bash + -rwxr-xr-x 3 root root 67144 Sep 19 2022 bunzip2 + -rwxr-xr-x 3 root root 67144 Sep 19 2022 bzcat + lrwxrwxrwx 1 root root 6 Sep 19 2022 bzcmp -> bzdiff + -rwxr-xr-x 1 root root 2225 Sep 19 2022 bzdiff + lrwxrwxrwx 1 root root 6 Sep 19 2022 bzegrep -> bzgrep + -rwxr-xr-x 1 root root 4893 Nov 28 2021 bzexe + lrwxrwxrwx 1 root root 6 Sep 19 2022 bzfgrep -> bzgrep + -rwxr-xr-x 1 root root 3775 Sep 19 2022 bzgrep + -rwxr-xr-x 3 root root 67144 Sep 19 2022 bzip2 + -rwxr-xr-x 1 root root 67112 Sep 19 2022 bzip2recover + lrwxrwxrwx 1 root root 6 Sep 19 2022 bzless -> bzmore + -rwxr-xr-x 1 root root 1297 Sep 19 2022 bzmore + -rwxr-xr-x 1 root root 67632 Sep 21 2022 cat + -rwxr-xr-x 1 root root 67676 Sep 21 2022 chgrp + -rwxr-xr-x 1 root root 67644 Sep 21 2022 chmod + -rwxr-xr-x 1 root root 67684 Sep 21 2022 chown + -rwxr-xr-x 1 root root 133532 Sep 21 2022 cp + -rwxr-xr-x 1 root root 132868 Jan 6 03:20 dash + -rwxr-xr-x 1 root root 133220 Sep 21 2022 date + -rwxr-xr-x 1 root root 67732 Sep 21 2022 dd + -rwxr-xr-x 1 root root 68104 Sep 21 2022 df + -rwxr-xr-x 1 root root 133632 Sep 21 2022 dir + -rwxr-xr-x 1 root root 59128 Mar 23 23:02 dmesg + lrwxrwxrwx 1 root root 8 Dec 20 03:33 dnsdomainname -> hostname + lrwxrwxrwx 1 root root 8 Dec 20 03:33 domainname -> hostname + -rwxr-xr-x 1 root root 67560 Sep 21 2022 echo + -rwxr-xr-x 1 root root 41 Jan 25 04:43 egrep + -rwxr-xr-x 1 root root 67548 Sep 21 2022 false + -rwxr-xr-x 1 root root 41 Jan 25 04:43 fgrep + -rwxr-xr-x 1 root root 55748 Mar 23 23:02 findmnt + -rwsr-xr-x 1 root root 26208 Mar 23 22:15 fusermount + -rwxr-xr-x 1 root root 128608 Jan 25 04:43 grep + -rwxr-xr-x 2 root root 2346 Apr 10 2022 gunzip + -rwxr-xr-x 1 root root 6447 Apr 10 2022 gzexe + -rwxr-xr-x 1 root root 64220 Apr 10 2022 gzip + -rwxr-xr-x 1 root root 67032 Dec 20 03:33 hostname + -rwxr-xr-x 1 root root 67720 Sep 21 2022 ln + -rwxr-xr-x 1 root root 35132 Mar 23 23:51 login + -rwxr-xr-x 1 root root 133632 Sep 21 2022 ls + -rwxr-xr-x 1 root root 136808 Mar 23 23:02 lsblk + -rwxr-xr-x 1 root root 67800 Sep 21 2022 mkdir + -rwxr-xr-x 1 root root 67764 Sep 21 2022 mknod + -rwxr-xr-x 1 root root 67596 Sep 21 2022 mktemp + -rwxr-xr-x 1 root root 38504 Mar 23 23:02 more + -rwsr-xr-x 1 root root 38496 Mar 23 23:02 mount + -rwxr-xr-x 1 root root 9824 Mar 23 23:02 mountpoint + -rwxr-xr-x 1 root root 133532 Sep 21 2022 mv + lrwxrwxrwx 1 root root 8 Dec 20 03:33 nisdomainname -> hostname + lrwxrwxrwx 1 root root 14 Apr 3 20:25 pidof -> /sbin/killall5 + -rwxr-xr-x 1 root root 67608 Sep 21 2022 pwd + lrwxrwxrwx 1 root root 4 Apr 24 11:24 rbash -> bash + -rwxr-xr-x 1 root root 67600 Sep 21 2022 readlink + -rwxr-xr-x 1 root root 67672 Sep 21 2022 rm + -rwxr-xr-x 1 root root 67600 Sep 21 2022 rmdir + -rwxr-xr-x 1 root root 67400 Nov 3 2022 run-parts + -rwxr-xr-x 1 root root 133372 Jan 6 09:55 sed + lrwxrwxrwx 1 root root 9 Jun 10 22:00 sh -> /bin/bash + -rwxr-xr-x 1 root root 67584 Sep 21 2022 sleep + -rwxr-xr-x 1 root root 67644 Sep 21 2022 stty + -rwsr-xr-x 1 root root 50800 Mar 23 23:02 su + -rwxr-xr-x 1 root root 67584 Sep 21 2022 sync + -rwxr-xr-x 1 root root 336764 Apr 7 04:25 tar + -rwxr-xr-x 1 root root 67144 Nov 3 2022 tempfile + -rwxr-xr-x 1 root root 133224 Sep 21 2022 touch + -rwxr-xr-x 1 root root 67548 Sep 21 2022 true + -rwxr-xr-x 1 root root 9768 Mar 23 22:15 ulockmgr_server + -rwsr-xr-x 1 root root 22108 Mar 23 23:02 umount + -rwxr-xr-x 1 root root 67572 Sep 21 2022 uname + -rwxr-xr-x 2 root root 2346 Apr 10 2022 uncompress + -rwxr-xr-x 1 root root 133632 Sep 21 2022 vdir + -rwxr-xr-x 1 root root 42608 Mar 23 23:02 wdctl + lrwxrwxrwx 1 root root 8 Dec 20 03:33 ypdomainname -> hostname + -rwxr-xr-x 1 root root 1984 Apr 10 2022 zcat + -rwxr-xr-x 1 root root 1678 Apr 10 2022 zcmp + -rwxr-xr-x 1 root root 6460 Apr 10 2022 zdiff + -rwxr-xr-x 1 root root 29 Apr 10 2022 zegrep + -rwxr-xr-x 1 root root 29 Apr 10 2022 zfgrep + -rwxr-xr-x 1 root root 2081 Apr 10 2022 zforce + -rwxr-xr-x 1 root root 8103 Apr 10 2022 zgrep + -rwxr-xr-x 1 root root 2206 Apr 10 2022 zless + -rwxr-xr-x 1 root root 1842 Apr 10 2022 zmore + -rwxr-xr-x 1 root root 4577 Apr 10 2022 znew +I: user script /srv/workspace/pbuilder/17777/tmp/hooks/D02_print_environment finished -> Attempting to satisfy build-dependencies -> Creating pbuilder-satisfydepends-dummy package Package: pbuilder-satisfydepends-dummy @@ -350,7 +382,7 @@ Get: 139 http://deb.debian.org/debian bookworm/main armhf ruby-rspec-its all 1.3.0-1 [6864 B] Get: 140 http://deb.debian.org/debian bookworm/main armhf ruby-sqlite3 armhf 1.4.2-4+b3 [40.4 kB] Get: 141 http://deb.debian.org/debian bookworm/main armhf ruby-timecop all 0.9.6-1 [10.3 kB] -Fetched 45.7 MB in 2s (29.6 MB/s) +Fetched 45.7 MB in 2s (26.4 MB/s) debconf: delaying package configuration, since apt-utils is not installed Selecting previously unselected package libpython3.11-minimal:armhf. (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 ... 19324 files and directories currently installed.) @@ -937,8 +969,19 @@ Writing extended state information... Building tag database... -> Finished parsing the build-deps +Reading package lists... +Building dependency tree... +Reading state information... +usrmerge is already the newest version (35). +0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded. I: Building the package -I: Running cd /build/ruby-factory-bot-6.2.1/ && env PATH="/usr/sbin:/usr/bin:/sbin:/bin:/usr/games" HOME="/nonexistent/first-build" dpkg-buildpackage -us -uc -b && env PATH="/usr/sbin:/usr/bin:/sbin:/bin:/usr/games" HOME="/nonexistent/first-build" dpkg-genchanges -S > ../ruby-factory-bot_6.2.1-1_source.changes +I: user script /srv/workspace/pbuilder/17777/tmp/hooks/A99_set_merged_usr starting +Re-configuring usrmerge... +removed '/etc/unsupported-skip-usrmerge-conversion' +The system has been successfully converted. +I: user script /srv/workspace/pbuilder/17777/tmp/hooks/A99_set_merged_usr finished +hostname: Name or service not known +I: Running cd /build/ruby-factory-bot-6.2.1/ && env PATH="/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/i/capture/the/path" HOME="/nonexistent/second-build" dpkg-buildpackage -us -uc -b && env PATH="/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/i/capture/the/path" HOME="/nonexistent/second-build" dpkg-genchanges -S > ../ruby-factory-bot_6.2.1-1_source.changes dpkg-buildpackage: info: source package ruby-factory-bot dpkg-buildpackage: info: source version 6.2.1-1 dpkg-buildpackage: info: source distribution unstable @@ -967,7 +1010,7 @@ dh_prep -O--buildsystem=ruby dh_auto_install --destdir=debian/ruby-factory-bot/ -O--buildsystem=ruby dh_ruby --install /build/ruby-factory-bot-6.2.1/debian/ruby-factory-bot -/usr/bin/ruby3.1 -S gem build --config-file /dev/null --verbose /tmp/d20230609-26746-r02dqf/gemspec +/usr/bin/ruby3.1 -S gem build --config-file /dev/null --verbose /tmp/d20230610-32693-zdq0ax/gemspec Failed to load /dev/null because it doesn't contain valid YAML hash WARNING: open-ended dependency on activesupport (>= 5.0.0) is not recommended if activesupport is semantically versioned, use: @@ -997,7 +1040,7 @@ Name: factory_bot Version: 6.2.1 File: factory_bot-6.2.1.gem -/usr/bin/ruby3.1 -S gem install --config-file /dev/null --verbose --local --verbose --no-document --ignore-dependencies --install-dir debian/ruby-factory-bot/usr/share/rubygems-integration/all /tmp/d20230609-26746-r02dqf/factory_bot-6.2.1.gem +/usr/bin/ruby3.1 -S gem install --config-file /dev/null --verbose --local --verbose --no-document --ignore-dependencies --install-dir debian/ruby-factory-bot/usr/share/rubygems-integration/all /tmp/d20230610-32693-zdq0ax/factory_bot-6.2.1.gem Failed to load /dev/null because it doesn't contain valid YAML hash /build/ruby-factory-bot-6.2.1/debian/ruby-factory-bot/usr/share/rubygems-integration/all/gems/factory_bot-6.2.1/lib/factory_bot.rb /build/ruby-factory-bot-6.2.1/debian/ruby-factory-bot/usr/share/rubygems-integration/all/gems/factory_bot-6.2.1/lib/factory_bot/aliases.rb @@ -1082,35 +1125,202 @@ mv Gemfile.lock ./.gem2deb.Gemfile.lock /usr/bin/ruby3.1 -I/usr/share/rubygems-integration/all/gems/rspec-support-3.12.0/lib:/usr/share/rubygems-integration/all/gems/rspec-core-3.12.0/lib /usr/share/rubygems-integration/all/gems/rspec-core-3.12.0/exe/rspec --pattern spec/\{\*_spec.rb,factory_bot/\*\*/\*_spec.rb\} --format documentation -Randomized with seed 54234 +Randomized with seed 49576 -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::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 returning its block-level variable + returns self when executing the proc + name + is expected to eq :first_name + with a block referencing an attribute on the attribute + evaluates the attribute from the attribute -FactoryBot::AttributeList#associations - returns associations +FactoryBot::DefinitionProxy#add_attribute + declares a dynamic attribute on the factory when the proxy ignores attributes + declares a dynamic attribute on the factory when the proxy respects attributes -FactoryBot::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::Factory when defined with a custom class name + has a build_class equal to its custom class name -FactoryBot::Factory with a string for a name +FactoryBot::NullObject + does not respond to other methods + responds to the given methods + +FactoryBot after defining an alias + the list of aliases should include a variant with no suffix at all, and one with an '_id' suffix + +FactoryBot::Sequence + a custom scope increments within the correct scope after rewinding + a custom sequence and scope increments within the correct scope when incrementing + a custom sequence and scope increments within the correct scope + iterating over items in an enumerator + navigates to the next items until no items remain + behaves like a sequence + has a next value equal to its first value + has a next value equal to the 2nd value after being incremented + has a next value equal to the 1st value after rewinding + a basic sequence + names + is expected to eq [:test] + behaves like a sequence + has a next value equal to the 1st value after rewinding + has a next value equal to its first value + has a next value equal to the 2nd value after being incremented + name + is expected to eq :test + a custom sequence + behaves like a sequence + has a next value equal to the 1st value after rewinding + has a next value equal to its first value + has a next value equal to the 2nd value after being incremented + a custom sequence without a block + behaves like a sequence + has a next value equal to its first value + has a next value equal to the 1st value after rewinding + has a next value equal to the 2nd value after being incremented + a basic sequence without a block + behaves like a sequence + has a next value equal to the 1st value after rewinding + has a next value equal to its first value + has a next value equal to the 2nd value after being incremented + a sequence with custom value and aliases + has the expected names as its names + behaves like a sequence + has a next value equal to the 1st value after rewinding + has a next value equal to the 2nd value after being incremented + has a next value equal to its first value + a sequence with aliases using default value + has the expected names as its names + behaves like a sequence + has a next value equal to its first value + has a next value equal to the 2nd value after being incremented + has a next value equal to the 1st value after rewinding + +FactoryBot + finds a registered strategy + .use_parent_strategy + is true by default + +FactoryBot::Callback + runs its block with one parameter + runs its block with two parameters + converts strings to symbols + runs its block with no parameters has a name -FactoryBot::Factory human names - parses names without underscores - parses human names with big letters - parses names with big letters - parses human names with underscores - parses names with underscores - parses human names without underscores - parses names with aliases - parses human names with aliases +FactoryBot::AttributeList generating names + knows all its #names for #non_ignored attributes + knows all its #names for #associations + knows all its #names for #ignored attributes + knows all its #names + +FactoryBot::DefinitionProxy#to_create + accepts a block to run in place of #save! + +definition loading + 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 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 test + it should behave like finds definitions + is expected to load definitions from test/factories/subdirectory/post_factory.rb + is expected to load definitions from test/factories/subdirectory/person_factory.rb + with several factories files under 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 several factories files under test/factories in non-alphabetical order + loads the files in the right order + with nested and unnested factories files under test + 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 a factories file under spec + it should behave like finds definitions + is expected to load definitions from spec/factories.rb + with several factories files under 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 deeply nested factory files under spec + it should behave like finds definitions + is expected to load definitions from spec/factories/subdirectory/person_factory.rb + is expected to load definitions from spec/factories/subdirectory/post_factory.rb + with factories.rb + it should behave like finds definitions + is expected to load definitions from factories.rb + with a factories file under test + it should behave like finds definitions + is expected to load definitions from test/factories.rb + with a factories file under spec/factories + it should behave like finds definitions + is expected to load definitions from spec/factories/post_factory.rb + with several factories files under spec/factories in non-alphabetical order + loads the files in the right order + +FactoryBot::Factory with a name ending in s + has a build class + has a name + +FactoryBot::DefinitionProxy#trait + declares a trait + +FactoryBot::Factory when defined with a class instead of a name + has a name + has a build_class + +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::Factory + has a build class + has a factory name + guesses the build class from the factory name + creates a new factory using the class of the parent + returns associations + includes associations from the parent factory + creates a new factory while overriding the parent class + when overriding generated attributes with a hash + overrides a symbol parameter with a string parameter + returns the overridden value in the generated attributes + overriding an attribute with an alias + discards the predefined value for the attribute + uses the passed in value for the alias + +FactoryBot::Declaration::Implicit + with a known sequence + does not create an assocition attribute + creates a sequence attribute + with a known factory + has the correct factory name + creates an association attribute + #== + when the names are different + the objects are NOT equal + when one is ignored and the other isn't + the objects are NOT equal + when the attributes are equal + the objects are equal + when comparing against another type of object + the objects are NOT equal + when the factories are different + the objects are NOT equal + +FactoryBot::AttributeList#define_attribute with a named attribute list + raises when the attribute is a self-referencing association + does not raise when the attribute is not a self-referencing association FactoryBot::Strategy::AttributesFor returns the hash from the evaluation @@ -1118,486 +1328,319 @@ it should behave like strategy without association support returns nil when accessing an association -FactoryBot::Decorator::DisallowsDuplicatesRegistry - delegates #register to the registry when not registered - raises when attempting to #register a previously registered strategy +FactoryBot::Decorator::AttributeHash + #attributes + returns a hash of attributes + with an attribute called 'attributes' + does not call itself recursively + +FactoryBot::Factory with a string for a name + has a name + +FactoryBot::Declaration::Association + #== + when the names are different + the objects are NOT equal + when the attributes are equal + the objects are equal + when comparing against another type of object + the objects are NOT equal + when the options are different + the objects are NOT equal + +FactoryBot::DefinitionProxy#factory + without options + with options + with a block + +FactoryBot::Attribute + converts the name attribute to a symbol + is not an association + +FactoryBot::DefinitionProxy#method_missing + raises a NoMethodError when called with a static-attribute-like argument (PENDING: No reason given) + declares a dynamic attribute when called with a block + declares an implicit declaration when called without args or a block + declares an association when called with a ':factory' key + +FactoryBot::DefinitionProxy#initialize_with + defines the constructor on the definition FactoryBot::AttributeList#define_attribute + maintains a list of attributes raises if an attribute has already been defined returns the attribute - maintains a list of attributes -FactoryBot after defining an alias - the list of aliases should include a variant with no suffix at all, and one with an '_id' suffix +FactoryBot::AttributeList#apply_attributes + adds attributes in the order defined -FactoryBot::DefinitionProxy#initialize_with - defines the constructor on the definition +FactoryBot::DefinitionProxy#association + declares an association with options + when passing a block raises an error + declares an association -FactoryBot::Attribute::Association 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::Internal - .factory_by_name - finds a registered factory - .register_trait - returns the registered trait - registers the provided trait - .strategy_by_name - finds a registered strategy - .register_strategy - register the provided strategy name with the class + .register_factory + returns the registered factory + registers the provided factory .trait_by_name finds a previously registered trait .register_factory returns the registered factory registers the provided factory + .register_strategy + register the provided strategy name with the class + .sequence_by_name + finds a registered sequence + .register_trait + registers the provided trait + returns the registered trait + .strategy_by_name + finds a registered strategy .factory_by_name finds a registered factory .rewind_sequences rewinds the sequences and the internal sequences + .factory_by_name + finds a registered factory .register_sequence registers the provided sequence returns the registered sequence - .sequence_by_name - finds a registered sequence - .register_factory - registers the provided factory - returns the registered factory + +FactoryBot::DefinitionProxy adding callbacks + adding an :after_stub callback succeeds + adding an :after_create callback succeeds + adding both an :after_stub and an :after_create callback succeeds + adding both an :after_stub and a :before_create callback succeeds + adding both a :before_stub and a :before_create callback succeeds + adding an :after_build callback succeeds + +FactoryBot::Registry + adds and returns the object registered + knows that an object is registered by symbol + clears registered factories + raises when an object cannot be found + knows that an object is registered by string + knows when an object is not registered + is an enumerable + includes a did_you_mean message + finds a registered object + finds a registered object with square brackets + does not include duplicate objects with registered under different names + iterates registered objects + +FactoryBot::StrategyCalculator + returns the strategy found when instantiated with a symbol + returns the class passed when it is instantiated with a class + finds the strategy by name when instantiated with a symbol + +FactoryBot::Attribute::Association with a string name + name + is expected to eq :name + +FactoryBot::Attribute::Dynamic with a string name + name + is expected to eq :name FactoryBot::EvaluatorClassDefiner - adds each attribute to the evaluator returns an evaluator when accessing the evaluator class - sets attributes on the evaluator class only instance_execs the block once even when returning nil evaluates the block in the context of the evaluator + adds each attribute to the evaluator + sets attributes on the evaluator class with a custom evaluator as a parent class bases its attribute lists on itself and its parent evaluator -FactoryBot::Factory - creates a new factory using the class of the parent - has a build class - has a factory name - includes associations from the parent factory - creates a new factory while overriding the parent class - returns associations - guesses the build class from the factory name - when overriding generated attributes with a hash - overrides a symbol parameter with a string parameter - returns the overridden value in the generated attributes - overriding an attribute with an alias - discards the predefined value for the attribute - uses the passed in value for the alias - -FactoryBot aliases - for a foreign key should include both the suffixed and un-suffixed variants - for an attribute should include the original attribute and a version suffixed with '_id' - for an attribute which starts with an underscore should not include a non-underscored version - -FactoryBot::AttributeList#define_attribute with a named attribute list - raises when the attribute is a self-referencing association - does not raise when the attribute is not a self-referencing association - -FactoryBot::DefinitionProxy#factory - without options - with options - with a block +FactoryBot::Factory when defined with a custom class + is an instance of that custom class -FactoryBot::Attribute::Dynamic with a string name - name - is expected to eq :name +FactoryBot::Decorator::DisallowsDuplicatesRegistry + delegates #register to the registry when not registered + raises when attempting to #register a previously registered strategy FactoryBot::Strategy::Build - it should behave like strategy with association support - runs the factory with the correct overrides + it should behave like strategy with strategy: :build finds the factory with the correct factory name + runs the factory with the correct overrides it should behave like strategy with callbacks runs the callbacks [:after_build] with the evaluation's object returns the object from the evaluation - it should behave like strategy with strategy: :build - finds the factory with the correct factory name + it should behave like strategy with association support runs the factory with the correct overrides + finds the factory with the correct factory name + +FactoryBot::Factory human names + parses names with big letters + parses names without underscores + parses human names without underscores + parses names with aliases + parses human names with big letters + parses human names with underscores + parses names with underscores + parses human names with aliases + +FactoryBot::DefinitionProxy#transient + makes all attributes added ignored FactoryBot::Strategy::Stub it should behave like strategy with association support - runs the factory with the correct overrides finds the factory with the correct factory name + runs the factory with the correct overrides it should behave like strategy with callbacks returns the object from the evaluation runs the callbacks [:after_stub] with the evaluation's object asking for a result - is expected not to be destroyed - is expected not to be new record is expected to be persisted assigns created_at - overriding persistence method: #save! - raises an informative error if the method is called - overrides the method with any arity - overriding persistence method: #update! + is expected not to be new record + is expected not to be destroyed + overriding persistence method: #update_attribute raises an informative error if the method is called overrides the method with any arity overriding persistence method: #update_attributes! - raises an informative error if the method is called overrides the method with any arity - overriding persistence method: #reload raises an informative error if the method is called - overrides the method with any arity overriding persistence method: #update_columns raises an informative error if the method is called overrides the method with any arity - overriding persistence method: #save + overriding persistence method: #delete + 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: #decrement! overrides the method with any arity raises an informative error if the method is called - overriding persistence method: #increment! + overriding persistence method: #update_column raises an informative error if the method is called overrides the method with any arity - overriding persistence method: #connection + overriding persistence method: #reload 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 + overriding persistence method: #save! overrides the method with any arity - overriding persistence method: #update_column + 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: #delete + overriding persistence method: #toggle! + overrides the method with any arity raises an informative error if the method is called + overriding persistence method: #touch overrides the method with any arity - overriding persistence method: #destroy! + raises an informative error if the method is called + overriding persistence method: #destroy raises an informative error if the method is called overrides the method with any arity - overriding persistence method: #update + overriding persistence method: #update! + overrides the method with any arity raises an informative error if the method is called + overriding persistence method: #increment! overrides the method with any arity - overriding persistence method: #toggle! + raises an informative error if the method is called + overriding persistence method: #save raises an informative error if the method is called overrides the method with any arity overriding persistence method: #update_attributes - overrides the method with any arity raises an informative error if the method is called - overriding persistence method: #update_attribute overrides the method with any arity + overriding persistence method: #connection 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 it should behave like strategy with strategy: :build - runs the factory with the correct overrides finds the factory with the correct factory name - -definition loading - with nested and unnested factories files under spec - it should behave like finds definitions - is expected to load definitions from spec/factories/post_factory.rb - is expected to load definitions from spec/factories/person_factory.rb - is expected to load definitions from spec/factories.rb - with deeply nested factory files under 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 nested and unnested factories files under test - it should behave like finds definitions - is expected to load definitions from test/factories/post_factory.rb - is expected to load definitions from test/factories/person_factory.rb - is expected to load definitions from test/factories.rb - with several factories files under spec/factories in non-alphabetical order - loads the files in the right order - with a factories file under spec/factories - it should behave like finds definitions - is expected to load definitions from spec/factories/post_factory.rb - with a factories file under 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 factories.rb - it should behave like finds definitions - is expected to load definitions from factories.rb - with a factories file under test - it should behave like finds definitions - is expected to load definitions from test/factories.rb - with 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 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/post_factory.rb - is expected to load definitions from spec/factories/person_factory.rb - with several factories files under test/factories - it should behave like finds definitions - is expected to load definitions from test/factories/person_factory.rb - is expected to load definitions from test/factories/post_factory.rb - -FactoryBot::DefinitionProxy#trait - declares a trait + runs the factory with the correct overrides FactoryBot::Definition - maintains a list of callbacks - doesn't expose a separate create strategy when none is specified - delegates :declare_attribute to declarations - adds only unique traits - maintains a list of enum fields - has an overridable declaration list - has a name creates a new attribute list with the name passed when given a name + delegates :declare_attribute to declarations exposes a non-default create strategy when one is provided by the user maintains a list of traits - -FactoryBot::NullFactory - has a nil value for its compile attribute - has FactoryBot::Evaluator as its evaluator class - delegates defined traits to its definition - delegates attributes to its definition - has a nil value for its class_name attribute - delegates constructor to its definition - has an instance of FactoryBot::AttributeList for its attributes attribute - delegates callbacks to its definition - -FactoryBot::Attribute::Sequence - assigns the next value in the sequence - name - is expected to eq :first_name - -FactoryBot::DeclarationList#declare_attribute - appends declarations with the same name when NOT overridable - adds the declaration to the list when overridable - deletes declarations with the same name when overridable - adds the declaration to the list when not overridable - -FactoryBot::Factory when defined with a custom class - is an instance of that custom class - -FactoryBot::Factory when defined with a class instead of a name - has a build_class + adds only unique traits + maintains a list of enum fields + maintains a list of callbacks + doesn't expose a separate create strategy when none is specified has a name + has an overridable declaration list -FactoryBot::Factory running a factory - creates the right strategy using the build class when running - calls the block and returns the result - returns the result from the strategy when running - -FactoryBot::DefinitionProxy#to_create - accepts a block to run in place of #save! - -FactoryBot::AttributeList generating names - knows all its #names for #non_ignored attributes - knows all its #names for #ignored attributes - knows all its #names - knows all its #names for #associations - -FactoryBot::AttributeList#apply_attributes - adds attributes in the order defined - -FactoryBot::Declaration::Association - #== - when the attributes are equal - the objects are equal - when comparing against another type of object - the objects are NOT equal - when the names are different - the objects are NOT equal - when the options are different - the objects are NOT equal - -FactoryBot::StrategyCalculator - returns the strategy found when instantiated with a symbol - returns the class passed when it is instantiated with a class - finds the strategy by name when instantiated with a symbol - -FactoryBot - finds a registered strategy - .use_parent_strategy - is true by default - -FactoryBot::Declaration::Implicit - with a known sequence - does not create an assocition attribute - creates a sequence attribute - with a known factory - has the correct factory name - creates an association attribute +FactoryBot::Declaration::Dynamic #== when the attributes are equal the objects are equal - when the factories are different - the objects are NOT equal when the names are different the objects are NOT equal when one is ignored and the other isn't the objects are NOT equal when comparing against another type of object the objects are NOT equal + when the blocks are different + the objects are NOT equal -FactoryBot::Decorator::AttributeHash - #attributes - returns a hash of attributes - with an attribute called 'attributes' - does not call itself recursively - -FactoryBot::Factory with a name ending in s - has a name - has a build class - -FactoryBot::Sequence - a custom sequence and scope increments within the correct scope - a custom sequence and scope increments within the correct scope when incrementing - a custom scope increments within the correct scope after rewinding - a sequence with custom value and aliases - has the expected names as its names - behaves like a sequence - has a next value equal to the 2nd value after being incremented - has a next value equal to its first value - has a next value equal to the 1st value after rewinding - a basic sequence without a block - behaves like a sequence - has a next value equal to its first value - has a next value equal to the 2nd value after being incremented - has a next value equal to the 1st value after rewinding - a basic sequence - names - is expected to eq [:test] - name - is expected to eq :test - behaves like a sequence - has a next value equal to the 1st value after rewinding - has a next value equal to the 2nd value after being incremented - has a next value equal to its first value - a custom sequence without a block - behaves like a sequence - has a next value equal to the 2nd value after being incremented - has a next value equal to the 1st value after rewinding - has a next value equal to its first value - iterating over items in an enumerator - navigates to the next items until no items remain - behaves like a sequence - has a next value equal to the 2nd value after being incremented - has a next value equal to the 1st value after rewinding - has a next value equal to its first value - a custom sequence - behaves like a sequence - has a next value equal to the 2nd value after being incremented - has a next value equal to its first value - has a next value equal to the 1st value after rewinding - a sequence with aliases using default value - has the expected names as its names - behaves like a sequence - has a next value equal to the 2nd value after being incremented - has a next value equal to its first value - has a next value equal to the 1st value after rewinding - -FactoryBot::Attribute - converts the name attribute to a symbol - is not an association - -FactoryBot::DefinitionProxy#transient - makes all attributes added ignored - -FactoryBot::Factory for namespaced class - sets build_class correctly with a namespaced class with Namespace::Class syntax - sets build_class correctly with a namespaced class with namespace/class syntax - -FactoryBot::DeclarationList#attributes - defines each attribute on the attribute list - returns an AttributeList - -FactoryBot::Registry - knows that an object is registered by symbol - knows when an object is not registered - knows that an object is registered by string - does not include duplicate objects with registered under different names - is an enumerable - clears registered factories - finds a registered object - iterates registered objects - includes a did_you_mean message - raises when an object cannot be found - finds a registered object with square brackets - adds and returns the object registered +FactoryBot::NullFactory + delegates constructor to its definition + has a nil value for its compile attribute + delegates defined traits to its definition + delegates attributes to its definition + has an instance of FactoryBot::AttributeList for its attributes attribute + delegates callbacks to its definition + has FactoryBot::Evaluator as its evaluator class + has a nil value for its class_name attribute -FactoryBot::DefinitionProxy#add_attribute - declares a dynamic attribute on the factory when the proxy ignores attributes - declares a dynamic attribute on the factory when the proxy respects attributes +FactoryBot::DeclarationList#declare_attribute + deletes declarations with the same name when overridable + adds the declaration to the list when overridable + adds the declaration to the list when not overridable + appends declarations with the same name when NOT overridable -FactoryBot::DefinitionProxy adding callbacks - adding an :after_create callback succeeds - adding both an :after_stub and a :before_create callback succeeds - adding both a :before_stub and a :before_create callback succeeds - adding an :after_stub callback succeeds - adding both an :after_stub and an :after_create callback succeeds - adding an :after_build callback succeeds +FactoryBot::DefinitionProxy#sequence + creates a new sequence starting at 1 + creates a new sequence with a block + creates a new sequence with an overridden starting vaue -FactoryBot::Callback - has a name - runs its block with two parameters - runs its block with no parameters - converts strings to symbols - runs its block with one parameter +FactoryBot::AttributeList#associations + returns associations -FactoryBot::Declaration::Dynamic - #== - when the blocks are different - the objects are NOT equal - when the names are different - the objects are NOT equal - when the attributes are equal - the objects are equal - when one is ignored and the other isn't - the objects are NOT equal - when comparing against another type of object - the objects are NOT equal +FactoryBot aliases + for an attribute should include the original attribute and a version suffixed with '_id' + for an attribute which starts with an underscore should not include a non-underscored version + for a foreign key should include both the suffixed and un-suffixed variants FactoryBot::AttributeList filter based on ignored attributes filters #non_ignored attributes filters #ignored attributes -FactoryBot::DefinitionProxy#association - when passing a block raises an error - declares an association with options - declares an association +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::Factory when given a class that overrides #to_s - sets build_class correctly +FactoryBot::Factory for namespaced class + sets build_class correctly with a namespaced class with namespace/class syntax + sets build_class correctly with a namespaced class with Namespace::Class syntax + +FactoryBot::Attribute::Sequence + assigns the next value in the sequence + name + is expected to eq :first_name FactoryBot::Strategy::Create runs a custom create block + it should behave like strategy with association support + runs the factory with the correct overrides + finds the factory with the correct factory name it should behave like strategy with callbacks runs the callbacks [:after_build, :before_create, :after_create] with the evaluation's object returns the object from the evaluation - it should behave like strategy with association support - finds the factory with the correct factory name - runs the factory with the correct overrides - -FactoryBot::Attribute::Dynamic - name - is expected to eq :first_name - with a block returning a sequence - raises a sequence abuse error - with a block returning a static value - returns the value when executing the proc - with a block returning its block-level variable - returns self when executing the proc - with a block referencing an attribute on the attribute - evaluates the attribute from the attribute - -FactoryBot::DefinitionProxy#method_missing - declares a dynamic attribute when called with a block - declares an implicit declaration when called without args or a block - raises a NoMethodError when called with a static-attribute-like argument (PENDING: No reason given) - declares an association when called with a ':factory' key - -FactoryBot::Factory when defined with a custom class name - has a build_class equal to its custom class name -FactoryBot::NullObject - responds to the given methods - does not respond to other methods +FactoryBot::DeclarationList#attributes + defines each attribute on the attribute list + returns an AttributeList Pending: (Failures listed here are expected and do not affect your suite's status) @@ -1605,161 +1648,141 @@ # No reason given # ./spec/factory_bot/definition_proxy_spec.rb:66 -Finished in 2.24 seconds (files took 1.66 seconds to load) +Finished in 2.67 seconds (files took 3.71 seconds to load) 290 examples, 0 failures, 1 pending -Randomized with seed 54234 +Randomized with seed 49576 /usr/bin/ruby3.1 -I/usr/share/rubygems-integration/all/gems/rspec-support-3.12.0/lib:/usr/share/rubygems-integration/all/gems/rspec-core-3.12.0/lib /usr/share/rubygems-integration/all/gems/rspec-core-3.12.0/exe/rspec --pattern spec/acceptance/\*\*/\*_spec.rb --format documentation -Randomized with seed 12404 +Randomized with seed 13994 -a custom create - uses the custom create block instead of save +initialize_with with a hash argument + builds the object correctly -initialize_with implicit constructor - instantiates the correct object +initialize_with for a constructor that requires a block + executes the block correctly -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 +including FactoryBot::Syntax::Methods when custom strategies have been declared + allows adding additional strategies -transient attributes - with a transient variable assigned - generates the correct attributes on a rockstar - generates the correct attributes on an upcased rockstar - generates the correct attributes on a groupie - generates the correct attributes on a rockstar with a name - without transient variables assigned - uses the default value of the attribute - returning attributes for a factory - is expected to have key :name - is expected not to have key :upcased - is expected not to have key :four - is expected not to have key :rockstar - is expected to have key :email +`attributes_for` for a class whose constructor has required params + [:name] + is expected to eq "John Doe" -callbacks - runs the after(:stub) callback when stubbing - runs the after(:build) callback when building - runs child callback after parent callback - runs both the after(:stub) callback on the factory and the inherited after(:stub) callback - runs both the after(:build) and after(:create) callbacks when creating +traits with to_create + can apply to_create from traits + can apply to_create from the definition + gives additional traits higher priority than base traits and factory definition + gives base traits lower priority than overrides + gives additional traits higher priority than to_create from the definition + gives base traits normal priority -defaulting `created_at` - doesn't allow setting created_at on an object that doesn't define it - allows overriding created_at for objects with created_at - defaults created_at for objects with created_at - doesn't add created_at to objects who don't have the method - is doesn't mark the object as changed - behaves the same as a non-stubbed created_at - allows assignment of created_at +sequences are evaluated in the correct context + allows direct reference of a method in a sequence + invokes the correct method on the instance + builds a sequence calling sprintf correctly + invokes a method with no arguments on the instance -including FactoryBot::Syntax::Methods when custom strategies have been declared - allows adding additional strategies +initialize_with doesn't duplicate assignment on attributes accessed from initialize_with + instantiates the correct object -transient sequences - increments sequences correctly +using ActiveSupport::Instrumentation to track factory interaction + builds the correct payload + tracks proper time of creating the record -FactoryBot.rewind_sequences - still allows global sequences prefixed with a factory name - resets inline sequences back to their starting value - resets all sequences back to their starting values - allows setting sequences within identically named traits - does not collide with globally registered factories +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 -a generated stub instance - allows decrement - isn't a new record - generates unique ids - disables decrement! - disables toggle! - assigns associations - allows increment - assigns associations that aren't new records - disables increment! - allows toggle - assigns a default attribute - disables update_attribute - disables connection - disables reload - isn't changed - disables save - has an id - assigns an overridden attribute - disables destroy +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" -defaulting `updated_at` - allows assignment of updated_at - behaves the same as a non-stubbed updated_at - doesn't add updated_at to objects who don't have the method - defaults updated_at for objects with updated_at - doesn't allow setting updated_at on an object that doesn't define it - is doesn't mark the object as changed - allows overriding updated_at for objects with updated_at +global skip_create + does not persist any record + honors overridden to_create + does not persist child records + honors inline trait to_create -attributes defined using Symbol#to_proc - assigns overridden value correctly - assigns values correctly - assigns value with override correctly +aliases and overrides + two + is expected to be nil + one + is expected to eq "override" -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 +an instance generated by a factory with a custom class name + is expected to be a kind of User(id: integer, admin: boolean) + is expected to be admin + +global to_create + handles child to_create + handles base to_create + handles inline trait override + uses to_create globally across FactoryBot.define + handles child to_create with trait + +sequences + generates sequential numbers if no block is given + generates aliases for the sequence that reference the same block + generates aliases for the sequence that reference the same block and retains value + generates few values of the sequence + generates several values in the correct format + +calling `attributes_for` with a block + returns the hash of attributes + passes the hash of attributes + +a created instance + assigns and saves associations + is expected not to be new record defining a child factory before a parent creates admin factories correctly -initialize_with with a hash argument - builds the object correctly - an instance generated by a factory registers the user factory -traits and dynamic attributes that are applied simultaneously - combined - is expected to eq "John " - email - is expected to eq "John@example.com" - name - is expected to eq "John" +a generated attributes hash + assigns a lazy, dependent attribute + doesn't assign associations + assigns an overridden value + assigns a default value -declaring attributes on a Factory that are private methods on Object - system - is expected to eq false - sleep - is expected to eq -5 - link - is expected to eq "http://example.com" +a generated attributes hash where order matters + factory with a parent + assigns attributes in the order they're defined + factory without a parent + assigns attributes in the order they're defined without a parent class -a stubbed instance with no primary key - behaves like a persisted record - builds a stubbed instance +#add_attribute + assigns attributes for reserved words on .build + assigns attributes for reserved words on .attributes_for -assigning overrides that are also private methods on object - more_format - is expected to eq "format: Great" - y - is expected to eq 12345 - format - is expected to eq "Great" - some_funky_method - is expected to eq "foobar!" +multiple creates and transient attributes to dynamically build attribute lists + generates the correct number of posts + allows the number of posts to be modified -build multiple instances +create multiple instances + with a block + uses the new values + with a block that receives both the object and an index + uses the new values without default attributes uses the default factory values - builds (but doesn't save) all the posts + creates all the posts length is expected to eq 20 + without the count + raise ArgumentError with the proper error message with default attributes overrides the default values - with a block - correctly uses the set value - with a block that receives both the object and an index - correctly uses the set value nested implicit traits defined outside the factory @@ -1769,228 +1792,228 @@ it should behave like assigning data from traits assigns the correct values -callbacks using syntax methods without referencing FactoryBot explicitly - works when the callback has two variables - works when the callback has no variables - works when the callback has one variable - -a custom create passing in an evaluator - passes the evaluator to the custom create block +a custom create + uses the custom create block instead of save -an instance generated by a factory named a camel case string - registers the UserModel factory +attributes defined using Symbol#to_proc + assigns values correctly + assigns overridden value correctly + assigns value with override correctly -multiple creates and transient attributes to dynamically build attribute lists - allows the number of posts to be modified - generates the correct number of posts +defining methods inside FactoryBot + raises with a meaningful message -nested factories with different parents - honors :parent over the factory block nesting +defaulting `created_at` + allows overriding created_at for objects with created_at + defaults created_at for objects with created_at + doesn't add created_at to objects who don't have the method + allows assignment of created_at + doesn't allow setting created_at on an object that doesn't define it + behaves the same as a non-stubbed created_at + is doesn't mark the object as changed -global skip_create - does not persist any record - honors overridden to_create - honors inline trait to_create - does not persist child records +initialize_with with an 'attributes' attribute + assigns attributes correctly -associations overriding :strategy - uses the overridden create strategy to create the association +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 -aliases and overrides - one - is expected to eq "override" - two - is expected to be nil +implicit traits containing callbacks + only runs the callback once -FactoryBot.lint - raises when a factory is invalid - does not raise when all factories are valid - allows for selective linting - 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 during trait validation - uses the requested strategy - verbose linting - prints the backtrace for each factory error +global callbacks + triggers after build callbacks for all factories -calling `create` with a block - passes the created instance - returns the created instance +traits with initialize_with + gives additional traits higher priority than initialize_with from the definition + gives base traits normal priority + gives additional traits higher priority than base traits and factory definition + gives base traits lower priority than overrides + can apply initialize_with from traits + can apply initialize_with from the definition -an instance generated by a factory with multiple traits - the parent class - is expected not to be admin - gender - is expected to be nil - name - is expected to eq "John" - the child with multiple traits and overridden attributes - is expected to be admin - gender - is expected to be nil - name - is expected to eq "Jill" - factory with trait defined multiple times - child factory redefining trait - great - is expected to eq "EVEN GREATER!!!" - great - is expected to eq "GREAT!!!" - the child with multiple traits - is expected to be admin - name - is expected to eq "Jane" - gender - is expected to eq "Female" - 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 - name - is expected to eq "Jane" - gender - is expected to eq "Female" - child factory using grandparents' trait - great - is expected to eq "GREAT!!!" - 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" - the other child class with one trait - is expected not to be admin - gender - is expected to eq "Female" +traits added via strategy + adding traits in build_list + builds all the records + length + is expected to eq 2 + adding traits in create + doesn't modify the user factory + admin + is expected to equal true name - is expected to eq "Jane" - child factory created where trait attributes are inherited - date_of_birth - is expected to eq Sat, 01 Jan 2000 - gender - is expected to eq "Male" - factory using global trait + is expected to eq "JOE" + adding traits in build_stubbed + admin + is expected to equal true name - is expected to eq "Bill" - email - is expected to eq "Bill@example.com" - factory created with alternate syntax for specifying trait - where trait name and attribute are the same - great - is expected to eq "GREAT!!!" - gender - is expected to eq "Male" - where trait name and attribute are the same and attribute is overridden - great - is expected to eq "SORT OF!!!" - the child class with one trait - is expected to be admin - gender - is expected to be nil + is expected to eq "Jack" + adding traits in build name + is expected to eq "Joe" + admin + is expected to equal true + adding traits in create_list + creates all the records + length + is expected to eq 2 + adding traits in attributes_for + [:name] is expected to eq "John" + [:admin] + is expected to equal true -register custom strategies - allows using the *_pair method to build a list using a custom strategy - allows adding additional strategies - allows overriding default strategies - allows using the *_list method to build a list using a custom strategy +nested factories with different parents + honors :parent over the factory block nesting -calling `attributes_for` with a block - returns the hash of attributes - passes the hash of attributes +create multiple instances + without default attributes + creates all the posts + uses the default factory values + length + is expected to eq 2 -configuring the starting id - defines which id build_stubbed instances start with +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 -a generated attributes hash - assigns an overridden value - doesn't assign associations - assigns a default value - assigns a lazy, dependent attribute +a generated stub instance + isn't a new record + has an id + disables update_attribute + assigns associations that aren't new records + isn't changed + disables save + assigns associations + disables decrement! + assigns a default attribute + disables destroy + allows increment + allows decrement + disables toggle! + allows toggle + generates unique ids + disables connection + disables increment! + disables reload + assigns an overridden attribute when a self-referential trait is defined raises a TraitDefinitionError raises a TraitDefinitionError -initialize_with for a constructor that requires a block - executes the block correctly +initialize_with non-ORM-backed objects + generates random data + allows for overrides -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 +syntax methods within dynamic attributes + can access methods already existing on the class + allows syntax methods to be used when the block has an arity of 1 + can access syntax methods from dynamic attributes + can access syntax methods from dynamic attributes -association assignment from nested attributes - assigns the correct amount of comments - assigns the correct amount of comments when overridden +FactoryBot.rewind_sequences + resets all sequences back to their starting values + allows setting sequences within identically named traits + still allows global sequences prefixed with a factory name + does not collide with globally registered factories + resets inline sequences back to their starting value -a stubbed instance overriding strategy - acts as if it is saved in the database - assigns associations and acts as if it is saved +transient attributes + with a transient variable assigned + generates the correct attributes on an upcased rockstar + generates the correct attributes on a rockstar + generates the correct attributes on a groupie + generates the correct attributes on a rockstar with a name + without transient variables assigned + uses the default value of the attribute + returning attributes for a factory + is expected to have key :email + is expected not to have key :rockstar + is expected not to have key :upcased + is expected not to have key :four + is expected to have key :name -traits with to_create - gives base traits normal priority - can apply to_create from the definition - can apply to_create from traits - gives base traits lower priority than overrides - gives additional traits higher priority than base traits and factory definition - gives additional traits higher priority than to_create from the definition +an instance generated by a factory that inherits from another factory + the child class redefining parent's attributes + is expected to be a kind of User(id: integer, name: string, admin: boolean, email: string, upper_email: string, login: string) + is expected to be admin + upper_email + is expected to eq "ADMIN@EXAMPLE.COM" + login + is expected to eq "admin@example.com" + name + is expected to eq "admin" + email + is expected to eq "admin@example.com" + the parent class + is expected not to be admin + email + is expected to eq "john@example.com" + name + is expected to eq "John" + login + is expected to eq "john@example.com" -create multiple instances - without default attributes - uses the default factory values - creates all the posts - length - is expected to eq 2 +initialize_with implicit constructor + instantiates the correct object -reload - does not reset the value of use_parent_strategy +a stubbed instance with no primary key + builds a stubbed instance + behaves like a persisted record + +modifying inherited factories with traits + returns the correct value for overridden attributes from traits + allows modification of attributes created via traits + returns the correct value for overridden attributes from traits defining multiple attributes associations - when building collection associations - builds the association according to the given strategy - when building interrelated associations - assigns the instance passed as an association attribute - connects records with interdependent relationships when accidentally using an implicit delcaration for the factory raises an error when accidentally using an implicit delcaration as an override raises an error + when building interrelated associations + assigns the instance passed as an association attribute + connects records with interdependent relationships + when building collection associations + builds the association according to the given strategy -using ActiveSupport::Instrumentation to track factory interaction - tracks proper time of creating the record - builds the correct payload +initialize_with with FG attributes that are transient + name + is expected to eq "Handsome Chap from .construct" -calling methods on the model instance - with the referenced attribute being overridden - uses the overridden value - uses the overridden value during attributes_for - without the attribute being overridden - doesn't instantiate a record with attributes_for - returns the correct value from the instance - returns nil during attributes_for - with the attribute being overridden - uses the overridden value - uses the overridden value during attributes_for +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 -global initialize_with - uses initialize_with globally across FactoryBot.define - handles child initialize_with - handles child initialize_with with trait - handles base initialize_with - handles inline trait override +calling `build_stubbed` with a block + passes the stub instance + returns the stub instance + +callbacks using Symbol#to_proc + runs the callback correctly + +accessing methods from the instance within a dynamic attribute that is also a private method on object + more_format + is expected to eq "format: This is an awesome format" + +an instance generated by a factory named a camel case string + registers the UserModel factory + +configuring the starting id + defines which id build_stubbed instances start with + +initialize_with with non-FG attributes + name + is expected to eq "John Doe" + age + is expected to eq 21 attribute overrides with an admin posting @@ -2003,179 +2026,233 @@ secure is expected to be nil -callbacks using Symbol#to_proc - runs the callback correctly +looking up traits that don't exist + when a trait includes an invalid default trait + raises a KeyError including the factory name + when passing an invalid override trait + raises a KeyError + when the factory includes an invalid default trait + raises a KeyError including the factory name + maintains 'Did you mean?' suggestions at the end of the error message -calling `build_stubbed` with a block - passes the stub instance - returns the stub instance +calling `create` with a block + returns the created instance + passes the created instance -calling `build` with a block - returns the built instance - passes the built instance +traits used in associations + allows assigning traits for the factory of an association + allows inline traits with a specific factory for an association + allows inline traits with the default association -a built instance with strategy: :create - assigns and saves associations - is expected to be new record +attribute aliases + assigning an association by foreign key + doesn't assign both an association and its foreign key + assigning an association by passing factory + assigns attributes correctly -traits added via strategy - adding traits in attributes_for - [:admin] - is expected to equal true - [:name] - is expected to eq "John" - adding traits in build_stubbed - name - is expected to eq "Jack" - admin - is expected to equal true - adding traits in build - name - is expected to eq "Joe" - admin - is expected to equal true - adding traits in build_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 - admin - is expected to equal true - name - is expected to eq "JOE" +associations overriding :strategy + uses the overridden create strategy to create the association -making sure the factory is properly compiled the first time we want to instantiate it - can honor traits on the very first call +association assignment from nested attributes + assigns the correct amount of comments + assigns the correct amount of comments when overridden -global to_create - handles inline trait override - uses to_create globally across FactoryBot.define - handles child to_create - handles base to_create - handles child to_create with trait +initialize_with has access to all attributes for construction + assigns attributes correctly -setting private attributes - raises a NoMethodError +defaulting `updated_at` + behaves the same as a non-stubbed updated_at + doesn't allow setting updated_at on an object that doesn't define it + defaults updated_at for objects with updated_at + is doesn't mark the object as changed + allows assignment of updated_at + allows overriding updated_at for objects with updated_at + doesn't add updated_at to objects who don't have the method -create multiple instances +defaulting `id` + allows overriding id + +build multiple instances without default attributes - creates all the posts uses the default factory values + builds (but doesn't save) all the posts length is expected to eq 20 - with a block that receives both the object and an index - uses the new values - with a block - uses the new values with default attributes overrides the default values - without the count - raise ArgumentError with the proper error message + with a block that receives both the object and an index + correctly uses the set value + with a block + correctly uses the set value -traits used in associations - allows assigning traits for the factory of an association - allows inline traits with a specific factory for an association - allows inline traits with the default association +a created instance, specifying strategy: :build + saves associations (strategy: :build only affects build, not create) -#add_attribute - assigns attributes for reserved words on .build - assigns attributes for reserved words on .attributes_for +skipping the default create + doesn't execute anything when creating the instance + +applying inline traits + applies traits only to the instance generated for that call + +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" + +a stubbed instance + assigns associations and acts as if it is saved + acts as if it came from the database + +finding factories keyed by class instead of symbol + doesn't find the factory + +a built instance with strategy: :create + assigns and saves associations + is expected to be new record + +transient sequences + increments sequences correctly + +a stubbed instance overriding strategy + assigns associations and acts as if it is saved + acts as if it is saved in the database trait indifferent access + when trait is defined as integer + can be invoked with as integer + can be invoked with a string when trait is defined as a symbol can be invoked with a symbol can be invoked with a string when trait is defined as struct - can be invoked with a struct can be invoked with a string - when trait is defined as integer - can be invoked with a string - can be invoked with as integer + can be invoked with a struct when trait is defined as a string can be invoked with a symbol can be invoked with a string -initialize_with doesn't duplicate assignment on attributes accessed from initialize_with - instantiates the correct object - -implicit traits containing callbacks - only runs the callback once - -looking up traits that don't exist - when a trait includes an invalid default trait - raises a KeyError including the factory name - when the factory includes an invalid default trait - maintains 'Did you mean?' suggestions at the end of the error message - raises a KeyError including the factory name - when passing an invalid override trait - raises a KeyError - -initialize_with with FG attributes that are transient - name - is expected to eq "Handsome Chap from .construct" - -a created instance, specifying strategy: :build - saves associations (strategy: :build only affects build, not create) - -a created instance - assigns and saves associations - is expected not to be new record - -initialize_with non-ORM-backed objects - generates random data - allows for overrides - -syntax methods within dynamic attributes - can access syntax methods from dynamic attributes - can access methods already existing on the class - allows syntax methods to be used when the block has an arity of 1 - can access syntax methods from dynamic attributes - -`attributes_for` for a class whose constructor has required params - [:name] - is expected to eq "John Doe" - -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 - -sequences are evaluated in the correct context - builds a sequence calling sprintf correctly - allows direct reference of a method in a sequence - invokes the correct method on the instance - invokes a method with no arguments on the instance - -applying inline traits - applies traits only to the instance generated for that call +a custom create passing in an evaluator + passes the evaluator to the custom create block -a built instance - is expected to be new record - when the :use_parent_strategy config option is set to false - assigns and saves associations - when the :use_parent_strategy config option is set to true - assigns but does not save associations +global initialize_with + handles base initialize_with + handles child initialize_with with trait + uses initialize_with globally across FactoryBot.define + handles child initialize_with + handles inline trait override -defining methods inside FactoryBot - raises with a meaningful message +an instance generated by a factory with multiple traits + factory using global trait + email + is expected to eq "Bill@example.com" + name + is expected to eq "Bill" + the child with multiple traits and overridden attributes + is expected to be admin + name + is expected to eq "Jill" + gender + is expected to be nil + the other child class with one trait + is expected not to be admin + name + is expected to eq "Jane" + gender + is expected to eq "Female" + child class with scoped trait and inherited trait + is expected to be admin + gender + is expected to eq "Female" + name + is expected to eq "Judy" + 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 + name + is expected to eq "Jane" + gender + is expected to eq "Female" + the parent class + is expected not to be admin + gender + is expected to be nil + name + is expected to eq "John" + factory created with alternate syntax for specifying trait + where trait name and attribute are the same + great + is expected to eq "GREAT!!!" + gender + is expected to eq "Male" + where trait name and attribute are the same and attribute is overridden + great + is expected to eq "SORT OF!!!" + child factory using grandparents' trait + great + is expected to eq "GREAT!!!" + the child with multiple traits + is expected to be admin + name + is expected to eq "Jane" + gender + is expected to eq "Female" + child factory created where trait attributes are inherited + date_of_birth + is expected to eq Sat, 01 Jan 2000 + gender + is expected to eq "Male" + the child class with one trait + is expected to be admin + name + is expected to eq "John" + gender + is expected to be nil + factory with trait defined multiple times + great + is expected to eq "GREAT!!!" + child factory redefining trait + great + is expected to eq "EVEN GREATER!!!" -initialize_with with an 'attributes' attribute - assigns attributes correctly +FactoryBot.lint + allows for selective linting + raises when a factory is invalid + does not raise when all factories are valid + verbose linting + prints the backtrace for each factory error + trait validation + enabled + raises if a trait produces an invalid object + does not raise if a trait produces a valid object + disabled + does not raises if a trait produces an invalid object + factory strategy for linting + uses the requested strategy + uses the requested strategy during trait validation -global callbacks - triggers after build callbacks for all factories +making sure the factory is properly compiled the first time we want to instantiate it + can honor traits on the very first call -finding factories keyed by class instead of symbol - doesn't find the factory +inline traits overriding existing attributes + prefers inline trait attributes over default attributes + prefers traits on a factory over default attributes + returns the default status + prefers inline traits over attributes on factories + prefers overridden attributes over attributes from traits, inline traits, or attributes on factories + prefers inline trait attributes over traits on a factory + prefers attributes on factories over attributes from non-inline traits -assigning values from a transient attribute - does not ignore an _id attribute that is an alias for a transient attribute +reload + does not reset the value of use_parent_strategy modifying factories allows for overriding child classes @@ -2183,6 +2260,13 @@ doesn't overwrite already defined child's attributes redefining attributes creating admin + without overrides + email + is expected to eq "Great User-modified@example.com" + admin + is expected to equal true + name + is expected to eq "Great User" overriding the email name is expected to eq "Great User" @@ -2191,40 +2275,40 @@ admin is expected to equal true overriding the name + admin + is expected to equal true name is expected to eq "wonderful" email is expected to eq "wonderful-modified@example.com" - admin - is expected to equal true + creating user without overrides - admin - is expected to equal true - email - is expected to eq "Great User-modified@example.com" name is expected to eq "Great User" - creating user - without overrides email is expected to eq "Great User-modified@example.com" + overriding the name name - is expected to eq "Great User" - overriding the email + is expected to eq "wonderful" email - is expected to eq "perfect@example.com" + is expected to eq "wonderful-modified@example.com" + overriding the email name is expected to eq "Great User" - overriding the name email - is expected to eq "wonderful-modified@example.com" - name - is expected to eq "wonderful" - adding callbacks + is expected to eq "perfect@example.com" + reusing traits + login + is expected to eq "JOHNNY ROCKSTAR!!!" name - is expected to eq "great user" + is expected to eq "Johnny Rockstar!!!" + email + is expected to eq "Johnny Rockstar!!!@example.com" + adding callbacks login is expected to be nil + 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 @@ -2232,121 +2316,80 @@ is expected to eq "GREAT USER" name is expected to eq "Great User" - reusing traits - email - is expected to eq "Johnny Rockstar!!!@example.com" - login - is expected to eq "JOHNNY ROCKSTAR!!!" - name - is expected to eq "Johnny Rockstar!!!" - -traits with initialize_with - gives additional traits higher priority than base traits and factory definition - 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 initialize_with from the definition - -initialize_with has access to all attributes for construction - assigns attributes correctly - -defaulting `id` - allows overriding id - -traits with callbacks - executes callbacks in the order assigned - when the factory has a trait passed via arguments - name - is expected to eq "JOHN" - when the factory has an implicit trait - name - is expected to eq "JOHN" - -initialize_with parent and child factories - allows child factories to override initialize_with - uses the parent's constructor when the child factory doesn't assign it - -custom callbacks - runs a custom after callback when the proper strategy executes - runs a custom callback without prepending before or after when the proper strategy executes - runs a custom before callback when the proper strategy executes -a stubbed instance - acts as if it came from the database - assigns associations and acts as if it is saved +callbacks + runs the after(:stub) callback when stubbing + runs both the after(:stub) callback on the factory and the inherited after(:stub) callback + runs both the after(:build) and after(:create) callbacks when creating + runs the after(:build) callback when building + runs child callback after parent callback -inline traits overriding existing attributes - prefers inline trait attributes over default attributes - returns the default status - prefers attributes on factories over attributes from non-inline traits - prefers overridden attributes over attributes from traits, inline traits, or attributes on factories - prefers inline trait attributes over traits on a factory - prefers inline traits over attributes on factories - prefers traits on a factory over default attributes +callbacks using syntax methods without referencing FactoryBot explicitly + works when the callback has no variables + works when the callback has two variables + works when the callback has one variable -initialize_with with non-FG attributes - age - is expected to eq 21 - name - is expected to eq "John Doe" +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 admin - is expected to be a kind of User(id: integer, name: string, admin: boolean, email: string, upper_email: string, login: string) - upper_email - is expected to eq "ADMIN@EXAMPLE.COM" - login - 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 - name - is expected to eq "John" - email - is expected to eq "john@example.com" - login - is expected to eq "john@example.com" +setting private attributes + raises a NoMethodError -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" +assigning values from a transient attribute + does not ignore an _id attribute that is an alias for a transient attribute binding a callback to multiple callbacks + binds the callback to stubbing does not bind the callback to building binds the callback to creation - binds the callback to stubbing - -skipping the default create - doesn't execute anything when creating the instance - -sequences - generates aliases for the sequence that reference the same block and retains value - generates sequential numbers if no block is given - generates several values in the correct format - generates few values of the sequence - generates aliases for the sequence that reference the same block enum traits - when automatically_define_enum_traits is false - builds traits for each enumerated value when traits_for_enum are specified - raises an error for undefined traits when automatically_define_enum_traits is true + builds traits for each enumerated value using a provided list of values as an Array builds traits for each enumerated value using a custom enumerable prefers user defined traits over automatically built traits - builds traits for each enumerated value using a provided list of values as an Array builds traits for each enumerated value using a provided list of values as a Hash builds traits automatically for model enum field + when automatically_define_enum_traits is false + builds traits for each enumerated value when traits_for_enum are specified + raises an error for undefined traits -attribute aliases - assigning an association by passing factory - assigns attributes correctly - assigning an association by foreign key - doesn't assign both an association and its foreign key +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!" + +register custom strategies + allows overriding default strategies + allows adding additional strategies + allows using the *_list method to build a list using a custom strategy + allows using the *_pair method to build a list using a custom strategy + +declaring attributes on a Factory that are private methods on Object + system + is expected to eq false + sleep + is expected to eq -5 + link + is expected to eq "http://example.com" + +calling methods on the model instance + with the attribute being overridden + uses the overridden value during attributes_for + uses the overridden value + with the referenced attribute being overridden + uses the overridden value + uses the overridden value during attributes_for + without the attribute being overridden + returns the correct value from the instance + returns nil during attributes_for + doesn't instantiate a record with attributes_for Deprecation Warnings: @@ -2362,10 +2405,10 @@ 2 deprecation warnings total -Finished in 10.75 seconds (files took 1.71 seconds to load) +Finished in 14.73 seconds (files took 2.57 seconds to load) 362 examples, 0 failures -Randomized with seed 12404 +Randomized with seed 13994 mv ./.gem2deb.Gemfile.lock Gemfile.lock @@ -2401,12 +2444,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/17777/tmp/hooks/B01_cleanup starting +I: user script /srv/workspace/pbuilder/17777/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/20597 and its subdirectories -I: Current time: Fri Jun 9 19:59:08 -12 2023 -I: pbuilder-time-stamp: 1686383948 +I: removing directory /srv/workspace/pbuilder/17777 and its subdirectories +I: Current time: Sat Jun 10 22:03:47 +14 2023 +I: pbuilder-time-stamp: 1686384227