fastify / fastify-cli

Run a Fastify application with one command!
MIT License
644 stars 160 forks source link

Can't access plugin inside tests #622

Open thales-maciel opened 1 year ago

thales-maciel commented 1 year ago

Prerequisites

Issue

I've generated the project using the cli and then I modified my app.ts file so that it looks like this:

import { join } from 'path';
import AutoLoad, {AutoloadPluginOptions} from '@fastify/autoload';
import { FastifyInstance, FastifyPluginAsync } from 'fastify';
import { fastifyPostgres } from '@fastify/postgres';
import fastifySwagger from '@fastify/swagger';
import fastifySwaggerUi from '@fastify/swagger-ui';
import sensible from '@fastify/sensible';
import cors from '@fastify/cors'

export type AppOptions = {} & Partial<AutoloadPluginOptions>;

// Pass --options via CLI arguments in command to enable these options.
const options: AppOptions = {}

const app: FastifyPluginAsync<AppOptions> = async (fastify: FastifyInstance, opts: any): Promise<void> => {
  fastify.register(sensible)

  fastify.register(fastifyPostgres, {
    connectionString: `postgres://${process.env.DB_USER}:${process.env.DB_PASSWORD}@${process.env.DB_HOST}/${process.env.DB_DATABASE}`
  })

  fastify.register(fastifySwagger, { hideUntagged: true })
  fastify.register(fastifySwaggerUi, {
    routePrefix: '/docs',
    uiConfig: { docExpansion: 'list' }
  })

  await fastify.register(cors, {})

  void fastify.register(AutoLoad, {
    dir: join(__dirname, 'routes'),
    options: opts
  })

}

export default app;
export { app, options }

The problem is that when i try to use the pg plugin inside a test I get an error Cannot read properties of undefined (reading 'query'), which makes me believe that the plugin hasn't been registered, but I don't know how to do it.

fech-dev commented 1 year ago

I have the same problem, cannot access to any "global" plugin. I notice that the problem is only in the routes tests, while in plugins it works...

fech-dev commented 1 year ago

I've notice that the build() function does not wrap the app plugin (exported in src/app.ts) with fp() function. I've tried to apply fp function and I can access all decorators defined from routes tests. I don't know if this is intentional or not....

Hornwitser commented 10 months ago

I noticed the same, Wrapping the app into fastify-plugin was just randomly removed in #446 with this change https://github.com/fastify/fastify-cli/commit/6dfee4e393573031343c4b932f40c54b7a0f7f65#diff-d422baf24ac606e8462ae86c1d33235f3c9299defa513b127d36661e3d766e9dL20-R24. @Eomm why was this feature removed while confusingly keeping the comment that is clearly no longer correct?

FWIW I found a viable workaround by adding the following to the end of app.js, and then setting process.env.NODE_ENV = "testing" in test/helpers.js before it calls buildApplication.

if (process.env.NODE_ENV === "testing") {
  // Ensure tests can access all decorators
  app[Symbol.for("skip-override")] = true;
}
Eomm commented 10 months ago

If @Hornwitser found the issue, would you like to send a Pull Request to address this issue? Remember to add unit tests.

Hornwitser commented 10 months ago

I'm not sure how to solve this issue, I'm rather unfamiliar with fastify.

SumeetHaryani commented 10 months ago

@Eomm I would like to work on this issue.

Eomm commented 10 months ago

Go for it!

CorentinND commented 1 week ago

Any update on this ?

jean-michelet commented 1 week ago

Looking into it, there are perhaps several things to improve here. I think we should respect more open/close principle and allow users to decorate the app before ready is called.

jean-michelet commented 1 week ago

Maybe I should create a more general issue about refactoring, to make sure I understand how it (should) works, it could also be a lack of documentation.