aboutsummaryrefslogblamecommitdiffstats
path: root/vendor/sabre/dav/tests/Sabre/DAV/ServerPreconditionTest.php
blob: 203cf26d9d422561be06960341456af3810bd431 (plain) (tree)
1
2
3
4
5
6
7
8
9
10
11










                                                                   



                                                                
                                                                              
                                    


                                                                            



       


                                   
                                                                              
                                    


                                                                                    



       



                                                                
                                                                              
                                    


                                                                               



       


                                       
                                                                              
                                    


                                                                                    





                                                                     



                                         
                                                                              
                                    


                                                                                       



       


                                    
                                                                              
                                    


                                                                                                 



       


                                      
                                                                              
                                    


                                                                                    



       



                                                                
                                                                              
                                    


                                                                                  



       


                                         
                                                                              
                                    


                                                                                       



       


                                                 
                                                                              
                                    


                                                                                               



       

                                                                
                                           
 
                                                                              
                                    


                                                                                         



       

                                                                
                                                   
 
                                                                              
                                    


                                                                                                



       
       
                                                
 
                                                                              
                                    











                                                                                             
                                                       
 
                                                                              



                                                                                        


                                                        




                                                                                             
                                              


                                                     



       
       
                                              
 
                                                                              
                                    
                                                         
                                                                        

                                              
                                                        
                                                                                             
 
                                                                
                             
                                                                 
                                                




       
       
                                            
 
                                                                              
                                    
                                                         
                                                                        

                                              


                                                                                    



       
       
                                               
 
                                                                              
                                    
                                                         
                                                      

                                              
                                                

                                                                    
                                                                                    



       
       
                                                
 
                                                                              
                                    
                                                         
                                                                        

                                              

                                                                                    




       
       
                                                
 
                                                                              
                                    
                                                         
                                                                          

                                                

                                                                                    




       

                                                                
                                              
 
                                                                              
                                    
                                                         
                                                                          

                                                

                                                                 



       
       
                                                 
 
                                                                              
                                    
                                                         
                                                                          

                                                

                                                                                    



























                                                    
<?php

namespace Sabre\DAV;

use Sabre\HTTP;

require_once 'Sabre/HTTP/ResponseMock.php';

class ServerPreconditionsTest extends \PHPUnit_Framework_TestCase {

    /**
     * @expectedException Sabre\DAV\Exception\PreconditionFailed
     */
    function testIfMatchNoNode() {

        $root = new SimpleCollection('root', [new ServerPreconditionsNode()]);
        $server = new Server($root);
        $httpRequest = new HTTP\Request('GET', '/bar', ['If-Match' => '*']);
        $httpResponse = new HTTP\Response();
        $server->checkPreconditions($httpRequest, $httpResponse);

    }

    /**
     */
    function testIfMatchHasNode() {

        $root = new SimpleCollection('root', [new ServerPreconditionsNode()]);
        $server = new Server($root);
        $httpRequest = new HTTP\Request('GET', '/foo', ['If-Match' => '*']);
        $httpResponse = new HTTP\Response();
        $this->assertTrue($server->checkPreconditions($httpRequest, $httpResponse));

    }

    /**
     * @expectedException Sabre\DAV\Exception\PreconditionFailed
     */
    function testIfMatchWrongEtag() {

        $root = new SimpleCollection('root', [new ServerPreconditionsNode()]);
        $server = new Server($root);
        $httpRequest = new HTTP\Request('GET', '/foo', ['If-Match' => '1234']);
        $httpResponse = new HTTP\Response();
        $server->checkPreconditions($httpRequest, $httpResponse);

    }

    /**
     */
    function testIfMatchCorrectEtag() {

        $root = new SimpleCollection('root', [new ServerPreconditionsNode()]);
        $server = new Server($root);
        $httpRequest = new HTTP\Request('GET', '/foo', ['If-Match' => '"abc123"']);
        $httpResponse = new HTTP\Response();
        $this->assertTrue($server->checkPreconditions($httpRequest, $httpResponse));

    }

    /**
     * Evolution sometimes uses \" instead of " for If-Match headers.
     *
     * @depends testIfMatchCorrectEtag
     */
    function testIfMatchEvolutionEtag() {

        $root = new SimpleCollection('root', [new ServerPreconditionsNode()]);
        $server = new Server($root);
        $httpRequest = new HTTP\Request('GET', '/foo', ['If-Match' => '\\"abc123\\"']);
        $httpResponse = new HTTP\Response();
        $this->assertTrue($server->checkPreconditions($httpRequest, $httpResponse));

    }

    /**
     */
    function testIfMatchMultiple() {

        $root = new SimpleCollection('root', [new ServerPreconditionsNode()]);
        $server = new Server($root);
        $httpRequest = new HTTP\Request('GET', '/foo', ['If-Match' => '"hellothere", "abc123"']);
        $httpResponse = new HTTP\Response();
        $this->assertTrue($server->checkPreconditions($httpRequest, $httpResponse));

    }

    /**
     */
    function testIfNoneMatchNoNode() {

        $root = new SimpleCollection('root', [new ServerPreconditionsNode()]);
        $server = new Server($root);
        $httpRequest = new HTTP\Request('GET', '/bar', ['If-None-Match' => '*']);
        $httpResponse = new HTTP\Response();
        $this->assertTrue($server->checkPreconditions($httpRequest, $httpResponse));

    }

    /**
     * @expectedException Sabre\DAV\Exception\PreconditionFailed
     */
    function testIfNoneMatchHasNode() {

        $root = new SimpleCollection('root', [new ServerPreconditionsNode()]);
        $server = new Server($root);
        $httpRequest = new HTTP\Request('POST', '/foo', ['If-None-Match' => '*']);
        $httpResponse = new HTTP\Response();
        $server->checkPreconditions($httpRequest, $httpResponse);

    }

    /**
     */
    function testIfNoneMatchWrongEtag() {

        $root = new SimpleCollection('root', [new ServerPreconditionsNode()]);
        $server = new Server($root);
        $httpRequest = new HTTP\Request('POST', '/foo', ['If-None-Match' => '"1234"']);
        $httpResponse = new HTTP\Response();
        $this->assertTrue($server->checkPreconditions($httpRequest, $httpResponse));

    }

    /**
     */
    function testIfNoneMatchWrongEtagMultiple() {

        $root = new SimpleCollection('root', [new ServerPreconditionsNode()]);
        $server = new Server($root);
        $httpRequest = new HTTP\Request('POST', '/foo', ['If-None-Match' => '"1234", "5678"']);
        $httpResponse = new HTTP\Response();
        $this->assertTrue($server->checkPreconditions($httpRequest, $httpResponse));

    }

    /**
     * @expectedException Sabre\DAV\Exception\PreconditionFailed
     */
    function testIfNoneMatchCorrectEtag() {

        $root = new SimpleCollection('root', [new ServerPreconditionsNode()]);
        $server = new Server($root);
        $httpRequest = new HTTP\Request('POST', '/foo', ['If-None-Match' => '"abc123"']);
        $httpResponse = new HTTP\Response();
        $server->checkPreconditions($httpRequest, $httpResponse);

    }

    /**
     * @expectedException Sabre\DAV\Exception\PreconditionFailed
     */
    function testIfNoneMatchCorrectEtagMultiple() {

        $root = new SimpleCollection('root', [new ServerPreconditionsNode()]);
        $server = new Server($root);
        $httpRequest = new HTTP\Request('POST', '/foo', ['If-None-Match' => '"1234, "abc123"']);
        $httpResponse = new HTTP\Response();
        $server->checkPreconditions($httpRequest, $httpResponse);

    }

    /**
     */
    function testIfNoneMatchCorrectEtagAsGet() {

        $root = new SimpleCollection('root', [new ServerPreconditionsNode()]);
        $server = new Server($root);
        $httpRequest = new HTTP\Request('GET', '/foo', ['If-None-Match' => '"abc123"']);
        $server->httpResponse = new HTTP\ResponseMock();

        $this->assertFalse($server->checkPreconditions($httpRequest, $server->httpResponse));
        $this->assertEquals(304, $server->httpResponse->getStatus());
        $this->assertEquals(['ETag' => ['"abc123"']], $server->httpResponse->getHeaders());

    }

    /**
     * This was a test written for issue #515.
     */
    function testNoneMatchCorrectEtagEnsureSapiSent() {

        $root = new SimpleCollection('root', [new ServerPreconditionsNode()]);
        $server = new Server($root);
        $server->sapi = new HTTP\SapiMock();
        HTTP\SapiMock::$sent = 0;
        $httpRequest = new HTTP\Request('GET', '/foo', ['If-None-Match' => '"abc123"']);
        $server->httpRequest = $httpRequest;
        $server->httpResponse = new HTTP\ResponseMock();

        $server->exec();

        $this->assertFalse($server->checkPreconditions($httpRequest, $server->httpResponse));
        $this->assertEquals(304, $server->httpResponse->getStatus());
        $this->assertEquals([
            'ETag'            => ['"abc123"'],
            'X-Sabre-Version' => [Version::VERSION],
        ], $server->httpResponse->getHeaders());
        $this->assertEquals(1, HTTP\SapiMock::$sent);

    }

    /**
     */
    function testIfModifiedSinceUnModified() {

        $root = new SimpleCollection('root', [new ServerPreconditionsNode()]);
        $server = new Server($root);
        $httpRequest = HTTP\Sapi::createFromServerArray([
            'HTTP_IF_MODIFIED_SINCE' => 'Sun, 06 Nov 1994 08:49:37 GMT',
            'REQUEST_URI'            => '/foo'
        ]);
        $server->httpResponse = new HTTP\ResponseMock();
        $this->assertFalse($server->checkPreconditions($httpRequest, $server->httpResponse));

        $this->assertEquals(304, $server->httpResponse->status);
        $this->assertEquals([
            'Last-Modified' => ['Sat, 06 Apr 1985 23:30:00 GMT'],
        ], $server->httpResponse->getHeaders());

    }


    /**
     */
    function testIfModifiedSinceModified() {

        $root = new SimpleCollection('root', [new ServerPreconditionsNode()]);
        $server = new Server($root);
        $httpRequest = HTTP\Sapi::createFromServerArray([
            'HTTP_IF_MODIFIED_SINCE' => 'Tue, 06 Nov 1984 08:49:37 GMT',
            'REQUEST_URI'            => '/foo'
        ]);

        $httpResponse = new HTTP\ResponseMock();
        $this->assertTrue($server->checkPreconditions($httpRequest, $httpResponse));

    }

    /**
     */
    function testIfModifiedSinceInvalidDate() {

        $root = new SimpleCollection('root', [new ServerPreconditionsNode()]);
        $server = new Server($root);
        $httpRequest = HTTP\Sapi::createFromServerArray([
            'HTTP_IF_MODIFIED_SINCE' => 'Your mother',
            'REQUEST_URI'            => '/foo'
        ]);
        $httpResponse = new HTTP\ResponseMock();

        // Invalid dates must be ignored, so this should return true
        $this->assertTrue($server->checkPreconditions($httpRequest, $httpResponse));

    }

    /**
     */
    function testIfModifiedSinceInvalidDate2() {

        $root = new SimpleCollection('root', [new ServerPreconditionsNode()]);
        $server = new Server($root);
        $httpRequest = HTTP\Sapi::createFromServerArray([
            'HTTP_IF_MODIFIED_SINCE' => 'Sun, 06 Nov 1994 08:49:37 EST',
            'REQUEST_URI'            => '/foo'
        ]);
        $httpResponse = new HTTP\ResponseMock();
        $this->assertTrue($server->checkPreconditions($httpRequest, $httpResponse));

    }


    /**
     */
    function testIfUnmodifiedSinceUnModified() {

        $root = new SimpleCollection('root', [new ServerPreconditionsNode()]);
        $server = new Server($root);
        $httpRequest = HTTP\Sapi::createFromServerArray([
            'HTTP_IF_UNMODIFIED_SINCE' => 'Sun, 06 Nov 1994 08:49:37 GMT',
            'REQUEST_URI'              => '/foo'
        ]);
        $httpResponse = new HTTP\Response();
        $this->assertTrue($server->checkPreconditions($httpRequest, $httpResponse));

    }


    /**
     * @expectedException Sabre\DAV\Exception\PreconditionFailed
     */
    function testIfUnmodifiedSinceModified() {

        $root = new SimpleCollection('root', [new ServerPreconditionsNode()]);
        $server = new Server($root);
        $httpRequest = HTTP\Sapi::createFromServerArray([
            'HTTP_IF_UNMODIFIED_SINCE' => 'Tue, 06 Nov 1984 08:49:37 GMT',
            'REQUEST_URI'              => '/foo'
        ]);
        $httpResponse = new HTTP\ResponseMock();
        $server->checkPreconditions($httpRequest, $httpResponse);

    }

    /**
     */
    function testIfUnmodifiedSinceInvalidDate() {

        $root = new SimpleCollection('root', [new ServerPreconditionsNode()]);
        $server = new Server($root);
        $httpRequest = HTTP\Sapi::createFromServerArray([
            'HTTP_IF_UNMODIFIED_SINCE' => 'Sun, 06 Nov 1984 08:49:37 CET',
            'REQUEST_URI'              => '/foo'
        ]);
        $httpResponse = new HTTP\ResponseMock();
        $this->assertTrue($server->checkPreconditions($httpRequest, $httpResponse));

    }


}

class ServerPreconditionsNode extends File {

    function getETag() {

        return '"abc123"';

    }

    function getLastModified() {

        /* my birthday & time, I believe */
        return strtotime('1985-04-07 01:30 +02:00');

    }

    function getName() {

        return 'foo';

    }

}