@stacksjs/testing 0.75.255 → 0.75.257
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/database.js +1 -1
- package/package.json +11 -11
package/dist/database.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
// @bun
|
|
2
|
-
import{afterEach as P,beforeEach as R}from"bun:test";import{config as
|
|
2
|
+
import{afterEach as P,beforeEach as R}from"bun:test";import{config as g}from"@stacksjs/config";import{copyModelFiles as v,db as s,deleteFrameworkModels as k,dropSqliteTables as T,fetchSqliteFile as f,fetchTables as S,migrateAuthTables as C,migrateNotificationTables as M,migrateRbacTables as A,migrateTraitTables as F,ensureUtcDatetimeColumns as _,ensureUtcTimestampDefaults as D,runDatabaseMigration as p}from"@stacksjs/database";import{path as u}from"@stacksjs/path";import{fs as c,globSync as y}from"@stacksjs/storage";function b(){return g.database?.default||""}var d=null;function N(){if(d)return d;return d=`${f()}.snapshot`,d}async function E(){let t=[["auth",C],["notification",M],["RBAC",A],["trait",F],["utc-datetime",_],["utc-defaults",D]];for(let[e,n]of t)try{let r=await n();if(!r.success)console.error(`[testing] Failed to migrate ${e} tables: ${r.error}`)}catch(r){console.error(`[testing] Failed to migrate ${e} tables:`,r)}}async function q(){let t=`${g.database?.connections?.mysql?.name??"stacks"}_testing`;if(b()==="mysql")await s.unsafe(`CREATE DATABASE IF NOT EXISTS ${t}`).execute(),await p(),await E()}async function V(){await q();let t=b();if(t==="mysql")await O();if(t==="sqlite")await B()}async function O(){let t=await S();await s.unsafe("SET FOREIGN_KEY_CHECKS = 0").execute();try{for(let e of t)await s.unsafe(`TRUNCATE TABLE ${e}`).execute()}finally{await s.unsafe("SET FOREIGN_KEY_CHECKS = 1").execute()}}async function I(){let t=f();if(!c.existsSync(t))await Bun.$`touch ${t}`;await T(),await k();let e=y([u.userModelsPath("*.ts"),u.defaultsPath("app/Models/**/*.ts")],{absolute:!0});for(let n of e)await v(n);await p(),await E()}async function B(){let t=f(),e=N();if((()=>{if(!c.existsSync(e))return!0;let r=c.statSync(e).mtimeMs,a=y([u.userModelsPath("*.ts"),u.defaultsPath("app/Models/**/*.ts"),u.userMigrationsPath("*.ts")],{absolute:!0});for(let o of a)try{if(c.statSync(o).mtimeMs>r)return!0}catch{}return!1})()){await I();try{await s.unsafe("PRAGMA wal_checkpoint(TRUNCATE)").execute(),c.copyFileSync(t,e)}catch{}return}c.copyFileSync(e,t)}function K(){let t=null;return{begin:async()=>{let e=`stacks_test_${Date.now()}_${Math.floor(Math.random()*1e6)}`;await s.unsafe(`SAVEPOINT ${e}`).execute(),t={rollback:async()=>{await s.unsafe(`ROLLBACK TO SAVEPOINT ${e}`).execute(),await s.unsafe(`RELEASE SAVEPOINT ${e}`).execute()}}},rollback:async()=>{if(!t)return;try{await t.rollback()}finally{t=null}}}}function i(t){let e=Object.entries(t).map(([n,r])=>`${n}=${JSON.stringify(r)}`);return e.length>0?e.join(", "):"(no criteria)"}async function l(t,e){let n=s.selectFrom(t).selectAll();for(let[r,a]of Object.entries(e))n=n.where(r,"=",a);return await n.execute()}async function J(t,e){if((await l(t,e)).length>0)return;let r=await l(t,{});throw Error(`Expected ${t} to have a row matching ${i(e)}, but none did (${r.length} row(s) in the table).`)}async function Y(t,e){let n=await l(t,e);if(n.length===0)return;throw Error(`Expected ${t} to have no row matching ${i(e)}, but found ${n.length}: ${JSON.stringify(n.slice(0,3))}${n.length>3?" \u2026":""}`)}async function X(t,e,n={}){if(!Number.isInteger(e)||e<0)throw TypeError(`assertDatabaseCount expects a non-negative integer, got ${e}`);let r=await l(t,n);if(r.length===e)return;throw Error(`Expected ${e} row(s) in ${t} matching ${i(n)}, found ${r.length}.`)}async function z(t,e){let n=await l(t,e);if(n.length===0)throw Error(`Expected ${t} to have a soft-deleted row matching ${i(e)}, but no row matched at all - a hard delete removes the row rather than setting deleted_at.`);let r=n.filter((a)=>a.deleted_at===null||a.deleted_at===void 0);if(r.length===0)return;throw Error(`Expected every ${t} row matching ${i(e)} to be soft-deleted, but ${r.length} of ${n.length} still has a null deleted_at.`)}async function Q(t,e){let n=await l(t,e);if(n.length===0)throw Error(`Expected ${t} to have a row matching ${i(e)}, but none did.`);let r=n.filter((a)=>a.deleted_at!==null&&a.deleted_at!==void 0);if(r.length===0)return;throw Error(`Expected no ${t} row matching ${i(e)} to be soft-deleted, but ${r.length} of ${n.length} has a deleted_at set.`)}function W(){let t=K();R(t.begin),P(t.rollback)}function Z(t){async function e(){let{plural:a,snakeCase:o}=await import("@stacksjs/strings");return a(o(t))}async function n(a,o){let{makeModelRecords:w}=await import("@stacksjs/database");return w(t,a,o)}async function r(a){let{db:o}=await import("@stacksjs/database"),w=await e(),m=[];for(let h of a){let x=await o.insertInto(w).values(h).returningAll().executeTakeFirst();m.push(x??h)}return m}return{async make(a={}){return(await n(1,a))[0]},async makeMany(a,o={}){return n(a,o)},async create(a={}){return(await r(await n(1,a)))[0]},async createMany(a,o={}){return r(await n(a,o))}}}export{X as assertDatabaseCount,J as assertDatabaseHas,Y as assertDatabaseMissing,Q as assertNotSoftDeleted,z as assertSoftDeleted,Z as factory,V as refreshDatabase,q as setupDatabase,O as truncateMysql,I as truncateSqlite,B as truncateSqliteFast,W as useTransaction,K as useTransactionalTests};
|
package/package.json
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"name": "@stacksjs/testing",
|
|
3
3
|
"type": "module",
|
|
4
4
|
"sideEffects": false,
|
|
5
|
-
"version": "0.75.
|
|
5
|
+
"version": "0.75.257",
|
|
6
6
|
"description": "The Stacks way of testing.",
|
|
7
7
|
"author": "Chris Breuer",
|
|
8
8
|
"contributors": [
|
|
@@ -79,16 +79,16 @@
|
|
|
79
79
|
"prepublishOnly": "bun run build"
|
|
80
80
|
},
|
|
81
81
|
"dependencies": {
|
|
82
|
-
"@stacksjs/auth": "0.75.
|
|
83
|
-
"@stacksjs/cache": "0.75.
|
|
84
|
-
"@stacksjs/config": "0.75.
|
|
85
|
-
"@stacksjs/database": "0.75.
|
|
86
|
-
"@stacksjs/email": "0.75.
|
|
87
|
-
"@stacksjs/events": "0.75.
|
|
88
|
-
"@stacksjs/path": "0.75.
|
|
89
|
-
"@stacksjs/router": "0.75.
|
|
90
|
-
"@stacksjs/storage": "0.75.
|
|
91
|
-
"@stacksjs/strings": "0.75.
|
|
82
|
+
"@stacksjs/auth": "0.75.257",
|
|
83
|
+
"@stacksjs/cache": "0.75.257",
|
|
84
|
+
"@stacksjs/config": "0.75.257",
|
|
85
|
+
"@stacksjs/database": "0.75.257",
|
|
86
|
+
"@stacksjs/email": "0.75.257",
|
|
87
|
+
"@stacksjs/events": "0.75.257",
|
|
88
|
+
"@stacksjs/path": "0.75.257",
|
|
89
|
+
"@stacksjs/router": "0.75.257",
|
|
90
|
+
"@stacksjs/storage": "0.75.257",
|
|
91
|
+
"@stacksjs/strings": "0.75.257",
|
|
92
92
|
"@stacksjs/ts-cloud": "^0.16.58",
|
|
93
93
|
"very-happy-dom": "^0.3.5"
|
|
94
94
|
},
|