@@ -2020,6 +2020,53 @@ describe('form schema', () => {
20202020 </h:body>
20212021</h:html>` ) ) ) ;
20222022
2023+ const arabicWord = 'صادق' ;
2024+ [
2025+ /* eslint-disable no-multi-spaces, key-spacing */
2026+ { versionAttribute : '' , suffix : 'test' , expected : 'test' } ,
2027+ { versionAttribute : 'version=""' , suffix : 'test' , expected : 'test' } ,
2028+ { versionAttribute : 'version="first"' , suffix : '' , expected : 'first' } ,
2029+ { versionAttribute : 'version=\'first\'' , suffix : 'test' , expected : 'firsttest' } ,
2030+ { versionAttribute : 'version="2.1"' , suffix : 'test' , expected : '2.1test' } ,
2031+ { versionAttribute : 'version = "final"' , suffix : ' (working)' , expected : 'final (working)' } ,
2032+ { versionAttribute : 'version=1' , suffix : '.0' , expected : '1.0' } ,
2033+ { versionAttribute : 'version=1.0' , suffix : '.1' , expected : '1.0.1' } ,
2034+ { versionAttribute : 'version=1' , suffix : '_final' , expected : '1_final' } ,
2035+ { versionAttribute : 'version="john\'s copy"' , suffix : '_final' , expected : 'john's copy_final' } ,
2036+ { versionAttribute : 'version="final"' , suffix : ' "working"' , expected : 'final "working"' } ,
2037+ { versionAttribute : 'version="emoji 🙃"' , suffix : ' twice 🙃' , expected : 'emoji 🙃 twice 🙃' } ,
2038+ { versionAttribute : `version="${ arabicWord } "` , suffix : arabicWord , expected : 'صادقصادق' } ,
2039+ {
2040+ versionAttribute : 'version="!@#$%^&*()_+=-`~[]\\{}|":'<>?/.,"' ,
2041+ suffix : '!@#$%^&*()_+=-`~[]\\{}|":\'<>?/.,' ,
2042+ expected : '!@#$%^&*()_+=-`~[]\\{}|":'<>?/.,!@#$%^&*()_+=-`~[]\\{}|":'<>?/.,'
2043+ } ,
2044+ /* eslint-enable no-multi-spaces, key-spacing */
2045+ ] . forEach ( ( { versionAttribute, suffix, expected } ) => {
2046+ it ( `should have ${ expected } version` , ( ) =>
2047+ addVersionSuffix ( testData . forms . simple2 . replace ( 'version="2.1"' , versionAttribute ) , suffix )
2048+ . then ( result => {
2049+ // we always return version with "" delimiter
2050+ result . match ( / ( v e r s i o n = " ( .* ) " ) / ) [ 2 ] . should . be . equal ( expected ) ;
2051+ } )
2052+ ) ;
2053+ } ) ;
2054+
2055+
2056+ it ( 'should suffix an existing version attribute even if it uses single quote to delimit version text' , ( ) =>
2057+ addVersionSuffix ( testData . forms . simple2 . replace ( 'version="2.1"' , "version='2.1\"final\"'" ) , 'testtest' )
2058+ . then ( result => {
2059+ result . includes ( 'version="2.1"final"testtest"' ) . should . be . true ( ) ;
2060+ } )
2061+ ) ;
2062+
2063+ it ( 'should suffix an existing version attribute even if it uses single quote to delimit version text' , ( ) =>
2064+ addVersionSuffix ( testData . forms . simple2 . replace ( 'version="2.1"' , 'version=1.0' ) , '.1' )
2065+ . then ( result => {
2066+ result . includes ( 'version="1.0.1"' ) . should . be . true ( ) ;
2067+ } )
2068+ ) ;
2069+
20232070 it ( 'should suffix an existing namespaced version attribute' , ( ) =>
20242071 addVersionSuffix ( testData . forms . simple2 . replace ( 'version' , 'orx:version' ) , 'testtest' ) . then ( ( result ) => result . should . equal ( `<h:html xmlns="http://www.w3.org/2002/xforms" xmlns:h="http://www.w3.org/1999/xhtml" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:jr="http://openrosa.org/javarosa">
20252072 <h:head>
@@ -2156,6 +2203,44 @@ describe('form schema', () => {
21562203 </input>
21572204 </h:body>
21582205</h:html>` ) ) ) ;
2206+
2207+ const arabicWord = 'صادق' ;
2208+ [
2209+ /* eslint-disable no-multi-spaces, key-spacing */
2210+ { versionAttribute : '' , newVersion : 'test' , expected : 'test' } ,
2211+ { versionAttribute : 'version=""' , newVersion : 'test' , expected : 'test' } ,
2212+ { versionAttribute : 'version="first"' , newVersion : '' , expected : '' } ,
2213+ { versionAttribute : 'version=\'first\'' , newVersion : 'test' , expected : 'test' } ,
2214+ { versionAttribute : 'version="2.1"' , newVersion : 'test' , expected : 'test' } ,
2215+ { versionAttribute : 'version = "final"' , newVersion : '(working)' , expected : '(working)' } ,
2216+ { versionAttribute : 'version=1' , newVersion : '1.0' , expected : '1.0' } ,
2217+ { versionAttribute : 'version=1.0' , newVersion : '2.0' , expected : '2.0' } ,
2218+ { versionAttribute : 'version=1' , newVersion : 'final' , expected : 'final' } ,
2219+ { versionAttribute : 'version="john\'s copy"' , newVersion : 'jane\'s copy' , expected : 'jane's copy' } ,
2220+ { versionAttribute : 'version="final"' , newVersion : '"working"' , expected : '"working"' } ,
2221+ { versionAttribute : 'version="emoji 🙃"' , newVersion : '🙃 🙃' , expected : '🙃 🙃' } ,
2222+ { versionAttribute : `version="sadiq"` , newVersion : arabicWord , expected : 'صادق' } ,
2223+ {
2224+ // getodk/central#1470
2225+ versionAttribute : 'version="!@#$%^&*()_+=-`~[]\\{}|":'<>?/.,"' ,
2226+ newVersion : 'clean' ,
2227+ expected : 'clean'
2228+ } ,
2229+ {
2230+ versionAttribute : 'version="clean"' ,
2231+ newVersion : '!@#$%^&*()_+=-`~[]\\{}|":\'<>?/.,' ,
2232+ expected : '!@#$%^&*()_+=-`~[]\\{}|":'<>?/.,'
2233+ } ,
2234+ /* eslint-enable no-multi-spaces, key-spacing */
2235+ ] . forEach ( ( { versionAttribute, newVersion, expected } ) => {
2236+ it ( `should have ${ expected } version` , ( ) =>
2237+ setVersion ( testData . forms . simple2 . replace ( 'version="2.1"' , versionAttribute ) , newVersion )
2238+ . then ( result => {
2239+ // we always return version with "" delimiter
2240+ result . match ( / ( v e r s i o n = " ( .* ) " ) / ) [ 2 ] . should . be . equal ( expected ) ;
2241+ } )
2242+ ) ;
2243+ } ) ;
21592244 } ) ;
21602245
21612246 describe ( 'updateEntityForm' , ( ) => {
0 commit comments