%PDF- %PDF-
Direktori : /home/opti/workflow/node_modules/aws-sdk/test/xml/ |
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)