| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397 |
- /**
- * @jest-environment node
- */
- import { renderToString } from '../src/renderToString'
- import {
- createApp,
- h,
- withDirectives,
- vShow,
- vModelText,
- vModelRadio,
- vModelCheckbox
- } from 'vue'
- describe('ssr: directives', () => {
- describe('template v-show', () => {
- test('basic', async () => {
- expect(
- await renderToString(
- createApp({
- template: `<div v-show="true"/>`
- })
- )
- ).toBe(`<div style=""></div>`)
- expect(
- await renderToString(
- createApp({
- template: `<div v-show="false"/>`
- })
- )
- ).toBe(`<div style="display:none;"></div>`)
- })
- test('with static style', async () => {
- expect(
- await renderToString(
- createApp({
- template: `<div style="color:red" v-show="false"/>`
- })
- )
- ).toBe(`<div style="color:red;display:none;"></div>`)
- })
- test('with dynamic style', async () => {
- expect(
- await renderToString(
- createApp({
- data: () => ({ style: { color: 'red' } }),
- template: `<div :style="style" v-show="false"/>`
- })
- )
- ).toBe(`<div style="color:red;display:none;"></div>`)
- })
- test('with static + dynamic style', async () => {
- expect(
- await renderToString(
- createApp({
- data: () => ({ style: { color: 'red' } }),
- template: `<div :style="style" style="font-size:12;" v-show="false"/>`
- })
- )
- ).toBe(`<div style="color:red;font-size:12;display:none;"></div>`)
- })
- })
- describe('template v-model', () => {
- test('text', async () => {
- expect(
- await renderToString(
- createApp({
- data: () => ({ text: 'hello' }),
- template: `<input v-model="text">`
- })
- )
- ).toBe(`<input value="hello">`)
- })
- test('radio', async () => {
- expect(
- await renderToString(
- createApp({
- data: () => ({ selected: 'foo' }),
- template: `<input type="radio" value="foo" v-model="selected">`
- })
- )
- ).toBe(`<input type="radio" value="foo" checked>`)
- expect(
- await renderToString(
- createApp({
- data: () => ({ selected: 'foo' }),
- template: `<input type="radio" value="bar" v-model="selected">`
- })
- )
- ).toBe(`<input type="radio" value="bar">`)
- // non-string values
- expect(
- await renderToString(
- createApp({
- data: () => ({ selected: 'foo' }),
- template: `<input type="radio" :value="{}" v-model="selected">`
- })
- )
- ).toBe(`<input type="radio">`)
- })
- test('checkbox', async () => {
- expect(
- await renderToString(
- createApp({
- data: () => ({ checked: true }),
- template: `<input type="checkbox" v-model="checked">`
- })
- )
- ).toBe(`<input type="checkbox" checked>`)
- expect(
- await renderToString(
- createApp({
- data: () => ({ checked: false }),
- template: `<input type="checkbox" v-model="checked">`
- })
- )
- ).toBe(`<input type="checkbox">`)
- expect(
- await renderToString(
- createApp({
- data: () => ({ checked: ['foo'] }),
- template: `<input type="checkbox" value="foo" v-model="checked">`
- })
- )
- ).toBe(`<input type="checkbox" value="foo" checked>`)
- expect(
- await renderToString(
- createApp({
- data: () => ({ checked: [] }),
- template: `<input type="checkbox" value="foo" v-model="checked">`
- })
- )
- ).toBe(`<input type="checkbox" value="foo">`)
- })
- test('textarea', async () => {
- expect(
- await renderToString(
- createApp({
- data: () => ({ foo: 'hello' }),
- template: `<textarea v-model="foo"/>`
- })
- )
- ).toBe(`<textarea>hello</textarea>`)
- })
- test('dynamic type', async () => {
- expect(
- await renderToString(
- createApp({
- data: () => ({ type: 'text', model: 'hello' }),
- template: `<input :type="type" v-model="model">`
- })
- )
- ).toBe(`<input type="text" value="hello">`)
- expect(
- await renderToString(
- createApp({
- data: () => ({ type: 'checkbox', model: true }),
- template: `<input :type="type" v-model="model">`
- })
- )
- ).toBe(`<input type="checkbox" checked>`)
- expect(
- await renderToString(
- createApp({
- data: () => ({ type: 'checkbox', model: false }),
- template: `<input :type="type" v-model="model">`
- })
- )
- ).toBe(`<input type="checkbox">`)
- expect(
- await renderToString(
- createApp({
- data: () => ({ type: 'checkbox', model: ['hello'] }),
- template: `<input :type="type" value="hello" v-model="model">`
- })
- )
- ).toBe(`<input type="checkbox" value="hello" checked>`)
- expect(
- await renderToString(
- createApp({
- data: () => ({ type: 'checkbox', model: [] }),
- template: `<input :type="type" value="hello" v-model="model">`
- })
- )
- ).toBe(`<input type="checkbox" value="hello">`)
- expect(
- await renderToString(
- createApp({
- data: () => ({ type: 'radio', model: 'hello' }),
- template: `<input :type="type" value="hello" v-model="model">`
- })
- )
- ).toBe(`<input type="radio" value="hello" checked>`)
- expect(
- await renderToString(
- createApp({
- data: () => ({ type: 'radio', model: 'hello' }),
- template: `<input :type="type" value="bar" v-model="model">`
- })
- )
- ).toBe(`<input type="radio" value="bar">`)
- })
- test('with v-bind', async () => {
- expect(
- await renderToString(
- createApp({
- data: () => ({
- obj: { type: 'radio', value: 'hello' },
- model: 'hello'
- }),
- template: `<input v-bind="obj" v-model="model">`
- })
- )
- ).toBe(`<input type="radio" value="hello" checked>`)
- })
- })
- describe('vnode v-show', () => {
- test('basic', async () => {
- expect(
- await renderToString(
- createApp({
- render() {
- return withDirectives(h('div'), [[vShow, true]])
- }
- })
- )
- ).toBe(`<div></div>`)
- expect(
- await renderToString(
- createApp({
- render() {
- return withDirectives(h('div'), [[vShow, false]])
- }
- })
- )
- ).toBe(`<div style="display:none;"></div>`)
- })
- test('with merge', async () => {
- expect(
- await renderToString(
- createApp({
- render() {
- return withDirectives(
- h('div', {
- style: {
- color: 'red'
- }
- }),
- [[vShow, false]]
- )
- }
- })
- )
- ).toBe(`<div style="color:red;display:none;"></div>`)
- })
- })
- describe('vnode v-model', () => {
- test('text', async () => {
- expect(
- await renderToString(
- createApp({
- render() {
- return withDirectives(h('input'), [[vModelText, 'hello']])
- }
- })
- )
- ).toBe(`<input value="hello">`)
- })
- test('radio', async () => {
- expect(
- await renderToString(
- createApp({
- render() {
- return withDirectives(
- h('input', { type: 'radio', value: 'hello' }),
- [[vModelRadio, 'hello']]
- )
- }
- })
- )
- ).toBe(`<input type="radio" value="hello" checked>`)
- expect(
- await renderToString(
- createApp({
- render() {
- return withDirectives(
- h('input', { type: 'radio', value: 'hello' }),
- [[vModelRadio, 'foo']]
- )
- }
- })
- )
- ).toBe(`<input type="radio" value="hello">`)
- })
- test('checkbox', async () => {
- expect(
- await renderToString(
- createApp({
- render() {
- return withDirectives(h('input', { type: 'checkbox' }), [
- [vModelCheckbox, true]
- ])
- }
- })
- )
- ).toBe(`<input type="checkbox" checked>`)
- expect(
- await renderToString(
- createApp({
- render() {
- return withDirectives(h('input', { type: 'checkbox' }), [
- [vModelCheckbox, false]
- ])
- }
- })
- )
- ).toBe(`<input type="checkbox">`)
- expect(
- await renderToString(
- createApp({
- render() {
- return withDirectives(
- h('input', { type: 'checkbox', value: 'foo' }),
- [[vModelCheckbox, ['foo']]]
- )
- }
- })
- )
- ).toBe(`<input type="checkbox" value="foo" checked>`)
- expect(
- await renderToString(
- createApp({
- render() {
- return withDirectives(
- h('input', { type: 'checkbox', value: 'foo' }),
- [[vModelCheckbox, []]]
- )
- }
- })
- )
- ).toBe(`<input type="checkbox" value="foo">`)
- })
- })
- test('custom directive w/ getSSRProps', async () => {
- expect(
- await renderToString(
- createApp({
- render() {
- return withDirectives(h('div'), [
- [
- {
- getSSRProps({ value }) {
- return { id: value }
- }
- },
- 'foo'
- ]
- ])
- }
- })
- )
- ).toBe(`<div id="foo"></div>`)
- })
- })
|