@@ -1446,3 +1446,105 @@ def setup
14461446 assert_instance_of ( ActionDispatch ::Request ::Session ::Options , ActionDispatch ::Request ::Session ::Options . find ( @request ) )
14471447 end
14481448end
1449+
1450+ class RequestCacheControlDirectives < BaseRequestTest
1451+ test "lazily initializes cache_control_directives" do
1452+ request = stub_request
1453+ assert_not_includes request . instance_variables , :@cache_control_directives
1454+
1455+ request . cache_control_directives
1456+ assert_includes request . instance_variables , :@cache_control_directives
1457+ end
1458+
1459+ test "only_if_cached? is true when only-if-cached is the sole directive" do
1460+ request = stub_request ( "HTTP_CACHE_CONTROL" => "only-if-cached" )
1461+ assert_predicate request . cache_control_directives , :only_if_cached?
1462+ end
1463+
1464+ test "only_if_cached? is true when only-if-cached appears among multiple directives" do
1465+ request = stub_request ( "HTTP_CACHE_CONTROL" => "max-age=60, only-if-cached" )
1466+ assert_predicate request . cache_control_directives , :only_if_cached?
1467+ end
1468+
1469+ test "only_if_cached? is false when Cache-Control header is missing" do
1470+ request = stub_request
1471+ assert_not_predicate request . cache_control_directives , :only_if_cached?
1472+ end
1473+
1474+ test "no_cache? properly detects the no-cache directive" do
1475+ request = stub_request ( "HTTP_CACHE_CONTROL" => "no-cache" )
1476+ assert_predicate request . cache_control_directives , :no_cache?
1477+ end
1478+
1479+ test "no_store? properly detects the no-store directive" do
1480+ request = stub_request ( "HTTP_CACHE_CONTROL" => "no-store" )
1481+ assert_predicate request . cache_control_directives , :no_store?
1482+ end
1483+
1484+ test "no_transform? properly detects the no-transform directive" do
1485+ request = stub_request ( "HTTP_CACHE_CONTROL" => "no-transform" )
1486+ assert_predicate request . cache_control_directives , :no_transform?
1487+ end
1488+
1489+ test "max_age properly returns the max-age directive value" do
1490+ request = stub_request ( "HTTP_CACHE_CONTROL" => "max-age=60" )
1491+ assert_equal 60 , request . cache_control_directives . max_age
1492+ end
1493+
1494+ test "max_stale properly returns the max-stale directive value" do
1495+ request = stub_request ( "HTTP_CACHE_CONTROL" => "max-stale=300" )
1496+ assert_equal 300 , request . cache_control_directives . max_stale
1497+ end
1498+
1499+ test "max_stale returns true when max-stale is present without a value" do
1500+ request = stub_request ( "HTTP_CACHE_CONTROL" => "max-stale" )
1501+ assert_equal true , request . cache_control_directives . max_stale
1502+ end
1503+
1504+ test "max_stale? returns true when max-stale is present with or without a value" do
1505+ request = stub_request ( "HTTP_CACHE_CONTROL" => "max-stale=300" )
1506+ assert_predicate request . cache_control_directives , :max_stale?
1507+
1508+ request = stub_request ( "HTTP_CACHE_CONTROL" => "max-stale" )
1509+ assert_predicate request . cache_control_directives , :max_stale?
1510+ end
1511+
1512+ test "max_stale? returns false when max-stale is not present" do
1513+ request = stub_request
1514+ assert_not_predicate request . cache_control_directives , :max_stale?
1515+ end
1516+
1517+ test "max_stale_unlimited? returns true only when max-stale is present without a value" do
1518+ request = stub_request ( "HTTP_CACHE_CONTROL" => "max-stale" )
1519+ assert_predicate request . cache_control_directives , :max_stale_unlimited?
1520+
1521+ request = stub_request ( "HTTP_CACHE_CONTROL" => "max-stale=300" )
1522+ assert_not_predicate request . cache_control_directives , :max_stale_unlimited?
1523+
1524+ request = stub_request
1525+ assert_not_predicate request . cache_control_directives , :max_stale_unlimited?
1526+ end
1527+
1528+ test "min_fresh properly returns the min-fresh directive value" do
1529+ request = stub_request ( "HTTP_CACHE_CONTROL" => "min-fresh=120" )
1530+ assert_equal 120 , request . cache_control_directives . min_fresh
1531+ end
1532+
1533+ test "stale_if_error properly returns the stale-if-error directive value" do
1534+ request = stub_request ( "HTTP_CACHE_CONTROL" => "stale-if-error=600" )
1535+ assert_equal 600 , request . cache_control_directives . stale_if_error
1536+ end
1537+
1538+ test "handles Cache-Control header with whitespace and case insensitivity" do
1539+ request = stub_request ( "HTTP_CACHE_CONTROL" => " Max-Age=60 , No-Cache " )
1540+ assert_equal 60 , request . cache_control_directives . max_age
1541+ assert_predicate request . cache_control_directives , :no_cache?
1542+ end
1543+
1544+ test "ignores unrecognized directives" do
1545+ request = stub_request ( "HTTP_CACHE_CONTROL" => "max-age=60, unknown-directive, foo=bar" )
1546+ assert_equal 60 , request . cache_control_directives . max_age
1547+ assert_not_predicate request . cache_control_directives , :no_cache?
1548+ assert_not_predicate request . cache_control_directives , :no_store?
1549+ end
1550+ end
0 commit comments