90 lines
2.6 KiB
TypeScript
90 lines
2.6 KiB
TypeScript
import { describe, it, expect, vi, beforeEach } from 'vitest'
|
|
import { mount } from '@vue/test-utils'
|
|
import { createVuetify } from 'vuetify'
|
|
import * as components from 'vuetify/components'
|
|
import * as directives from 'vuetify/directives'
|
|
import RecipeDisplay from '../app/components/RecipeDisplay.vue'
|
|
|
|
const vuetify = createVuetify({
|
|
components,
|
|
directives,
|
|
})
|
|
|
|
describe('RecipeDisplay.vue', () => {
|
|
const mockRecipe = {
|
|
title: 'Bakery-Style Muffins',
|
|
description: 'Fresh from the oven.',
|
|
ingredients: ['2 cups flour', '1 cup sugar'],
|
|
instructions: ['Preheat oven', 'Bake muffins'],
|
|
imageUrl: 'data:image/png;base64,header_captured_image'
|
|
}
|
|
|
|
it('renders the title and all ingredients correctly', () => {
|
|
const wrapper = mount(RecipeDisplay, {
|
|
props: { recipe: mockRecipe },
|
|
global: { plugins: [vuetify] }
|
|
})
|
|
|
|
expect(wrapper.find('.recipe-title').text()).toBe('Bakery-Style Muffins')
|
|
|
|
const ingredientItems = wrapper.findAll('.ingredient-item')
|
|
expect(ingredientItems).toHaveLength(2)
|
|
expect(ingredientItems[0].text()).toContain('2 cups flour')
|
|
})
|
|
|
|
it('displays the recipe image when imageUrl is provided', () => {
|
|
const wrapper = mount(RecipeDisplay, {
|
|
props: { recipe: mockRecipe },
|
|
global: { plugins: [vuetify] }
|
|
})
|
|
|
|
const img = wrapper.findComponent({ name: 'VImg' })
|
|
expect(img.exists()).toBe(true)
|
|
expect(img.props('src')).toBe(mockRecipe.imageUrl)
|
|
})
|
|
|
|
it('emits "save" when the save button is clicked', async () => {
|
|
const wrapper = mount(RecipeDisplay, {
|
|
props: {
|
|
recipe: mockRecipe,
|
|
isSaving: false,
|
|
hasSaved: false
|
|
},
|
|
global: {
|
|
plugins: [vuetify]
|
|
}
|
|
})
|
|
|
|
const saveBtn = wrapper.find('.save-recipe-btn')
|
|
await saveBtn.trigger('click')
|
|
|
|
expect(wrapper.emitted()).toHaveProperty('save')
|
|
})
|
|
|
|
it('shows the "Saved in Archives" state when hasSaved is true', async () => {
|
|
const recipe = { title: 'Bakery-Style Muffins', ingredients: [], instructions: [] }
|
|
const wrapper = mount(RecipeDisplay, {
|
|
props: {
|
|
recipe,
|
|
hasSaved: true
|
|
},
|
|
global: { plugins: [vuetify] }
|
|
})
|
|
|
|
expect(wrapper.text()).toContain('Saved in Archives')
|
|
})
|
|
|
|
it('triggers the browser print dialog when the print button is clicked', async () => {
|
|
const printSpy = vi.spyOn(window, 'print').mockImplementation(() => {})
|
|
|
|
const wrapper = mount(RecipeDisplay, {
|
|
props: { recipe: mockRecipe },
|
|
global: { plugins: [vuetify] }
|
|
})
|
|
|
|
const printBtn = wrapper.find('.print-btn')
|
|
await printBtn.trigger('click')
|
|
|
|
expect(printSpy).toHaveBeenCalled()
|
|
})
|
|
}) |