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

     

                        





                                           

                                                                 
       
                                                                 
       

                                       
                                                                              
                                    


                                                                            

     

                                        
                                                                              
                                    


                                                                                    


       
                                                                 
       

                                          
                                                                              
                                    


                                                                               

     

                                            
                                                                              
                                    


                                                                                    




                                                                     

                                      

                                              
                                                                              
                                    


                                                                                       

     

                                         
                                                                              
                                    


                                                                                                 

     

                                           
                                                                              
                                    


                                                                                    


       
                                                                 
       

                                            
                                                                              
                                    


                                                                                  

     

                                              
                                                                              
                                    


                                                                                       

     

                                                      
                                                                              
                                    


                                                                                               


       
                                                                 
       

                                                
                                                                              
                                    


                                                                                         


       
                                                                 
       

                                                        
                                                                              
                                    


                                                                                                

     

                                                     
                                                                              
                                    





                                                                                             




                                              

                                                            
                                                                              



                                                                                        


                                                        




                                                                                             
                                   


                                                     

     

                                                   
                                                                              
                                    

                                                                   
           
                                                        
                                                                                             
 
                                                                
                             
                                                                 
                                                

     

                                                 
                                                                              
                                    

                                                                   
           


                                                                                    

     

                                                    
                                                                              
                                    

                                                        
           
                                                

                                                                    
                                                                                    

     

                                                     
                                                                              
                                    

                                                                     
           

                                                                                    

     

                                                     
                                                                              
                                    

                                                                     
           

                                                                                    

     
       
                                                                 
       

                                                   
                                                                              
                                    

                                                                     
           

                                                                 

     

                                                      
                                                                              
                                    

                                                                     
           

                                                                                    
     

 



                                          
                          

     

                                     

                                                    

     

                             
                     
     
 
<?php

declare(strict_types=1);

namespace Sabre\DAV;

use Sabre\HTTP;

require_once 'Sabre/HTTP/ResponseMock.php';

class ServerPreconditionsTest extends \PHPUnit\Framework\TestCase
{
    /**
     * @expectedException \Sabre\DAV\Exception\PreconditionFailed
     */
    public 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);
    }

    public 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
     */
    public 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);
    }

    public 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
     */
    public 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));
    }

    public 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));
    }

    public 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
     */
    public 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);
    }

    public 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));
    }

    public 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
     */
    public 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
     */
    public 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);
    }

    public 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.
     */
    public 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);
    }

    public function testIfModifiedSinceUnModified()
    {
        $root = new SimpleCollection('root', [new ServerPreconditionsNode()]);
        $server = new Server($root);
        $httpRequest = new HTTP\Request('GET', '/foo', [
            'If-Modified-Since' => 'Sun, 06 Nov 1994 08:49:37 GMT',
        ]);
        $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());
    }

    public function testIfModifiedSinceModified()
    {
        $root = new SimpleCollection('root', [new ServerPreconditionsNode()]);
        $server = new Server($root);
        $httpRequest = new HTTP\Request('GET', '/foo', [
            'If-Modified-Since' => 'Tue, 06 Nov 1984 08:49:37 GMT',
        ]);

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

    public function testIfModifiedSinceInvalidDate()
    {
        $root = new SimpleCollection('root', [new ServerPreconditionsNode()]);
        $server = new Server($root);
        $httpRequest = new HTTP\Request('GET', '/foo', [
            'If-Modified-Since' => 'Your mother',
        ]);
        $httpResponse = new HTTP\ResponseMock();

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

    public function testIfModifiedSinceInvalidDate2()
    {
        $root = new SimpleCollection('root', [new ServerPreconditionsNode()]);
        $server = new Server($root);
        $httpRequest = new HTTP\Request('GET', '/foo', [
            'If-Unmodified-Since' => 'Sun, 06 Nov 1994 08:49:37 EST',
        ]);
        $httpResponse = new HTTP\ResponseMock();
        $this->assertTrue($server->checkPreconditions($httpRequest, $httpResponse));
    }

    public function testIfUnmodifiedSinceUnModified()
    {
        $root = new SimpleCollection('root', [new ServerPreconditionsNode()]);
        $server = new Server($root);
        $httpRequest = new HTTP\Request('GET', '/foo', [
            'If-Unmodified-Since' => 'Sun, 06 Nov 1994 08:49:37 GMT',
        ]);
        $httpResponse = new HTTP\Response();
        $this->assertTrue($server->checkPreconditions($httpRequest, $httpResponse));
    }

    /**
     * @expectedException \Sabre\DAV\Exception\PreconditionFailed
     */
    public function testIfUnmodifiedSinceModified()
    {
        $root = new SimpleCollection('root', [new ServerPreconditionsNode()]);
        $server = new Server($root);
        $httpRequest = new HTTP\Request('GET', '/foo', [
            'If-Unmodified-Since' => 'Tue, 06 Nov 1984 08:49:37 GMT',
        ]);
        $httpResponse = new HTTP\ResponseMock();
        $server->checkPreconditions($httpRequest, $httpResponse);
    }

    public function testIfUnmodifiedSinceInvalidDate()
    {
        $root = new SimpleCollection('root', [new ServerPreconditionsNode()]);
        $server = new Server($root);
        $httpRequest = new HTTP\Request('GET', '/foo', [
            'If-Unmodified-Since' => 'Sun, 06 Nov 1984 08:49:37 CET',
        ]);
        $httpResponse = new HTTP\ResponseMock();
        $this->assertTrue($server->checkPreconditions($httpRequest, $httpResponse));
    }
}

class ServerPreconditionsNode extends File
{
    public function getETag()
    {
        return '"abc123"';
    }

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

    public function getName()
    {
        return 'foo';
    }
}