feat: add group recipe sharing and translation

This commit is contained in:
2026-08-14 16:46:01 +09:00
parent 146e78cddf
commit 4491c91455
13 changed files with 170 additions and 19 deletions
+56 -1
View File
@@ -6,15 +6,17 @@ import { SESSION_COOKIE_NAME } from '../src/plugins/auth.js';
import {
createTestConfig,
FakeAllowedEmailRepository,
FakeGroupRepository,
FakeRecipeRepository,
fakeUserRepository,
recipeDraft,
source,
} from './helpers/fakes.js';
function createDependencies(recipeRepository) {
function createDependencies(recipeRepository, groupRepository = new FakeGroupRepository()) {
return {
allowedEmailRepository: new FakeAllowedEmailRepository(),
groupRepository,
recipeRepository,
userRepository: fakeUserRepository,
sourceExtractor: { extract: async () => source },
@@ -336,3 +338,56 @@ test('import preview와 소유자별 Recipe CRUD가 이어진다', async (t) =>
});
assert.equal(deleteResponse.statusCode, 204);
});
test('같은 그룹 사용자는 레시피를 함께 조회하지만 작성자만 수정하고 삭제한다', async (t) => {
const recipeRepository = new FakeRecipeRepository();
const groupRepository = new FakeGroupRepository([
{ memberGoogleSubs: ['google-user-1', 'google-user-2'] },
]);
const app = await buildApp({
config: createTestConfig(),
dependencies: createDependencies(recipeRepository, groupRepository),
});
t.after(() => app.close());
const createResponse = await app.inject({
method: 'POST',
url: '/api/recipes',
headers: { cookie: authCookie(app, 'google-user-1') },
payload: { recipe: recipeDraft, source },
});
assert.equal(createResponse.statusCode, 201);
const created = createResponse.json().recipe;
const sharedListResponse = await app.inject({
method: 'GET',
url: '/api/recipes',
headers: { cookie: authCookie(app, 'google-user-2') },
});
assert.deepEqual(
sharedListResponse.json().recipes.map((recipe) => recipe._id),
[created._id],
);
const sharedDetailResponse = await app.inject({
method: 'GET',
url: `/api/recipes/${created._id}`,
headers: { cookie: authCookie(app, 'google-user-2') },
});
assert.equal(sharedDetailResponse.statusCode, 200);
const updateResponse = await app.inject({
method: 'PATCH',
url: `/api/recipes/${created._id}`,
headers: { cookie: authCookie(app, 'google-user-2') },
payload: { title: '다른 사용자의 수정' },
});
assert.equal(updateResponse.statusCode, 404);
const deleteResponse = await app.inject({
method: 'DELETE',
url: `/api/recipes/${created._id}`,
headers: { cookie: authCookie(app, 'google-user-2') },
});
assert.equal(deleteResponse.statusCode, 404);
});