2019-11-05 07:32:53 +03:00
const should = require ( 'should' ) ;
const supertest = require ( 'supertest' ) ;
const ObjectId = require ( 'bson-objectid' ) ;
2019-11-08 07:37:53 +03:00
const testUtils = require ( '../../utils' ) ;
2019-11-05 07:32:53 +03:00
const localUtils = require ( './utils' ) ;
2020-05-27 20:47:53 +03:00
const config = require ( '../../../core/shared/config' ) ;
2020-04-20 14:47:12 +03:00
const models = require ( '../../../core/server/models/index' ) ;
2019-11-08 07:37:53 +03:00
2019-11-05 07:32:53 +03:00
const ghost = testUtils . startGhost ;
describe ( 'Email Preview API' , function ( ) {
2019-11-08 07:37:53 +03:00
let request ;
2019-11-05 07:32:53 +03:00
before ( function ( ) {
return ghost ( )
. then ( function ( _ghostServer ) {
request = supertest . agent ( config . get ( 'url' ) ) ;
} )
. then ( function ( ) {
return localUtils . doAuth ( request , 'users:extra' , 'posts' ) ;
} ) ;
} ) ;
describe ( 'Read' , function ( ) {
2019-11-08 07:37:53 +03:00
it ( 'can\'t retrieve for non existent post' , function ( done ) {
2019-11-05 07:32:53 +03:00
request . get ( localUtils . API . getApiQuery ( ` posts/ ${ ObjectId . generate ( ) } / ` ) )
. set ( 'Origin' , config . get ( 'url' ) )
. set ( 'Accept' , 'application/json' )
. expect ( 'Content-Type' , /json/ )
. expect ( 'Cache-Control' , testUtils . cacheRules . private )
. expect ( 404 )
. end ( function ( err , res ) {
if ( err ) {
return done ( err ) ;
}
should . not . exist ( res . headers [ 'x-cache-invalidate' ] ) ;
2020-04-29 18:44:27 +03:00
const jsonResponse = res . body ;
2019-11-05 07:32:53 +03:00
should . exist ( jsonResponse ) ;
should . exist ( jsonResponse . errors ) ;
testUtils . API . checkResponseValue ( jsonResponse . errors [ 0 ] , [
'message' ,
'context' ,
'type' ,
'details' ,
'property' ,
'help' ,
'code' ,
'id'
] ) ;
done ( ) ;
} ) ;
} ) ;
it ( 'can read post email preview with fields' , function ( ) {
return request
2019-11-05 08:13:53 +03:00
. get ( localUtils . API . getApiQuery ( ` email_preview/posts/ ${ testUtils . DataGenerator . Content . posts [ 0 ] . id } / ` ) )
2019-11-05 07:32:53 +03:00
. set ( 'Origin' , config . get ( 'url' ) )
. set ( 'Accept' , 'application/json' )
. expect ( 'Content-Type' , /json/ )
. expect ( 'Cache-Control' , testUtils . cacheRules . private )
. expect ( 200 )
. then ( ( res ) => {
2019-11-05 08:13:53 +03:00
should . not . exist ( res . headers [ 'x-cache-invalidate' ] ) ;
const jsonResponse = res . body ;
should . exist ( jsonResponse ) ;
should . exist ( jsonResponse . email _previews ) ;
localUtils . API . checkResponse ( jsonResponse . email _previews [ 0 ] , 'email_preview' , null , null ) ;
2019-11-05 07:32:53 +03:00
} ) ;
} ) ;
2020-04-20 14:47:12 +03:00
it ( 'can read post email preview with email card and replacements' , function ( ) {
const post = testUtils . DataGenerator . forKnex . createPost ( {
id : ObjectId . generate ( ) ,
title : 'Post with email-only card' ,
slug : 'email-only-card' ,
2020-04-20 16:25:58 +03:00
mobiledoc : '{"version":"0.3.1","atoms":[],"cards":[["email",{"html":"<p>Hey {first_name \\"there\\"} {unknown}</p><p><strong>Welcome to your first Ghost email!</strong></p>"}],["email",{"html":"<p>Another email card with a similar replacement, {first_name, \\"see?\\"}</p>"}]],"markups":[],"sections":[[10,0],[1,"p",[[0,[],0,"This is the actual post content..."]]],[10,1],[1,"p",[]]]}' ,
2020-04-20 14:47:12 +03:00
html : '<p>This is the actual post content...</p>' ,
plaintext : 'This is the actual post content...' ,
status : 'draft' ,
uuid : 'd52c42ae-2755-455c-80ec-70b2ec55c904'
} ) ;
return models . Post . add ( post , { context : { internal : true } } ) . then ( ( ) => {
return request
. get ( localUtils . API . getApiQuery ( ` email_preview/posts/ ${ post . id } / ` ) )
. set ( 'Origin' , config . get ( 'url' ) )
. set ( 'Accept' , 'application/json' )
. expect ( 'Content-Type' , /json/ )
. expect ( 'Cache-Control' , testUtils . cacheRules . private )
. expect ( 200 )
. then ( ( res ) => {
should . not . exist ( res . headers [ 'x-cache-invalidate' ] ) ;
const jsonResponse = res . body ;
should . exist ( jsonResponse ) ;
should . exist ( jsonResponse . email _previews ) ;
jsonResponse . email _previews [ 0 ] . html . should . match ( /Hey there {unknown}/ ) ;
jsonResponse . email _previews [ 0 ] . html . should . match ( /Welcome to your first Ghost email!/ ) ;
jsonResponse . email _previews [ 0 ] . html . should . match ( /This is the actual post content\.\.\./ ) ;
jsonResponse . email _previews [ 0 ] . html . should . match ( /Another email card with a similar replacement, see\?/ ) ;
jsonResponse . email _previews [ 0 ] . plaintext . should . match ( /Hey there {unknown}/ ) ;
jsonResponse . email _previews [ 0 ] . plaintext . should . match ( /Welcome to your first Ghost email!/ ) ;
jsonResponse . email _previews [ 0 ] . plaintext . should . match ( /This is the actual post content\.\.\./ ) ;
jsonResponse . email _previews [ 0 ] . plaintext . should . match ( /Another email card with a similar replacement, see\?/ ) ;
} ) ;
} ) ;
} ) ;
2020-08-12 21:46:25 +03:00
it ( 'has custom content transformations for email compatibility' , function ( ) {
const post = testUtils . DataGenerator . forKnex . createPost ( {
id : ObjectId . generate ( ) ,
title : 'Post with email-only card' ,
slug : 'email-only-card' ,
mobiledoc : '{"version":"0.3.1","atoms":[],"cards":[],"markups":[],"sections":[[1,"p",[[0,[],0,"This is the actual post content... With an apostrophy: \'"]]],[1,"p",[]]]}' ,
html : '<p>This is the actual post content...</p>' ,
plaintext : 'This is the actual post content...' ,
status : 'draft' ,
uuid : 'd52c42ae-2755-455c-80ec-70b2ec55c904'
} ) ;
return models . Post . add ( post , { context : { internal : true } } ) . then ( ( ) => {
return request
. get ( localUtils . API . getApiQuery ( ` email_preview/posts/ ${ post . id } / ` ) )
. set ( 'Origin' , config . get ( 'url' ) )
. set ( 'Accept' , 'application/json' )
. expect ( 'Content-Type' , /json/ )
. expect ( 'Cache-Control' , testUtils . cacheRules . private )
. expect ( 200 )
. then ( ( res ) => {
should . not . exist ( res . headers [ 'x-cache-invalidate' ] ) ;
const jsonResponse = res . body ;
should . exist ( jsonResponse ) ;
should . exist ( jsonResponse . email _previews ) ;
jsonResponse . email _previews [ 0 ] . html . should . match ( /'/ ) ;
jsonResponse . email _previews [ 0 ] . html . should . not . match ( /'/ ) ;
} ) ;
} ) ;
} ) ;
2019-11-05 07:32:53 +03:00
} ) ;
2020-05-28 11:56:53 +03:00
describe ( 'As Owner' , function ( ) {
it ( 'can send test email' , function ( ) {
const url = localUtils . API . getApiQuery ( ` email_preview/posts/ ${ testUtils . DataGenerator . Content . posts [ 0 ] . id } / ` ) ;
return request
. post ( url )
. set ( 'Origin' , config . get ( 'url' ) )
. send ( {
emails : [ 'test@ghost.org' ]
} )
. set ( 'Accept' , 'application/json' )
. expect ( 'Content-Type' , /json/ )
. expect ( 'Cache-Control' , testUtils . cacheRules . private )
. expect ( 200 ) ;
} ) ;
} ) ;
describe ( 'As Admin' , function ( ) {
before ( function ( ) {
testUtils . createUser ( {
user : testUtils . DataGenerator . forKnex . createUser ( { email : 'admin+1@ghost.org' } ) ,
role : testUtils . DataGenerator . Content . roles [ 0 ] . name
} ) . then ( ( user ) => {
request . user = user ;
return localUtils . doAuth ( request ) ;
} ) ;
} ) ;
it ( 'can send test email' , function ( ) {
const url = localUtils . API . getApiQuery ( ` email_preview/posts/ ${ testUtils . DataGenerator . Content . posts [ 0 ] . id } / ` ) ;
return request
. post ( url )
. set ( 'Origin' , config . get ( 'url' ) )
. send ( {
emails : [ 'test@ghost.org' ]
} )
. set ( 'Accept' , 'application/json' )
. expect ( 'Content-Type' , /json/ )
. expect ( 'Cache-Control' , testUtils . cacheRules . private )
. expect ( 200 ) ;
} ) ;
} ) ;
describe ( 'As Editor' , function ( ) {
before ( function ( ) {
return testUtils . createUser ( {
user : testUtils . DataGenerator . forKnex . createUser ( {
email : 'test+editor@ghost.org'
} ) ,
role : testUtils . DataGenerator . Content . roles [ 1 ] . name
} ) . then ( ( user ) => {
request . user = user ;
return localUtils . doAuth ( request ) ;
} ) ;
} ) ;
it ( 'can send test email' , function ( ) {
const url = localUtils . API . getApiQuery ( ` email_preview/posts/ ${ testUtils . DataGenerator . Content . posts [ 0 ] . id } / ` ) ;
return request
. post ( url )
. set ( 'Origin' , config . get ( 'url' ) )
. send ( {
emails : [ 'test@ghost.org' ]
} )
. set ( 'Accept' , 'application/json' )
. expect ( 'Content-Type' , /json/ )
. expect ( 'Cache-Control' , testUtils . cacheRules . private )
. expect ( 200 ) ;
} ) ;
} ) ;
describe ( 'As Author' , function ( ) {
before ( function ( ) {
return testUtils . createUser ( {
user : testUtils . DataGenerator . forKnex . createUser ( {
email : 'test+author@ghost.org'
} ) ,
role : testUtils . DataGenerator . Content . roles [ 2 ] . name
} ) . then ( ( user ) => {
request . user = user ;
return localUtils . doAuth ( request ) ;
} ) ;
} ) ;
it ( 'cannot send test email' , function ( ) {
const url = localUtils . API . getApiQuery ( ` email_preview/posts/ ${ testUtils . DataGenerator . Content . posts [ 0 ] . id } / ` ) ;
return request
. post ( url )
. set ( 'Origin' , config . get ( 'url' ) )
. send ( {
emails : [ 'test@ghost.org' ]
} )
. set ( 'Accept' , 'application/json' )
. expect ( 'Content-Type' , /json/ )
. expect ( 'Cache-Control' , testUtils . cacheRules . private )
. expect ( 403 ) ;
} ) ;
} ) ;
2019-11-05 07:32:53 +03:00
} ) ;