
/*
   Tests that calling the public api gets through correctly to the writing
   correctly. streamingXhr is a stub so no actual calls are made. 
   
   Technically this tests some of instanceController.js as well as publicApi.js but the tests were
   written before the logic was split into two.
 */

describe("public api", function(){
   "use strict";


   this.beforeEach(function(){
   
      this.addMatchers({
         /* Under Jasmine's toHaveBeenCalledLike, subject(foo, undefined)
            is considered different from subject(foo). This is slightly
            looser and considers those equal.  
          */
         toHaveBeenCalledLike:function(/*expectedArgs*/){
            var expectedArgs = Array.prototype.slice.apply(arguments);
            var actualCalls = this.actual.calls;
            
            var equals = this.env.equals_.bind(this.env);
            
            this.message = function() {
                 var invertedMessage = "Expected spy " + this.actual.identity + " not to have been called like " + jasmine.pp(expectedArgs) + " but it was.";
                 var positiveMessage = "";
                 if (this.actual.callCount === 0) {
                   positiveMessage = "Expected spy " + this.actual.identity + " to have been called like " + jasmine.pp(expectedArgs) + " but it was never called.";
                 } else {
                   positiveMessage = "Expected spy " + this.actual.identity + " to have been called like " + jasmine.pp(expectedArgs) + " but actual calls were " + jasmine.pp(this.actual.argsForCall).replace(/^\[ | \]$/g, '')
                 }
                 return [positiveMessage, invertedMessage];
            };            
                        
            return actualCalls.some(function( actualCall ){
            
               var actualArgs = actualCall.args;

               // check for one too many arguments given. But this is ok
               // if the extra arg is undefined.               
               if( actualArgs[expectedArgs.length] != undefined ) {

                  return false;
               }
               
               return expectedArgs.every(function( expectedArg, index ){
                  
                  return equals( actualArgs[index], expectedArg );                  
               });
            
            });
         }
      });
   })

   describe("propagates through to wiring function", function(){
  
      beforeEach(function() {
         spyOn(window, 'wire');      
      });

      it('exports a usable function for GETs', function(){   
      
         oboe('http://example.com/oboez')
      
         expect(wire).toHaveBeenCalledLike(
             'GET',
             'http://example.com/oboez'
         )      
      })
         
      describe('get', function(){
         
         it('works via arguments', function(){   
         
            oboe('http://example.com/oboez')
         
            expect(wire).toHaveBeenCalledLike(
                'GET',
                'http://example.com/oboez'
            )      
               
         })
            
         it('works via options object', function(){   
              
            oboe({url: 'http://example.com/oboez'})
            
            expect(wire).toHaveBeenCalledLike(              
               'GET',
               'http://example.com/oboez'
            )   
         })
         
         it('propogates headers', function(){

            var headers = {'X-HEADER-1':'value1', 'X-HEADER-2':'value2'};
            
            oboe({url: 'http://example.com/oboez',
                  method:'GET', 
                  headers:headers})
            
            expect(wire).toHaveBeenCalledLike(              
               'GET',
               'http://example.com/oboez',
               undefined,
               headers
            )   
         })         
            
      });
      
      describe('delete', function(){

         
         it('works via options object', function(){   
               
            oboe({url: 'http://example.com/oboez',
                  method: 'DELETE'})
            
            expect(wire).toHaveBeenCalledLike(
               'DELETE',
               'http://example.com/oboez'
            )   
         })   
      });
        
            
      describe('post', function(){
         
         it('can post an object', function(){
               
            oboe({   method:'POST',
                     url:'http://example.com/oboez',
                     body:[1,2,3,4,5]
            })
            
            expect(wire).toHaveBeenCalledLike(
               'POST',
               'http://example.com/oboez',
               [1,2,3,4,5]
            )   
         })   
         
         it('can post a string', function(){
                        
            oboe({   method:'POST',
                     url:'http://example.com/oboez',
                     body:'my_data'
            })
            
            expect(wire).toHaveBeenCalledLike(
               'POST',
               'http://example.com/oboez',
               'my_data'
            )   
         })   
      });
      
      describe('put', function(){   
         it('can put a string', function(){
               
            oboe({   method:'PUT',
                     url:'http://example.com/oboez', 
                     'body':'my_data'})
            
            expect(wire).toHaveBeenCalledLike(
               'PUT',
               'http://example.com/oboez',
               'my_data'
            )   
         })
      });

      describe('patch', function(){
         it('can patch a string', function(){
            oboe({url:'http://example.com/oboez',
                  body:'my_data',
                  method:'PATCH'});

            expect(wire).toHaveBeenCalledLike(
               'PATCH',
               'http://example.com/oboez',
               'my_data'
            )
         })
      })
      
   });
      
});




@@ -929,26 +929,24 @@
             
-  
 var inverted
@@ -1085,26 +1085,24 @@
             
-  
 var positive
@@ -1115,18 +1115,16 @@
 e = %22%22;%0A
-  
         
@@ -1161,25 +1161,24 @@
 nt === 0) %7B%0A
- 
             
@@ -1344,18 +1344,16 @@
         
-  
 %7D else %7B
@@ -1353,17 +1353,16 @@
  else %7B%0A
- 
         
@@ -1585,38 +1585,34 @@
 %0A               
-  %7D%0A  
+%7D%0A
                r

format matcher message function