%PDF- %PDF-
Mini Shell

Mini Shell

Direktori : /home/opti/workflow/node_modules/aws-sdk/test/xml/
Upload File :
Create Path :
Current File : /home/opti/workflow/node_modules/aws-sdk/test/xml/builder.spec.coffee

helpers = require('../helpers')
AWS = helpers.AWS
matchXML = helpers.matchXML

describe 'AWS.XML.Builder', ->

  xmlns = 'http://mockservice.com/xmlns'
  api = null

  beforeEach ->
    api = new AWS.Model.Api metadata: xmlNamespace: xmlns

  toXML = (rules, params) ->
    rules.type = 'structure'
    shape = AWS.Model.Shape.create(rules, api: api)

    builder = new AWS.XML.Builder()
    builder.toXML(params, shape, 'Data')

  describe 'toXML', ->
    it 'wraps simple structures with location of body', ->
      rules = members: { Name:{}, State:{} }
      params = { Name:'abc', State: 'Enabled' }
      xml = """
      <Data xmlns="#{xmlns}">
        <Name>abc</Name>
        <State>Enabled</State>
      </Data>
      """
      matchXML(toXML(rules, params), xml)

    it 'ignores null input', ->
      rules = members: { Name:{}, State:{} }
      params = { Name:null, State:undefined }
      xml = ''
      matchXML(toXML(rules, params), xml)

    it 'ignores nested null input', ->
      rules = members: {Struct:{type: 'structure', members: {State:{}}}}
      params = { Struct: { State: null } }
      xml = """
      <Data xmlns="#{xmlns}">
        <Struct/>
      </Data>
      """
      matchXML(toXML(rules, params), xml)

    it 'orders xml members by the order they appear in the rules', ->
      rules = xmlOrder: ['Count', 'State'], members: {Count:{type:'integer'},State:{}}
      params = { State: 'Disabled', Count: 123 }
      xml = """
      <Data xmlns="#{xmlns}">
        <Count>123</Count>
        <State>Disabled</State>
      </Data>
      """
      matchXML(toXML(rules, params), xml)

    it 'can serializes structures into XML', ->
      rules = members:
        Name: {}
        Details:
          type: 'structure'
          members:
            Abc: {}
            Xyz: {}
      params =
        Details:
          Xyz: 'xyz'
          Abc: 'abc'
        Name: 'john'
      xml = """
      <Data xmlns="#{xmlns}">
        <Name>john</Name>
        <Details>
          <Abc>abc</Abc>
          <Xyz>xyz</Xyz>
        </Details>
      </Data>
      """
      matchXML(toXML(rules, params), xml)

    it 'serializes empty structures as empty element', ->
      rules = {members:{Config:{type:'structure',members:{Foo:{},Bar:{}}}}}
      params = { Config: {} }
      xml = """
      <Data xmlns="#{xmlns}">
        <Config/>
      </Data>
      """
      matchXML(toXML(rules, params), xml)

    it 'does not serialize missing members', ->
      rules = {members:{Config:{type:'structure',members:{Foo:{},Bar:{}}}}}
      params = { Config: { Foo: 'abc' } }
      xml = """
      <Data xmlns="#{xmlns}">
        <Config>
          <Foo>abc</Foo>
        </Config>
      </Data>
      """
      matchXML(toXML(rules, params), xml)

  describe 'lists', ->

    it 'serializes lists (default member names)', ->
      rules = {members:{Aliases:{type:'list',member:{}}}}
      params = {Aliases:['abc','mno','xyz']}
      xml = """
      <Data xmlns="#{xmlns}">
        <Aliases>
          <member>abc</member>
          <member>mno</member>
          <member>xyz</member>
        </Aliases>
      </Data>
      """
      matchXML(toXML(rules, params), xml)

    it 'serializes lists (custom member names)', ->
      rules = {members:{Aliases:{type:'list',member:{locationName:'Alias'}}}}
      params = {Aliases:['abc','mno','xyz']}
      xml = """
      <Data xmlns="#{xmlns}">
        <Aliases>
          <Alias>abc</Alias>
          <Alias>mno</Alias>
          <Alias>xyz</Alias>
        </Aliases>
      </Data>
      """
      matchXML(toXML(rules, params), xml)

    it 'includes lists elements even if they have no members', ->
      rules = {members:{Aliases:{type:'list',member:{locationName:'Alias'}}}}
      params = {Aliases:[]}
      xml = """
      <Data xmlns="#{xmlns}">
        <Aliases/>
      </Data>
      """
      matchXML(toXML(rules, params), xml)

    it 'serializes lists of structures', ->
      rules = members:
        Points:
          type: 'list'
          member:
            type: 'structure'
            locationName: 'Point'
            members:
              X: {type:'float'}
              Y: {type:'float'}
      params = {Points:[{X:1.2,Y:2.1},{X:3.4,Y:4.3}]}
      xml = """
      <Data xmlns="#{xmlns}">
        <Points>
          <Point>
            <X>1.2</X>
            <Y>2.1</Y>
          </Point>
          <Point>
            <X>3.4</X>
            <Y>4.3</Y>
          </Point>
        </Points>
      </Data>
      """
      matchXML(toXML(rules, params), xml)

  describe 'flattened lists', ->

    it 'serializes lists without a base wrapper', ->
      rules = {members:{Aliases:{type:'list',flattened:true,member:{}}}}
      params = {Aliases:['abc','mno','xyz']}
      xml = """
      <Data xmlns="#{xmlns}">
        <Aliases>abc</Aliases>
        <Aliases>mno</Aliases>
        <Aliases>xyz</Aliases>
      </Data>
      """
      matchXML(toXML(rules, params), xml)

    it 'serializes lists (custom member names)', ->
      rules = members: {Aliases:{type:'list',flattened:true,member:{locationName:'Alias'}}}
      params = {Aliases:['abc','mno','xyz']}
      xml = """
      <Data xmlns="#{xmlns}">
        <Alias>abc</Alias>
        <Alias>mno</Alias>
        <Alias>xyz</Alias>
      </Data>
      """
      matchXML(toXML(rules, params), xml)

    it 'omits lists elements when no members are given', ->
      rules = {members:{Aliases:{type:'list',flattened:true,member:{locationName:'Alias'}}}}
      params = {Aliases:[]}
      xml = ''
      matchXML(toXML(rules, params), xml)

    it 'serializes lists of structures', ->
      rules = members:
        Points:
          type: 'list'
          flattened: true
          name: 'Point'
          member:
            type: 'structure'
            locationName: 'Point'
            members:
              X: {type:'float'}
              Y: {type:'float'}
      params = {Points:[{X:1.2,Y:2.1},{X:3.4,Y:4.3}]}
      xml = """
      <Data xmlns="#{xmlns}">
        <Point>
          <X>1.2</X>
          <Y>2.1</Y>
        </Point>
        <Point>
          <X>3.4</X>
          <Y>4.3</Y>
        </Point>
      </Data>
      """
      matchXML(toXML(rules, params), xml)

  describe 'maps', ->
    rules =
      type: 'structure'
      members:
        Items:
          type: 'map'
          key: type: 'string'
          value: type: 'string'

    it 'translates maps', ->
      params = { Items: { A: 'a', B: 'b' } }
      xml = """
      <Data xmlns="#{xmlns}">
        <Items>
          <entry>
            <key>A</key>
            <value>a</value>
          </entry>
          <entry>
            <key>B</key>
            <value>b</value>
          </entry>
        </Items>
      </Data>
      """
      matchXML(toXML(rules, params), xml)

    it 'allows renamed map keys and values', ->
      params = { Items: { A: 'a', B: 'b' } }
      otherRules =
        type: 'structure'
        members:
          Items:
            type: 'map'
            key: type: 'string', locationName: 'MKEY'
            value: type: 'string', locationName: 'MVALUE'
      xml = """
      <Data xmlns="#{xmlns}">
        <Items>
          <entry>
            <MKEY>A</MKEY>
            <MVALUE>a</MVALUE>
          </entry>
          <entry>
            <MKEY>B</MKEY>
            <MVALUE>b</MVALUE>
          </entry>
        </Items>
      </Data>
      """
      matchXML(toXML(otherRules, params), xml)

    it 'ignores null', ->
      expect(toXML(rules, Items: null)).toEqual('')

    it 'ignores undefined', ->
      expect(toXML(rules, Items: undefined)).toEqual('')

  describe 'flattened maps', ->
    rules =
      type: 'structure'
      members:
        Items:
          type: 'map'
          locationName: 'Item'
          flattened: true
          key: type: 'string'
          value: type: 'string'

    it 'translates flattened maps', ->
      params = { Items: { A: 'a', B: 'b' } }
      xml = """
      <Data xmlns="#{xmlns}">
        <Item>
          <key>A</key>
          <value>a</value>
        </Item>
        <Item>
          <key>B</key>
          <value>b</value>
        </Item>
      </Data>
      """
      matchXML(toXML(rules, params), xml)

    it 'allows renamed map keys and values', ->
      params = { Items: { A: 'a', B: 'b' } }
      otherRules =
        type: 'structure'
        members:
          Items:
            locationName: 'Item'
            flattened: true
            type: 'map'
            key: type: 'string', locationName: 'MKEY'
            value: type: 'string', locationName: 'MVALUE'
      xml = """
      <Data xmlns="#{xmlns}">
        <Item>
          <MKEY>A</MKEY>
          <MVALUE>a</MVALUE>
        </Item>
        <Item>
          <MKEY>B</MKEY>
          <MVALUE>b</MVALUE>
        </Item>
      </Data>
      """
      matchXML(toXML(otherRules, params), xml)

    it 'ignores null', ->
      expect(toXML(rules, Items: null)).toEqual('')

    it 'ignores undefined', ->
      expect(toXML(rules, Items: undefined)).toEqual('')

  describe 'numbers', ->

    it 'integers', ->
      rules = members: {Count:{type:'integer'}}
      params = { Count: 123.0 }
      xml = """
      <Data xmlns="#{xmlns}">
        <Count>123</Count>
      </Data>
      """
      matchXML(toXML(rules, params), xml)

    it 'floats', ->
      rules = members: {Count:{type:'float'}}
      params = { Count: 123.123 }
      xml = """
      <Data xmlns="#{xmlns}">
        <Count>123.123</Count>
      </Data>
      """
      matchXML(toXML(rules, params), xml)

    it 'ints and floats formatted as numbers', ->
      rules = members: {CountI:{type:'integer'},CountF:{type:'float'}}
      params = { CountI: '123', CountF: '1.23' }
      xml = """
      <Data xmlns="#{xmlns}">
        <CountI>123</CountI>
        <CountF>1.23</CountF>
      </Data>
      """
      matchXML(toXML(rules, params), xml)

  describe 'booleans', ->

    it 'true', ->
      rules = members: {Enabled:{type:'boolean'}}
      params = { Enabled: true }
      xml = """
      <Data xmlns="#{xmlns}">
        <Enabled>true</Enabled>
      </Data>
      """
      matchXML(toXML(rules, params), xml)

    it 'false', ->
      rules = members: {Enabled:{type:'boolean'}}
      params = { Enabled: false }
      xml = """
      <Data xmlns="#{xmlns}">
        <Enabled>false</Enabled>
      </Data>
      """
      matchXML(toXML(rules, params), xml)

  describe 'timestamps', ->

    time = new Date()
    time.setMilliseconds(0)

    it 'iso8601', ->
      api.timestampFormat = 'iso8601'
      rules = members: {Expires:{type:'timestamp'}}
      params = { Expires: time }
      xml = """
      <Data xmlns="#{xmlns}">
        <Expires>#{AWS.util.date.iso8601(time)}</Expires>
      </Data>
      """
      matchXML(toXML(rules, params), xml)

    it 'rfc822', ->
      api.timestampFormat = 'rfc822'
      rules = members: {Expires:{type:'timestamp'}}
      params = { Expires: time }
      xml = """
      <Data xmlns="#{xmlns}">
        <Expires>#{AWS.util.date.rfc822(time)}</Expires>
      </Data>
      """
      matchXML(toXML(rules, params), xml)

    it 'unix timestamp', ->
      api.timestampFormat = 'unixTimestamp'
      rules = members: {Expires:{type:'timestamp'}}
      params = { Expires: time }
      xml = """
      <Data xmlns="#{xmlns}">
        <Expires>#{AWS.util.date.unixTimestamp(time)}</Expires>
      </Data>
      """
      matchXML(toXML(rules, params), xml)

    it 'follows the forat given on the shape', ->
      api.timestampFormat = 'unixTimestamp'
      rules = members: {Expires:{type:'timestamp',timestampFormat:'rfc822'}}
      params = { Expires: time }
      # despite the api configuration will specify unixTimesmap, we expect
      # an rfc822 formatted date based on the format attribute
      xml = """
      <Data xmlns="#{xmlns}">
        <Expires>#{AWS.util.date.rfc822(time)}</Expires>
      </Data>
      """
      matchXML(toXML(rules, params), xml)

  describe 'xml attributes', ->
    it 'can serialize xml attributes', ->
      rules = members:
        Config:
          type: 'structure'
          members:
            Foo:
              type: 'string'
            Attr:
              type: 'string'
              xmlAttribute: true
              locationName: 'attr:name'
      params = { Config: { Foo: 'bar', Attr: 'abc' } }
      xml = """
      <Data xmlns="#{xmlns}">
        <Config attr:name="abc"><Foo>bar</Foo></Config>
      </Data>
      """
      matchXML(toXML(rules, params), xml)

  describe 'xml namespaces', ->
    it 'can apply xml namespaces on structures', ->
      rules = members:
        Config:
          type: 'structure'
          xmlNamespace:
            uri: 'URI'
          members:
            Foo:
              type: 'string'
      params = { Config: { Foo: 'bar' } }
      xml = """
      <Data xmlns="#{xmlns}">
        <Config xmlns="URI"><Foo>bar</Foo></Config>
      </Data>
      """
      matchXML(toXML(rules, params), xml)

    it 'applies namespace prefixes to the xmlns attribute', ->
      rules = members:
        Config:
          type: 'structure'
          xmlNamespace:
            prefix: 'xsi'
            uri: 'URI'
          members:
            Foo:
              type: 'string'
      params = { Config: { Foo: 'bar' } }
      xml = """
      <Data xmlns="#{xmlns}">
        <Config xmlns:xsi="URI"><Foo>bar</Foo></Config>
      </Data>
      """
      matchXML(toXML(rules, params), xml)

    it 'can apply namespaces to elements that have other attributes', ->
      rules = members:
        Config:
          type: 'structure'
          xmlNamespace:
            prefix: 'xsi'
            uri: 'URI'
          members:
            Foo:
              type: 'string'
            Bar:
              type: 'string'
              xmlAttribute: true
              locationName: 'xsi:label'
      params = { Config: { Foo: 'abc', Bar: 'xyz' } }
      xml = """
      <Data xmlns="#{xmlns}">
        <Config xmlns:xsi="URI" xsi:label="xyz"><Foo>abc</Foo></Config>
      </Data>
      """
      matchXML(toXML(rules, params), xml)

Zerion Mini Shell 1.0