mirror of
https://github.com/fergalmoran/next-auth-aspnetcore-adapter.git
synced 2025-12-22 17:38:17 +00:00
Register endpoint PoC working
This commit is contained in:
8
jest.config.cjs
Normal file
8
jest.config.cjs
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
module.exports = {
|
||||||
|
preset: 'ts-jest',
|
||||||
|
testEnvironment: 'node',
|
||||||
|
transform: {
|
||||||
|
'^.+\\.ts?$': 'ts-jest',
|
||||||
|
},
|
||||||
|
transformIgnorePatterns: ['<rootDir>/node_modules/'],
|
||||||
|
};
|
||||||
18
package.json
18
package.json
@@ -19,13 +19,23 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"scripts": {
|
|
||||||
"test": "echo \"Error: no test specified\" && exit 1"
|
|
||||||
},
|
|
||||||
"keywords": [
|
"keywords": [
|
||||||
"Next Auth",
|
"Next Auth",
|
||||||
"ASP.Net Core",
|
"ASP.Net Core",
|
||||||
".NET Core",
|
".NET Core",
|
||||||
"Identity"
|
"Identity"
|
||||||
]
|
],
|
||||||
|
"scripts": {
|
||||||
|
"clean": "echo Cleaning....",
|
||||||
|
"test": "pnpm test:IdentityEndpointsSample",
|
||||||
|
"test:IdentityEndpointsSample": "pnpm clean && ./tests/IdentityEndpointsSample/test.sh"
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"next-auth": "^4.23.0"
|
||||||
|
},
|
||||||
|
"devDependencies": {
|
||||||
|
"@types/jest": "^29.5.3",
|
||||||
|
"jest": "^29.6.2",
|
||||||
|
"ts-jest": "^29.1.1"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
75
src/index.ts
Normal file
75
src/index.ts
Normal file
@@ -0,0 +1,75 @@
|
|||||||
|
import {type AdapterUser, type Adapter} from "next-auth/adapters";
|
||||||
|
import {fixtures} from "../tests/fixtures";
|
||||||
|
|
||||||
|
export function AspNetIdentityAdapter(baseUrl: string): Adapter {
|
||||||
|
return {
|
||||||
|
async createUser(data: AdapterUser) {
|
||||||
|
const url = `${baseUrl}/register`;
|
||||||
|
const result = await fetch(url, {
|
||||||
|
method: "POST",
|
||||||
|
headers: {
|
||||||
|
"Content-Type": "application/json",
|
||||||
|
},
|
||||||
|
body: JSON.stringify({
|
||||||
|
username: fixtures.user.username,
|
||||||
|
email: fixtures.user.email,
|
||||||
|
password: fixtures.user.password
|
||||||
|
}),
|
||||||
|
});
|
||||||
|
if (result.status === 200) {
|
||||||
|
//TODO: register endpoint should return more than a 200
|
||||||
|
return {
|
||||||
|
id: '1409b076-296d-481e-9f52-1996b8002d9c',
|
||||||
|
username: data.name,
|
||||||
|
email: data.email,
|
||||||
|
emailVerified: new Date()
|
||||||
|
} as AdapterUser;
|
||||||
|
} else {
|
||||||
|
const body = await result.json()
|
||||||
|
if (result.status === 400) {
|
||||||
|
console.log("authService", "registerUser", body);
|
||||||
|
}
|
||||||
|
throw Error(`Unable to create user: result ${body}`);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
async getUser(id) {
|
||||||
|
throw Error(`Not implemented`);
|
||||||
|
},
|
||||||
|
async getUserByEmail(email) {
|
||||||
|
throw Error(`Not implemented`);
|
||||||
|
},
|
||||||
|
async getUserByAccount({providerAccountId, provider}) {
|
||||||
|
throw Error(`Not implemented`);
|
||||||
|
},
|
||||||
|
async updateUser(user) {
|
||||||
|
throw Error(`Not implemented`);
|
||||||
|
},
|
||||||
|
async deleteUser(userId) {
|
||||||
|
throw Error(`Not implemented`);
|
||||||
|
},
|
||||||
|
async linkAccount(account) {
|
||||||
|
throw Error(`Not implemented`);
|
||||||
|
},
|
||||||
|
async unlinkAccount({providerAccountId, provider}) {
|
||||||
|
throw Error(`Not implemented`);
|
||||||
|
},
|
||||||
|
async createSession({sessionToken, userId, expires}) {
|
||||||
|
throw Error(`Not implemented`);
|
||||||
|
},
|
||||||
|
async getSessionAndUser(sessionToken) {
|
||||||
|
throw Error(`Not implemented`);
|
||||||
|
},
|
||||||
|
async updateSession({sessionToken}) {
|
||||||
|
throw Error(`Not implemented`);
|
||||||
|
},
|
||||||
|
async deleteSession(sessionToken) {
|
||||||
|
throw Error(`Not implemented`);
|
||||||
|
},
|
||||||
|
async createVerificationToken({identifier, expires, token}) {
|
||||||
|
throw Error(`Not implemented`);
|
||||||
|
},
|
||||||
|
async useVerificationToken({identifier, token}) {
|
||||||
|
throw Error(`Not implemented`);
|
||||||
|
},
|
||||||
|
};
|
||||||
|
}
|
||||||
70
tests/index.ts
Normal file
70
tests/index.ts
Normal file
@@ -0,0 +1,70 @@
|
|||||||
|
import {Adapter} from "next-auth/adapters";
|
||||||
|
import {fixtures} from "./fixtures";
|
||||||
|
|
||||||
|
export interface TestOptions {
|
||||||
|
adapter: Adapter
|
||||||
|
fixtures?: {
|
||||||
|
user?: any
|
||||||
|
session?: any
|
||||||
|
account?: any
|
||||||
|
sessionUpdateExpires?: Date
|
||||||
|
verificationTokenExpires?: Date
|
||||||
|
},
|
||||||
|
skipTests?: string[]
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A wrapper to run the most basic tests.
|
||||||
|
* Run this at the top of your test file.
|
||||||
|
* You can add additional tests below, if you wish.
|
||||||
|
*/
|
||||||
|
export async function runBasicTests(options: TestOptions) {
|
||||||
|
const {adapter: _adapter, skipTests} = options
|
||||||
|
const adapter = _adapter as Required<Adapter>
|
||||||
|
|
||||||
|
// Init
|
||||||
|
beforeAll(async () => {
|
||||||
|
console.log('Tests', 'beforeAll')
|
||||||
|
})
|
||||||
|
|
||||||
|
afterAll(async () => {
|
||||||
|
console.log('Tests', 'afterAll')
|
||||||
|
})
|
||||||
|
|
||||||
|
let user: any = options.fixtures?.user ?? {
|
||||||
|
email: "fill@murray.com",
|
||||||
|
image: "https://www.fillmurray.com/460/300",
|
||||||
|
name: "Fill Murray",
|
||||||
|
emailVerified: new Date()
|
||||||
|
}
|
||||||
|
|
||||||
|
// All adapters must define these methods
|
||||||
|
test("Required (User, Account, Session) methods exist", () => {
|
||||||
|
const requiredMethods = [
|
||||||
|
"createUser",
|
||||||
|
"getUser",
|
||||||
|
"getUserByEmail",
|
||||||
|
"getUserByAccount",
|
||||||
|
"updateUser",
|
||||||
|
"linkAccount",
|
||||||
|
"createSession",
|
||||||
|
"getSessionAndUser",
|
||||||
|
"updateSession",
|
||||||
|
"deleteSession",
|
||||||
|
]
|
||||||
|
requiredMethods.forEach((method) => {
|
||||||
|
expect(adapter).toHaveProperty(method)
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
|
test("createUser", async () => {
|
||||||
|
const result = await adapter.createUser(user)
|
||||||
|
console.log('tests', 'createUser', result)
|
||||||
|
expect(result.id).toMatch(/^[0-9a-f]{8}-[0-9a-f]{4}-[0-5][0-9a-f]{3}-[089ab][0-9a-f]{3}-[0-9a-f]{12}$/i)
|
||||||
|
expect(result.email).toMatch(fixtures.user.email)
|
||||||
|
})
|
||||||
|
|
||||||
|
test("getUserByEmail", async () => {
|
||||||
|
const result = await adapter.getUserByEmail(fixtures.user.email);
|
||||||
|
})
|
||||||
|
}
|
||||||
25
tsconfig.json
Normal file
25
tsconfig.json
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
{
|
||||||
|
"compilerOptions": {
|
||||||
|
"allowJs": true,
|
||||||
|
"baseUrl": ".",
|
||||||
|
"isolatedModules": true,
|
||||||
|
"esModuleInterop": true,
|
||||||
|
"target": "ES2020",
|
||||||
|
"module": "ESNext",
|
||||||
|
"moduleResolution": "node",
|
||||||
|
"outDir": ".",
|
||||||
|
"rootDir": "src",
|
||||||
|
"skipDefaultLibCheck": true,
|
||||||
|
"strictNullChecks": true,
|
||||||
|
"stripInternal": true,
|
||||||
|
"declarationMap": true,
|
||||||
|
"declaration": true
|
||||||
|
},
|
||||||
|
"include": [
|
||||||
|
"src/**/*"
|
||||||
|
],
|
||||||
|
"exclude": [
|
||||||
|
"*.js",
|
||||||
|
"*.d.ts"
|
||||||
|
]
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user