import { assert } from "chai" ; import { HttpClient } from "../lib/httpClient" ; import { QueryCollectionFormat } from "../lib/queryCollectionFormat" ; import { DictionaryMapper , MapperType , Serializer , Mapper } from "../lib/serializer" ; import { serializeRequestBody , ServiceClient , getOperationArgumentValueFromParameterPath , } from "../lib/serviceClient" ; import { WebResourceLike , WebResource } from "../lib/webResource" ; import { OperationArguments , HttpHeaders , deserializationPolicy , RestResponse , isNode , } from "../lib/msRest" ; import { ParameterPath } from "../lib/operationParameter" ; describe ( "ServiceClient" , function ( ) { it ( "should serialize headerCollectionPrefix" , async function ( ) { const expected = { "foo-bar-alpha" : "hello" , "foo-bar-beta" : "world" , unrelated : "42" , } ; let request ; const client = new ServiceClient ( undefined , { httpClient : { sendRequest : ( req ) => { request = req ; return Promise . resolve ( { request , status : 200 , headers : new HttpHeaders ( ) } ) ; } , } , requestPolicyFactories : [ ] , } ) ; await client . sendOperationRequest ( { metadata : { alpha : "hello" , beta : "world" , } , unrelated : 42 , } , { httpMethod : "GET" , baseUrl : "httpbin.org" , serializer : new Serializer ( ) , headerParameters : [ { parameterPath : "metadata" , mapper : { serializedName : "metadata" , type : { name : "Dictionary" , value : { type : { name : "String" , } , } , } , headerCollectionPrefix : "foo-bar-" , } as DictionaryMapper , } , { parameterPath : "unrelated" , mapper : { serializedName : "unrelated" , type : { name : "Number" , } , } , } , ] , responses : { 200 : { } , } , } ) ; assert ( request ! ) ; assert . deepEqual ( request ! . headers . toJson ( ) , expected ) ; } ) ; it ( "responses should not show the _response property when serializing" , async function ( ) { let request ; const client = new ServiceClient ( undefined , { httpClient : { sendRequest : ( req ) => { request = req ; return Promise . resolve ( { request , status : 200 , headers : new HttpHeaders ( ) } ) ; } , } , requestPolicyFactories : [ ] , } ) ; const response = await client . sendOperationRequest ( { } , { httpMethod : "GET" , baseUrl : "httpbin.org" , serializer : new Serializer ( ) , headerParameters : [ ] , responses : { 200 : { } , } , } ) ; assert ( request ! ) ; assert . strictEqual ( JSON . stringify ( response ) , "{}" ) ; } ) ; it ( "should serialize collection:csv query parameters" , async function ( ) { await testSendOperationRequest ( [ "1" , "2" , "3" ] , QueryCollectionFormat . Csv , false , "?q=1,2,3" ) ; } ) ; it ( "should serialize collection:csv query parameters with commas & skipEncoding true" , async function ( ) { await testSendOperationRequest ( [ "1,2" , "3,4" , "5" ] , QueryCollectionFormat . Csv , true , "?q=1,2,3,4,5" ) ; } ) ; it ( "should serialize collection:csv query parameters with commas" , async function ( ) { await testSendOperationRequest ( [ "1,2" , "3,4" , "5" ] , QueryCollectionFormat . Csv , false , "?q=1%2C2,3%2C4,5" ) ; } ) ; it ( "should serialize collection:csv query parameters with undefined and null" , async function ( ) { await testSendOperationRequest ( [ "1,2" , undefined , "5" ] , QueryCollectionFormat . Csv , false , "?q=1%2C2,,5" ) ; await testSendOperationRequest ( [ "1,2" , null , "5" ] , QueryCollectionFormat . Csv , false , "?q=1%2C2,,5" ) ; } ) ; it ( "should serialize collection:tsv query parameters with undefined and null" , async function ( ) { await testSendOperationRequest ( [ "1,2" , undefined , "5" ] , QueryCollectionFormat . Tsv , false , "?q=1%2C2%09%095" ) ; await testSendOperationRequest ( [ "1,2" , null , "5" ] , QueryCollectionFormat . Tsv , false , "?q=1%2C2%09%095" ) ; await testSendOperationRequest ( [ "1,2" , "3" , "5" ] , QueryCollectionFormat . Tsv , false , "?q=1%2C2%093%095" ) ; } ) ; it ( "should serialize collection:ssv query parameters with undefined and null" , async function ( ) { await testSendOperationRequest ( [ "1,2" , undefined , "5" ] , QueryCollectionFormat . Ssv , false , "?q=1%2C2%20%205" ) ; await testSendOperationRequest ( [ "1,2" , null , "5" ] , QueryCollectionFormat . Ssv , false , "?q=1%2C2%20%205" ) ; await testSendOperationRequest ( [ "1,2" , "3" , "5" ] , QueryCollectionFormat . Ssv , false , "?q=1%2C2%203%205" ) ; } ) ; it ( "should serialize collection:multi query parameters" , async function ( ) { await testSendOperationRequest ( [ "1" , "2" , "3" ] , QueryCollectionFormat . Multi , false , "?q=1&q=2&q=3" ) ; await testSendOperationRequest ( [ "1,2" , "3,4" , "5" ] , QueryCollectionFormat . Multi , false , "?q=1%2C2&q=3%2C4&q=5" ) ; await testSendOperationRequest ( [ "1,2" , "3,4" , "5" ] , QueryCollectionFormat . Multi , true , "?q=1,2&q=3,4&q=5" ) ; } ) ; it ( "should apply withCredentials to requests" , async function ( ) { let request ; const httpClient = { sendRequest : ( req ) => { request = req ; return Promise . resolve ( { request , status : 200 , headers : new HttpHeaders ( ) } ) ; } , } ; const client1 = new ServiceClient ( undefined , { httpClient , requestPolicyFactories : ( ) => [ ] , } ) ; await client1 . sendOperationRequest ( { } , { serializer : new Serializer ( ) , httpMethod : "GET" , baseUrl : "httpbin.org" , responses : { 200 : { } } , } ) ; assert . strictEqual ( request ! . withCredentials , false ) ; const client2 = new ServiceClient ( undefined , { httpClient , requestPolicyFactories : [ ] , withCredentials : true , } ) ; await client2 . sendOperationRequest ( { } , { serializer : new Serializer ( ) , httpMethod : "GET" , baseUrl : "httpbin.org" , responses : { 200 : { } } , } ) ; assert . strictEqual ( request ! . withCredentials , true ) ; } ) ; it ( "The behavior of baseUri on ServiceClient children classes should be predictable on management clouds" , async function ( ) { const httpClient = { sendRequest : ( request ) => { return Promise . resolve ( { request , status : 200 , headers : new HttpHeaders ( ) } ) ; } , } ; const scope = "https://management.chinacloudapi.cn" ; class ServiceClientChildren extends ServiceClient { getBaseUri ( ) { return this . baseUri ; } } let receivedScope = "" ; const client = new ServiceClientChildren ( { async getToken ( _receivedScope ) { receivedScope = _receivedScope ; return { token : "token" , expiresOnTimestamp : Date . now ( ) , } ; } , } , { httpClient , baseUri : scope , } ) ; const res = await client . sendOperationRequest ( { } , { serializer : new Serializer ( ) , httpMethod : "GET" , baseUrl : "httpbin.org" , responses : { 200 : { bodyMapper : { type : { name : "Sequence" , element : { type : { name : "Number" , } , } , } , } , } , } , } ) ; assert . strictEqual ( res . _response . status , 200 ) ; assert . strictEqual ( receivedScope , `${ scope }/.default` , "The baseUri passed through the options should determine the scope used on getToken" ) ; assert . strictEqual ( client . getBaseUri ( ) , scope , "The baseUri passed through the options should be assigned as the protected baseUri" ) ; } ) ; it ( "The behavior of baseUri on ServiceClient children classes should remain the same if the baseUri is not a management endpoint" , async function ( ) { const httpClient = { sendRequest : ( request ) => { return Promise . resolve ( { request , status : 200 , headers : new HttpHeaders ( ) } ) ; } , } ; const baseUri = "https://original-scope.xyz" ; const expectedReceivedScope = "https://management.azure.com/.default" ; class ServiceClientChildren extends ServiceClient { getBaseUri ( ) { return this . baseUri ; } } let receivedScope = "" ; const client = new ServiceClientChildren ( { async getToken ( _receivedScope ) { receivedScope = _receivedScope ; return { token : "token" , expiresOnTimestamp : Date . now ( ) , } ; } , } , { httpClient , baseUri , } ) ; const res = await client . sendOperationRequest ( { } , { serializer : new Serializer ( ) , httpMethod : "GET" , baseUrl : "httpbin.org" , responses : { 200 : { bodyMapper : { type : { name : "Sequence" , element : { type : { name : "Number" , } , } , } , } , } , } , } ) ; assert . strictEqual ( res . _response . status , 200 ) ; assert . strictEqual ( receivedScope , expectedReceivedScope , "The baseUri passed through the options should determine the scope used on getToken" ) ; assert . strictEqual ( client . getBaseUri ( ) , baseUri , "The baseUri passed through the options should be assigned as the protected baseUri" ) ; } ) ; it ( "should deserialize response bodies" , async function ( ) { let request ; const httpClient = { sendRequest : ( req ) => { request = req ; return Promise . resolve ( { request , status : 200 , headers : new HttpHeaders ( ) , bodyAsText : "[1,2,3]" , } ) ; } , } ; const client1 = new ServiceClient ( undefined , { httpClient , requestPolicyFactories : [ deserializationPolicy ( ) ] , } ) ; const res = await client1 . sendOperationRequest ( { } , { serializer : new Serializer ( ) , httpMethod : "GET" , baseUrl : "httpbin.org" , responses : { 200 : { bodyMapper : { type : { name : "Sequence" , element : { type : { name : "Number" , } , } , } , } , } , } , } ) ; assert . strictEqual ( res . _response . status , 200 ) ; assert . deepStrictEqual ( res . slice ( ) , [ 1 , 2 , 3 ] ) ; } ) ; it ( "should deserialize response bodies with undefined array" , async function ( ) { let request ; const httpClient = { sendRequest : ( req ) => { request = req ; return Promise . resolve ( { request , status : 200 , headers : new HttpHeaders ( ) , bodyAsText : JSON . stringify ( { nextLink : "mockLink" } ) , } ) ; } , } ; const client1 = new ServiceClient ( undefined , { httpClient , requestPolicyFactories : [ deserializationPolicy ( ) ] , } ) ; const res = ( await client1 . sendOperationRequest ( { } , { serializer : new Serializer ( ) , httpMethod : "GET" , baseUrl : "httpbin.org" , responses : { "200" : { bodyMapper : { type : { name : "Composite" , modelProperties : { value : { serializedName : "" , type : { name : "Sequence" , element : { type : { name : "String" } , } , } , } , nextLink : { serializedName : "nextLink" , type : { name : "String" } , } , } , } , } , } , default : { bodyMapper : { serializedName : "ErrorResponse" , type : { name : "Composite" , className : "ErrorResponse" , modelProperties : { code : { serializedName : "code" , type : { name : "String" } } , message : { serializedName : "message" , type : { name : "String" } , } , } , } , } , } , } , } ) ) as any ; assert . strictEqual ( res . _response . status , 200 ) ; assert . deepStrictEqual ( res . nextLink , "mockLink" ) ; assert . deepStrictEqual ( res , [ ] ) ; } ) ; it ( "should use userAgent header name value from options" , async function ( ) { const httpClient = { sendRequest : ( request ) => { return Promise . resolve ( { request , status : 200 , headers : new HttpHeaders ( ) } ) ; } , } ; const client1 = new ServiceClient ( undefined , { httpClient , userAgentHeaderName : "my-user-agent-key" , userAgent : "blah blah" , } ) ; const response = await client1 . sendOperationRequest ( { } , { serializer : new Serializer ( ) , httpMethod : "GET" , baseUrl : "httpbin.org" , responses : { } , } ) ; assert . strictEqual ( response . _response . status , 200 ) ; assert . strictEqual ( response . _response . request . headers . get ( "my-user-agent-key" ) , "blah blah" ) ; } ) ; it ( "should use userAgent header name function from options" , async function ( ) { const httpClient = { sendRequest : ( request ) => { return Promise . resolve ( { request , status : 200 , headers : new HttpHeaders ( ) } ) ; } , } ; const client1 = new ServiceClient ( undefined , { httpClient , userAgentHeaderName : ( ) => "my-user-agent-key-2" , userAgent : "blah blah" , } ) ; const response = await client1 . sendOperationRequest ( { } , { serializer : new Serializer ( ) , httpMethod : "GET" , baseUrl : "httpbin.org" , responses : { } , } ) ; assert . strictEqual ( response . _response . status , 200 ) ; assert . strictEqual ( response . _response . request . headers . get ( "my-user-agent-key-2" ) , "blah blah" ) ; } ) ; it ( "should use userAgent string from options" , async function ( ) { const httpClient = { sendRequest : ( request ) => { return Promise . resolve ( { request , status : 200 , headers : new HttpHeaders ( ) } ) ; } , } ; const client1 = new ServiceClient ( undefined , { httpClient , userAgent : "blah blah" , } ) ; const response = await client1 . sendOperationRequest ( { } , { serializer : new Serializer ( ) , httpMethod : "GET" , baseUrl : "httpbin.org" , responses : { } , } ) ; assert . strictEqual ( response . _response . status , 200 ) ; assert . strictEqual ( response . _response . request . headers . get ( isNode ? "user-agent" : "x-ms-command-name" ) , "blah blah" ) ; } ) ; it ( "should use userAgent function from options that appends to defaultUserAgent" , async function ( ) { const httpClient = { sendRequest : ( request ) => { return Promise . resolve ( { request , status : 200 , headers : new HttpHeaders ( ) } ) ; } , } ; const client1 = new ServiceClient ( undefined , { httpClient , userAgent : ( defaultUserAgent ) => `${ defaultUserAgent }/blah blah` , } ) ; const response = await client1 . sendOperationRequest ( { } , { serializer : new Serializer ( ) , httpMethod : "GET" , baseUrl : "httpbin.org" , responses : { } , } ) ; assert . strictEqual ( response . _response . status , 200 ) ; const userAgentHeaderValue = response . _response . request . headers . get ( isNode ? "user-agent" : "x-ms-command-name" ) ; assert ( userAgentHeaderValue ) ; assert ( userAgentHeaderValue ! . startsWith ( "ms-rest-js/" ) ) ; assert ( userAgentHeaderValue ! . endsWith ( "/blah blah" ) ) ; } ) ; it ( "should use userAgent function from options that ignores defaultUserAgent" , async function ( ) { const httpClient = { sendRequest : ( request ) => { return Promise . resolve ( { request , status : 200 , headers : new HttpHeaders ( ) } ) ; } , } ; const client1 = new ServiceClient ( undefined , { httpClient , userAgent : ( ) => `blah blah 2` , } ) ; const response = await client1 . sendOperationRequest ( { } , { serializer : new Serializer ( ) , httpMethod : "GET" , baseUrl : "httpbin.org" , responses : { } , } ) ; assert . strictEqual ( response . _response . status , 200 ) ; assert . strictEqual ( response . _response . request . headers . get ( isNode ? "user-agent" : "x-ms-command-name" ) , "blah blah 2" ) ; } ) ; describe ( "serializeRequestBody()" , ( ) => { it ( "should serialize a JSON String request body" , ( ) => { const httpRequest = new WebResource ( ) ; serializeRequestBody ( new ServiceClient ( ) , httpRequest , { bodyArg : "body value" , } , { httpMethod : "POST" , requestBody : { parameterPath : "bodyArg" , mapper : { required : true , serializedName : "bodyArg" , type : { name : MapperType . String , } , } , } , responses : { 200 : { } } , serializer : new Serializer ( ) , } ) ; assert . strictEqual ( httpRequest . body , `"body value"` ) ; } ) ; it ( "should serialize a JSON ByteArray request body" , ( ) => { const httpRequest = new WebResource ( ) ; serializeRequestBody ( new ServiceClient ( ) , httpRequest , { bodyArg : stringToByteArray ( "Javascript" ) , } , { httpMethod : "POST" , requestBody : { parameterPath : "bodyArg" , mapper : { required : true , serializedName : "bodyArg" , type : { name : MapperType . ByteArray , } , } , } , responses : { 200 : { } } , serializer : new Serializer ( ) , } ) ; assert . strictEqual ( httpRequest . body , `"SmF2YXNjcmlwdA=="` ) ; } ) ; it ( "should serialize a JSON Stream request body" , ( ) => { const httpRequest = new WebResource ( ) ; serializeRequestBody ( new ServiceClient ( ) , httpRequest , { bodyArg : "body value" , } , { httpMethod : "POST" , requestBody : { parameterPath : "bodyArg" , mapper : { required : true , serializedName : "bodyArg" , type : { name : MapperType . Stream , } , } , } , responses : { 200 : { } } , serializer : new Serializer ( ) , } ) ; assert . strictEqual ( httpRequest . body , "body value" ) ; } ) ; it ( "should serialize an XML String request body" , ( ) => { const httpRequest = new WebResource ( ) ; serializeRequestBody ( new ServiceClient ( ) , httpRequest , { bodyArg : "body value" , } , { httpMethod : "POST" , requestBody : { parameterPath : "bodyArg" , mapper : { required : true , serializedName : "bodyArg" , type : { name : MapperType . String , } , } , } , responses : { 200 : { } } , serializer : new Serializer ( ) , isXML : true , } ) ; assert . strictEqual ( httpRequest . body , `<?xml version="1.0" encoding="UTF-8" standalone="yes"?><bodyArg>body value</bodyArg>` ) ; } ) ; it ( "should serialize an XML ByteArray request body" , ( ) => { const httpRequest = new WebResource ( ) ; serializeRequestBody ( new ServiceClient ( ) , httpRequest , { bodyArg : stringToByteArray ( "Javascript" ) , } , { httpMethod : "POST" , requestBody : { parameterPath : "bodyArg" , mapper : { required : true , serializedName : "bodyArg" , type : { name : MapperType . ByteArray , } , } , } , responses : { 200 : { } } , serializer : new Serializer ( ) , isXML : true , } ) ; assert . strictEqual ( httpRequest . body , `<?xml version="1.0" encoding="UTF-8" standalone="yes"?><bodyArg>SmF2YXNjcmlwdA==</bodyArg>` ) ; } ) ; it ( "should serialize an XML Stream request body" , ( ) => { const httpRequest = new WebResource ( ) ; serializeRequestBody ( new ServiceClient ( ) , httpRequest , { bodyArg : "body value" , } , { httpMethod : "POST" , requestBody : { parameterPath : "bodyArg" , mapper : { required : true , serializedName : "bodyArg" , type : { name : MapperType . Stream , } , } , } , responses : { 200 : { } } , serializer : new Serializer ( ) , isXML : true , } ) ; assert . strictEqual ( httpRequest . body , "body value" ) ; } ) ; } ) ; describe ( "getOperationArgumentValueFromParameterPath()" , ( ) => { it ( "should return undefined when the parameter path isn't found in the operation arguments or service client" , ( ) => { const serviceClient = new ServiceClient ( ) ; const operationArguments = { } ; const parameterPath = "myParameter" ; const parameterMapper = { serializedName : "my-parameter" , type : { name : MapperType . Number , } , } ; const parameterValue = getOperationArgumentValueFromParameterPath ( serviceClient , operationArguments , parameterPath , parameterMapper , new Serializer ( ) ) ; assert . strictEqual ( parameterValue , undefined ) ; } ) ; it ( "should return undefined when the parameter path is found in the operation arguments but is undefined and doesn't have a default value" , ( ) => { const serviceClient = new ServiceClient ( ) ; const operationArguments = { myParameter : undefined , } ; const parameterPath = "myParameter" ; const parameterMapper = { serializedName : "my-parameter" , type : { name : MapperType . Number , } , } ; const parameterValue = getOperationArgumentValueFromParameterPath ( serviceClient , operationArguments , parameterPath , parameterMapper , new Serializer ( ) ) ; assert . strictEqual ( parameterValue , undefined ) ; } ) ; it ( "should return null when the parameter path is null in the operation arguments but is undefined and doesn't have a default value" , ( ) => { const serviceClient = new ServiceClient ( ) ; const operationArguments = { myParameter : null , } ; const parameterPath = "myParameter" ; const parameterMapper = { serializedName : "my-parameter" , type : { name : MapperType . Number , } , } ; const parameterValue = getOperationArgumentValueFromParameterPath ( serviceClient , operationArguments , parameterPath , parameterMapper , new Serializer ( ) ) ; assert . strictEqual ( parameterValue , null ) ; } ) ; it ( "should return the operation argument value when the parameter path is found in the operation arguments" , ( ) => { const serviceClient = new ServiceClient ( ) ; const operationArguments = { myParameter : 20 , } ; const parameterPath = "myParameter" ; const parameterMapper = { serializedName : "my-parameter" , type : { name : MapperType . Number , } , } ; const parameterValue = getOperationArgumentValueFromParameterPath ( serviceClient , operationArguments , parameterPath , parameterMapper , new Serializer ( ) ) ; assert . strictEqual ( parameterValue , 20 ) ; } ) ; it ( "should return the options operation argument value when the parameter path is found in the optional operation arguments" , ( ) => { const serviceClient = new ServiceClient ( ) ; const operationArguments = { options : { myParameter : 1 , } , } ; const parameterPath = [ "options" , "myParameter" ] ; const parameterMapper = { serializedName : "my-parameter" , type : { name : MapperType . Number , } , } ; const parameterValue = getOperationArgumentValueFromParameterPath ( serviceClient , operationArguments , parameterPath , parameterMapper , new Serializer ( ) ) ; assert . strictEqual ( parameterValue , 1 ) ; } ) ; it ( "should return the service client value when the parameter path is found in the service client" , ( ) => { const serviceClient = new ServiceClient ( ) ; ( serviceClient as any ) [ "myParameter" ] = 21 ; const operationArguments = { } ; const parameterPath = "myParameter" ; const parameterMapper = { serializedName : "my-parameter" , type : { name : MapperType . Number , } , } ; const parameterValue = getOperationArgumentValueFromParameterPath ( serviceClient , operationArguments , parameterPath , parameterMapper , new Serializer ( ) ) ; assert . strictEqual ( parameterValue , 21 ) ; } ) ; it ( "should return the operation argument value when the parameter path is found in both the operation arguments and the service client" , ( ) => { const serviceClient = new ServiceClient ( ) ; ( serviceClient as any ) [ "myParameter" ] = 21 ; const operationArguments = { myParameter : 22 , } ; const parameterPath = "myParameter" ; const parameterMapper = { serializedName : "my-parameter" , type : { name : MapperType . Number , } , } ; const parameterValue = getOperationArgumentValueFromParameterPath ( serviceClient , operationArguments , parameterPath , parameterMapper , new Serializer ( ) ) ; assert . strictEqual ( parameterValue , 22 ) ; } ) ; it ( "should return the default value when it is a constant and the parameter path doesn't exist in other places" , ( ) => { const serviceClient = new ServiceClient ( ) ; const operationArguments = { } ; const parameterPath = "myParameter" ; const parameterMapper = { serializedName : "my-parameter" , isConstant : true , defaultValue : 1 , type : { name : MapperType . Number , } , } ; const parameterValue = getOperationArgumentValueFromParameterPath ( serviceClient , operationArguments , parameterPath , parameterMapper , new Serializer ( ) ) ; assert . strictEqual ( parameterValue , 1 ) ; } ) ; it ( "should return the default value when it is a constant and the parameter path exists in other places" , ( ) => { const serviceClient = new ServiceClient ( ) ; ( serviceClient as any ) [ "myParameter" ] = 1 ; const operationArguments = { myParameter : 2 , options : { myParameter : 3 , } , } ; const parameterPath = "myParameter" ; const parameterMapper = { serializedName : "my-parameter" , isConstant : true , defaultValue : 4 , type : { name : MapperType . Number , } , } ; const parameterValue = getOperationArgumentValueFromParameterPath ( serviceClient , operationArguments , parameterPath , parameterMapper , new Serializer ( ) ) ; assert . strictEqual ( parameterValue , 4 ) ; } ) ; it ( "should return undefined when the parameter path isn't found in the operation arguments or the service client, the parameter is optional, and it has a default value" , ( ) => { const serviceClient = new ServiceClient ( ) ; const operationArguments = { } ; const parameterPath = "myParameter" ; const parameterMapper = { serializedName : "my-parameter" , defaultValue : 21 , type : { name : MapperType . Number , } , } ; const parameterValue = getOperationArgumentValueFromParameterPath ( serviceClient , operationArguments , parameterPath , parameterMapper , new Serializer ( ) ) ; assert . strictEqual ( parameterValue , undefined ) ; } ) ; it ( "should return the default value when the parameter path isn't found in the operation arguments or the service client, the parameter is required, and it has a default value" , ( ) => { const serviceClient = new ServiceClient ( ) ; const operationArguments = { } ; const parameterPath = "myParameter" ; const parameterMapper = { serializedName : "my-parameter" , defaultValue : 21 , required : true , type : { name : MapperType . Number , } , } ; const parameterValue = getOperationArgumentValueFromParameterPath ( serviceClient , operationArguments , parameterPath , parameterMapper , new Serializer ( ) ) ; assert . strictEqual ( parameterValue , 21 ) ; } ) ; it ( "should return the default value when the parameter path is partially found in the operation arguments, the parameter is required, and it has a default value" , ( ) => { const serviceClient = new ServiceClient ( ) ; const operationArguments = { myParameter : { differentProperty : "hello" , } , } ; const parameterPath = [ "myParameter" , "myProperty" ] ; const parameterMapper = { serializedName : "my-parameter" , defaultValue : 21 , required : true , type : { name : MapperType . Number , } , } ; const parameterValue = getOperationArgumentValueFromParameterPath ( serviceClient , operationArguments , parameterPath , parameterMapper , new Serializer ( ) ) ; assert . strictEqual ( parameterValue , 21 ) ; } ) ; it ( "should return undefined when the parameter path is partially found in the operation arguments, the parameter is optional, and it has a default value" , ( ) => { const serviceClient = new ServiceClient ( ) ; const operationArguments = { myParameter : { differentProperty : "hello" , } , } ; const parameterPath = [ "myParameter" , "myProperty" ] ; const parameterMapper = { serializedName : "my-parameter" , defaultValue : 21 , type : { name : MapperType . Number , } , } ; const parameterValue = getOperationArgumentValueFromParameterPath ( serviceClient , operationArguments , parameterPath , parameterMapper , new Serializer ( ) ) ; assert . strictEqual ( parameterValue , undefined ) ; } ) ; it ( "should return the default value when the parameter path is not found in the options operation arguments and it has a default value" , ( ) => { const serviceClient = new ServiceClient ( ) ; const operationArguments = { } ; const parameterPath = [ "options" , "myParameter" ] ; const parameterMapper = { serializedName : "my-parameter" , defaultValue : 21 , type : { name : MapperType . Number , } , } ; const parameterValue = getOperationArgumentValueFromParameterPath ( serviceClient , operationArguments , parameterPath , parameterMapper , new Serializer ( ) ) ; assert . strictEqual ( parameterValue , 21 ) ; } ) ; it ( "should return undefined when the parameter path is not found as a property on a parameter within the options operation arguments and it has a default value" , ( ) => { const serviceClient = new ServiceClient ( ) ; const operationArguments = { } ; const parameterPath = [ "options" , "myParameter" , "myProperty" ] ; const parameterMapper = { serializedName : "my-parameter" , defaultValue : 21 , type : { name : MapperType . Number , } , } ; const parameterValue = getOperationArgumentValueFromParameterPath ( serviceClient , operationArguments , parameterPath , parameterMapper , new Serializer ( ) ) ; assert . strictEqual ( parameterValue , undefined ) ; } ) ; it ( "should return null when the parameter path is null in the operation arguments but is undefined and it has a default value" , ( ) => { const serviceClient = new ServiceClient ( ) ; const operationArguments = { myParameter : null , } ; const parameterPath = "myParameter" ; const parameterMapper = { serializedName : "my-parameter" , defaultValue : 2 , type : { name : MapperType . Number , } , } ; const parameterValue = getOperationArgumentValueFromParameterPath ( serviceClient , operationArguments , parameterPath , parameterMapper , new Serializer ( ) ) ; assert . strictEqual ( parameterValue , null ) ; } ) ; it ( "should return the service client value when the parameter path is found in the service client and it has a default value" , ( ) => { const serviceClient = new ServiceClient ( ) ; ( serviceClient as any ) [ "myParameter" ] = 5 ; const operationArguments = { } ; const parameterPath = "myParameter" ; const parameterMapper = { serializedName : "my-parameter" , defaultValue : 2 , type : { name : MapperType . Number , } , } ; const parameterValue = getOperationArgumentValueFromParameterPath ( serviceClient , operationArguments , parameterPath , parameterMapper , new Serializer ( ) ) ; assert . strictEqual ( parameterValue , 5 ) ; } ) ; } ) ; } ) ; function stringToByteArray ( str ) { if ( typeof Buffer === "function" && isNode ) { return Buffer . from ( str , "utf-8" ) ; } else { return new TextEncoder ( ) . encode ( str ) ; } } async function testSendOperationRequest ( queryValue , queryCollectionFormat , skipEncodingParameter , expected ) { let request ; const client = new ServiceClient ( undefined , { httpClient : { sendRequest : ( req ) => { request = req ; return Promise . resolve ( { request , status : 200 , headers : new HttpHeaders ( ) } ) ; } , } , requestPolicyFactories : ( ) => [ ] , } ) ; await client . sendOperationRequest ( { q : queryValue , } , { httpMethod : "GET" , baseUrl : "httpbin.org" , serializer : new Serializer ( ) , queryParameters : [ { collectionFormat : queryCollectionFormat , skipEncoding : skipEncodingParameter , parameterPath : "q" , mapper : { serializedName : "q" , type : { name : "Sequence" , element : { type : { name : "String" , } , serializedName : "q" , } , } , } , } , ] , responses : { 200 : { } , } , } ) ; assert ( request ! ) ; assert ( request ! . url . endsWith ( expected ) , `"${ request ! . url }" does not end with "${ expected }"` ) ; }