问题描述
Okey,这是repo
我要做什么:测试受保护的路由。
当前,应用的安全性是通过护照来处理的,其策略为:graphql-passport
。
我通过超级测试(针对请求)和笑话来运行我的休息
构建Apollo服务器时,我使用它来创建上下文:
import { buildContext } from 'graphql-passport';
const server = new ApolloServer({
typeDefs,resolvers,context: ({ req,res }) => {
return buildContext({ req,res,User })
},playground: {
settings: {
'request.credentials': 'same-origin',},});
这使我可以从请求中吸引用户。像使用护照进行身份验证一样。
passport.use(
new GraphQLLocalStrategy((email,password,next) => {
console.log(`? GraphQLLocalStrategy ${email} ? ?♂`)
User.findOne({ email })
.then(user => !user
? next(null,false,'Invalid email or password')
: user.checkPassword(password) //bcrypt
.then(match => !match
? next(null,'Invalid email or password')
: next(null,user)
)
)
.catch(error => next(error))
}),);
到目前为止,它已经足够好了。对于我运行的每个测试,我都可以看到自己的? GraphQLLocalStrategy ${email} ? ?♂
被调用。好!
对于某些突变,例如登录和更新用户个人资料,我能够做到这一点: user.mutations.test.js
// * Login for add the user in the context
agent
.post("/graphql")
.send({ query: ` mutation {
${loginQuery(email)}
${updateFirstName}
}`})
.set("Accept","application/json")
.end((err,{body:{data,errors}}) => {
if (err) return done(err);
const {updateUser} = data;
expect(updateUser).toBeInstanceOf(Object);
expect(updateUser.email).toBe(email);
expect(updateUser.firstName).toBe(newName);
expect(updateUser.rol).toBe("patron");
UserFields.map(checkFields(updateUser));
done();
})
因此,在一个查询中,我可以发送登录突变,然后运行更新的名字突变。两者都很有效,并且根据护照的要求,我已经登录并且可以更新用户个人资料。
出了什么问题??我要运行日志记录变异,然后运行查询以获取所有用户。 >
但是,当然,我不能在request(app).post("/graphql").send()
中同时运行两个变量,它必须是一个或多个突变或一个查询……但不能同时运行。
另一个无效的想法是运行一个,然后在响应中运行第二个,如下所示:
const agent = request(app);
agent
.post("/graphql")
.send({ query: `mutation { ${loginQuery(email)} }`})
.end((err,{body:{data}}) => {
if (err) return done(err);
agent
.post("/graphql")
.send({ query: `query { getGuestsQuery() }`})
...
如果我尝试在第二次请求中请求一条受保护的路由,则无法知道我是否已通过身份验证,至少不是自动进行... 我可以在此处使用超级测试进行身份验证请求
**我如何告诉我的测试应用程序我已通过身份验证???? **
解决方法
test("fetch all Guests",async (done) => {
const userAdmin = await User.findOne({rol:"admin"}).exec();
if(!userAdmin) return done('no admin users for testing');
const agent = request.agent(app);
agent
.post('/graphql')
.send({ query: ` mutation { ${loginQuery(userAdmin.email)} }`})
.expect(200)
.end((err,res) => {
if (err) return done(err);
agent
.post("/graphql")
.send({query: `{ getGuests { ${GuestInput.join(' ')} } }`})
.set("Accept","application/json")
.expect("Content-Type",/json/)
.expect(200)
.end((err,{body:{data}}) => {
if (err) return done(err);
expect(data).toBeInstanceOf(Object);
const {getGuests} = data;
expect(getGuests).toBeInstanceOf(Array);
getGuests.map(user => GuestInput.map(checkFields(user)))
done();
});
});
});