8 次代碼提交 37276c5ebc ... 1a87440403

作者 SHA1 備註 提交日期
  Shalvah 1a87440403 Cleanup: simplify configureStrategy and add docs 2 月之前
  Shalvah 57bd39a2f1 Cleanup: replace mergeResults with StaticData strategy 2 月之前
  Shalvah 9882564371 overrideResults -> mergeResults 2 月之前
  Shalvah f085cc00d8 Remove addStrategies 2 月之前
  Shalvah 1a01b045e5 More Lumen cuts 2 月之前
  Shalvah e230a7f40e Default tryItOut base URL to display URL 3 月之前
  Shalvah b62479015f Standardise old config file 3 月之前
  Shalvah 01400953f4 Standardise override in config file 3 月之前

+ 3 - 12
.github/ISSUE_TEMPLATE/bug_report.yml

@@ -8,7 +8,7 @@ body:
     attributes:
       value: |
         Before submitting an issue, first try updating your Scribe version and other common solutions mentioned in the [troubleshooting guide](https://scribe.knuckles.wtf/laravel/troubleshooting).
-        
+
         Also search [the docs](https://scribe.knuckles.wtf/laravel) and [existing issues](https://github.com/knuckleswtf/scribe/issues?q=is%3Aissue+) (both open and closed) for any related problems or solutions.
   - type: input
     id: scribe_version
@@ -26,21 +26,12 @@ body:
       placeholder: "example: 8.1"
     validations:
       required: true
-  - type: dropdown
-    id: framework
-    attributes:
-      label: Framework
-      options:
-      - Laravel
-      - Lumen
-    validations:
-      required: true
   - type: input
     id: version
     attributes:
-      label: Framework version
+      label: Laravel version
       description: |
-        Run `composer show -v | grep laravel/framework` or `composer show -v | grep laravel/lumen-framework`
+        Run `composer show -v | grep laravel/framework`
       placeholder: "example: 10.0.1"
     validations:
       required: true

+ 18 - 14
config/scribe.php

@@ -3,7 +3,7 @@
 use Knuckles\Scribe\Config;
 use Knuckles\Scribe\Config\{AuthIn,ExternalTheme};
 use Knuckles\Scribe\Extracting\Strategies;
-use function Knuckles\Scribe\Config\{overrideResults, addStrategies, removeStrategies, withConfiguredStrategy};
+use function Knuckles\Scribe\Config\{removeStrategies, configureStrategy};
 
 /**
  * For documentation, use your IDE's autocomplete features, or see https://scribe.knuckles.wtf/laravel/reference/config
@@ -32,17 +32,21 @@ return Config\Factory::make(
             MARKDOWN
         ),
         strategies: Config\Extracting::strategies(
-        // Use addStrategies() to add your custom strategies. Use removeStrategies() to remove the included ones.
-        // Use overrideResults() to override the data returned from a strategy. Use withConfiguredStrategy() to configure a strategy which supports it.
-            metadata: Config\Defaults::METADATA_STRATEGIES,
-            urlParameters: Config\Defaults::URL_PARAMETERS_STRATEGIES,
-            queryParameters: Config\Defaults::QUERY_PARAMETERS_STRATEGIES,
-            headers: overrideResults(Config\Defaults::HEADERS_STRATEGIES, with: [
-                'Content-Type' => 'application/json',
-                'Accept' => 'application/json',
-            ]),
-            bodyParameters: Config\Defaults::BODY_PARAMETERS_STRATEGIES,
-            responses: withConfiguredStrategy(
+        // The strategies Scribe will use to extract information about your routes at each stage.
+        // Use configureStrategy() to specify settings for a strategy in the list.
+        // Use removeStrategies() to remove an included strategy.
+            metadata: [...Config\Defaults::METADATA_STRATEGIES],
+            urlParameters: [...Config\Defaults::URL_PARAMETERS_STRATEGIES],
+            queryParameters: [...Config\Defaults::QUERY_PARAMETERS_STRATEGIES],
+            headers: [
+                ...Config\Defaults::HEADERS_STRATEGIES,
+                Strategies\StaticData::withSettings(data: [
+                    'Content-Type' => 'application/json',
+                    'Accept' => 'application/json',
+                ]),
+            ],
+            bodyParameters: [...Config\Defaults::BODY_PARAMETERS_STRATEGIES],
+            responses: configureStrategy(
                 Config\Defaults::RESPONSES_STRATEGIES,
                 Strategies\Responses\ResponseCalls::withSettings(
                     only: ['GET *'],
@@ -55,7 +59,7 @@ return Config\Factory::make(
                     fileParams: [],
                     cookies: [],
                 )),
-            responseFields: Config\Defaults::RESPONSE_FIELDS_STRATEGIES,
+            responseFields: [...Config\Defaults::RESPONSE_FIELDS_STRATEGIES],
         )
     ),
     output: Config\Output::with(
@@ -66,7 +70,7 @@ return Config\Factory::make(
         title: config('app.name').' API Documentation',
         description: '',
         baseUrls: [
-            "production" => config("app.base_url"),
+            "production" => config("app.url"),
         ],
         exampleLanguages: ['bash', 'javascript'],
         logo: false,

+ 29 - 47
config/scribe_old.php

@@ -1,17 +1,19 @@
 <?php
 
 use Knuckles\Scribe\Extracting\Strategies;
+use Knuckles\Scribe\Config;
+use function Knuckles\Scribe\Config\{removeStrategies, configureStrategy};
 
 return [
     // The HTML <title> for the generated documentation. If this is empty, Scribe will infer it from config('app.name').
-    'title' => null,
+    'title' => config('app.name').' API Documentation',
 
     // A short description of your API. Will be included in the docs webpage, Postman collection and OpenAPI spec.
     'description' => '',
 
     // The base URL displayed in the docs. If this is empty, Scribe will use the value of config('app.url') at generation time.
     // If you're using `laravel` type, you can set this to a dynamic string, like '{{ config("app.tenant_url") }}' to get a dynamic base URL.
-    'base_url' => null,
+    'base_url' => config("app.url"),
 
     'routes' => [
         [
@@ -41,10 +43,10 @@ return [
     // - "laravel" will generate the documentation as a Blade view, so you can add routing and authentication.
     // - "external_static" and "external_laravel" do the same as above, but generate a basic template,
     // passing the OpenAPI spec as a URL, allowing you to easily use the docs with an external generator
-    'type' => 'static',
+    'type' => 'external_laravel',
 
     // See https://scribe.knuckles.wtf/laravel/reference/config#theme for supported options
-    'theme' => 'default',
+    'theme' => 'scalar',
 
     'static' => [
         // HTML documentation, assets and Postman collection will be generated to this folder.
@@ -80,7 +82,7 @@ return [
         'enabled' => true,
 
         // The base URL for the API tester to use (for example, you can set this to your staging URL).
-        // Leave as null to use the current app URL when generating (config("app.url")).
+        // Leave as null to be the same as the displayed URL (config("scribe.base_url")).
         'base_url' => null,
 
         // [Laravel Sanctum] Fetch a CSRF token before each request, and add it as an X-XSRF-TOKEN header.
@@ -200,61 +202,41 @@ INTRO
     ],
 
     // The strategies Scribe will use to extract information about your routes at each stage.
-    // If you create or install a custom strategy, add it here.
+    // Use configureStrategy() to specify settings for a strategy in the list.
+    // Use removeStrategies() to remove an included strategy.
     'strategies' => [
         'metadata' => [
-            Strategies\Metadata\GetFromDocBlocks::class,
-            Strategies\Metadata\GetFromMetadataAttributes::class,
+            ...Config\Defaults::METADATA_STRATEGIES,
         ],
         'urlParameters' => [
-            Strategies\UrlParameters\GetFromLaravelAPI::class,
-            Strategies\UrlParameters\GetFromUrlParamAttribute::class,
-            Strategies\UrlParameters\GetFromUrlParamTag::class,
+            ...Config\Defaults::URL_PARAMETERS_STRATEGIES,
         ],
         'queryParameters' => [
-            Strategies\QueryParameters\GetFromFormRequest::class,
-            Strategies\QueryParameters\GetFromInlineValidator::class,
-            Strategies\QueryParameters\GetFromQueryParamAttribute::class,
-            Strategies\QueryParameters\GetFromQueryParamTag::class,
+            ...Config\Defaults::QUERY_PARAMETERS_STRATEGIES,
         ],
         'headers' => [
-            Strategies\Headers\GetFromHeaderAttribute::class,
-            Strategies\Headers\GetFromHeaderTag::class,
-            [
-                'override',
-                [
-                    'Content-Type' => 'application/json',
-                    'Accept' => 'application/json',
-                ]
-            ]
+            ...Config\Defaults::HEADERS_STRATEGIES,
+            Strategies\StaticData::withSettings(data: [
+                'Content-Type' => 'application/json',
+                'Accept' => 'application/json',
+            ]),
         ],
         'bodyParameters' => [
-            Strategies\BodyParameters\GetFromFormRequest::class,
-            Strategies\BodyParameters\GetFromInlineValidator::class,
-            Strategies\BodyParameters\GetFromBodyParamAttribute::class,
-            Strategies\BodyParameters\GetFromBodyParamTag::class,
+            ...Config\Defaults::BODY_PARAMETERS_STRATEGIES,
         ],
-        'responses' => [
-            Strategies\Responses\UseResponseAttributes::class,
-            Strategies\Responses\UseTransformerTags::class,
-            Strategies\Responses\UseApiResourceTags::class,
-            Strategies\Responses\UseResponseTag::class,
-            Strategies\Responses\UseResponseFileTag::class,
-            [
-                Strategies\Responses\ResponseCalls::class,
-                [
-                    'only' => ['GET *'],
-                    // Disable debug mode when generating response calls to avoid error stack traces in responses
-                    'config' => [
-                        'app.debug' => false,
-                    ],
+        'responses' => configureStrategy(
+            Config\Defaults::RESPONSES_STRATEGIES,
+            Strategies\Responses\ResponseCalls::withSettings(
+                only: ['GET *'],
+                // Disable debug mode when generating response calls to avoid error stack traces in responses
+                config: [
+                    'app.debug' => false,
                 ]
-            ]
-        ],
+            )
+        ),
         'responseFields' => [
-            Strategies\ResponseFields\GetFromResponseFieldAttribute::class,
-            Strategies\ResponseFields\GetFromResponseFieldTag::class,
-        ],
+            ...Config\Defaults::RESPONSE_FIELDS_STRATEGIES,
+        ]
     ],
 
     // For response calls, API resource responses and transformer responses,

+ 1 - 1
resources/views/themes/default/index.blade.php

@@ -33,7 +33,7 @@
 
 @if($tryItOut['enabled'] ?? true)
     <script>
-        var tryItOutBaseUrl = "{!! $tryItOut['base_url'] ?? config('app.url') !!}";
+        var tryItOutBaseUrl = "{!! $tryItOut['base_url'] ?? $baseUrl !!}";
         var useCsrf = Boolean({!! $tryItOut['use_csrf'] ?? null !!});
         var csrfUrl = "{!! $tryItOut['csrf_url'] ?? null !!}";
     </script>

+ 1 - 1
resources/views/themes/elements/index.blade.php

@@ -27,7 +27,7 @@
 
     @if($tryItOut['enabled'] ?? true)
         <script>
-            var tryItOutBaseUrl = "{{ $tryItOut['base_url'] ?? config('app.url') }}";
+            var tryItOutBaseUrl = "{{ $tryItOut['base_url'] ?? $baseUrl }}";
             var useCsrf = Boolean({{ $tryItOut['use_csrf'] ?? null }});
             var csrfUrl = "{{ $tryItOut['csrf_url'] ?? null }}";
         </script>

+ 0 - 23
routes/lumen.php

@@ -1,23 +0,0 @@
-<?php
-
-use Illuminate\Http\JsonResponse;
-use Illuminate\Support\Facades\Storage;
-
-$prefix = config('scribe.laravel.docs_url', '/docs');
-$middleware = config('scribe.laravel.middleware', []);
-
-$router = app()->router;
-
-$router->group([
-    'middleware' => $middleware,
-], function () use ($router, $prefix) {
-    $router->get($prefix, function () {
-        return view('scribe.index');
-    })->name('scribe');
-    $router->get("$prefix.postman", function () {
-        return new JsonResponse(Storage::disk('local')->get('scribe/collection.json'), json: true);
-    })->name('scribe.postman');
-    $router->get("$prefix.openapi", function () {
-        return response()->file(Storage::disk('local')->path('scribe/openapi.yaml'));
-    })->name('scribe.openapi');
-});

+ 21 - 29
src/Config/strategies.php

@@ -3,51 +3,43 @@
 namespace Knuckles\Scribe\Config;
 
 use Illuminate\Support\Arr;
-use Knuckles\Scribe\Extracting\Strategies\Strategy;
 
 // Strategies can be:
 // 1. (Original) A class name, e.g. Strategies\Responses\ResponseCalls::class
-// 2. (New) A tuple containing the class name as item 1, and its config array as item 2
-// 3. (New) A tuple containing "override" as item 1, and the values to override array as item 2
+// 2. (New) A tuple containing the class name (or "static_data") as item 1, and its settings array as item 2
+
 /**
- * @param array $strategies
- * @param array $with
- * @param array $only The routes that should be overridden. Same format as the route matcher.
- * @param array $except The routes that should not be overridden. Same format as the route matcher.
- * @return array
+ * Remove one or more strategies from a list of strategies.
  */
-function overrideResults(array $strategies, array $with, array $only = ['*'], array $except = []): array
-{
-    $overrideStrategy = Strategy::wrapWithSettings('override', only: $only, except: $except, otherSettings: ['with' => $with]);
-    return addStrategies($strategies, [$overrideStrategy]);
-}
-
-function addStrategies(array $strategies, array $newStrategies = []): array
+function removeStrategies(array $strategiesList, array $strategyNamesToRemove): array
 {
-    return array_merge($strategies, $newStrategies);
-}
-
-function removeStrategies(array $strategies, array $strategyNamesToRemove): array
-{
-    $correspondingStrategies = Arr::where($strategies, function ($strategy) use ($strategyNamesToRemove) {
+    $correspondingStrategies = Arr::where($strategiesList, function ($strategy) use ($strategyNamesToRemove) {
         $strategyName = is_string($strategy) ? $strategy : $strategy[0];
         return in_array($strategyName, $strategyNamesToRemove);
     });
 
     foreach ($correspondingStrategies as $key => $value) {
-        unset($strategies[$key]);
+        unset($strategiesList[$key]);
     }
 
-    return $strategies;
+    return $strategiesList;
 }
 
 /**
- * Replaces the strategy entry in the list with a tuple containing [strategy_name, config_array].
+ * Add/replace a strategy and its settings in a list of strategies.
+ * This method generates a tuple containing [strategyName, settingsArray],
+ * and adds or replaces the strategy entry in the list.
+ *
+ * @param array $strategiesList
+ * @param array $configurationTuple Tuple of [strategyName, settingsArray].
+ *   By default, all strategies support the "only" and "except" setting to apply them to specific endpoints.
+ *   You can easily create the tuple by calling Strategy::wrapWithSettings(only: [], except: []).
+ * @return array
  */
-function withConfiguredStrategy(array $strategies, array $configurationTuple): array
+function configureStrategy(array $strategiesList, array $configurationTuple): array
 {
     $strategyFound = false;
-    $strategies = array_map(function ($strategy) use ($configurationTuple, &$strategyFound) {
+    $strategiesList = array_map(function ($strategy) use ($configurationTuple, &$strategyFound) {
         $strategyName = is_string($strategy) ? $strategy : $strategy[0];
         if ($strategyName == $configurationTuple[0]) {
             $strategyFound = true;
@@ -55,11 +47,11 @@ function withConfiguredStrategy(array $strategies, array $configurationTuple): a
         }
 
         return $strategy;
-    }, $strategies);
+    }, $strategiesList);
 
     // If strategy wasn't in there, add it.
     if (!$strategyFound) {
-        $strategies = addStrategies($strategies, [$configurationTuple]);
+        $strategiesList = array_merge($strategiesList, [$configurationTuple]);
     }
-    return $strategies;
+    return $strategiesList;
 }

+ 11 - 6
src/Extracting/Extractor.php

@@ -14,7 +14,8 @@ use Illuminate\Support\Str;
 use Knuckles\Camel\Extraction\ResponseCollection;
 use Knuckles\Camel\Extraction\ResponseField;
 use Knuckles\Camel\Output\OutputEndpointData;
-use Knuckles\Scribe\Extracting\Strategies\Override;
+use Knuckles\Scribe\Extracting\Strategies\StaticData;
+use Knuckles\Scribe\Tools\ConsoleOutputUtils as c;
 use Knuckles\Scribe\Tools\DocumentationConfig;
 use Knuckles\Scribe\Tools\RoutePatternMatcher;
 
@@ -210,13 +211,17 @@ class Extractor
             if (is_array($strategyClassOrTuple)) {
                 [$strategyClass, &$settings] = $strategyClassOrTuple;
                 if ($strategyClass == 'override') {
-                    $strategyClass = Override::class;
-                    // Overrides can be short: ['override', ['key' => 'value']],
-                    // or extended ['override', ['with' => ['key' => 'value'], 'only' => ['GET *'], 'except' => []]],
-                    $settingsFormat = array_key_exists('with', $settings) ? 'extended' : 'short';
+                    c::warn("The 'override' strategy was renamed to 'static_data', and will stop working in the future. Please replace 'override' in your config file with 'static_data'.");
+                    $strategyClass = 'static_data';
+                }
+                if ($strategyClass == 'static_data') {
+                    $strategyClass = StaticData::class;
+                    // Static data can be short: ['static_data', ['key' => 'value']],
+                    // or extended ['static_data', ['data' => ['key' => 'value'], 'only' => ['GET *'], 'except' => []]],
+                    $settingsFormat = array_key_exists('data', $settings) ? 'extended' : 'short';
                     $settings = match($settingsFormat) {
                         'extended' => $settings,
-                        'short' => ['with' => $settings],
+                        'short' => ['data' => $settings],
                     };
                 }
             } else {

+ 0 - 13
src/Extracting/Strategies/Override.php

@@ -1,13 +0,0 @@
-<?php
-
-namespace Knuckles\Scribe\Extracting\Strategies;
-
-use Knuckles\Camel\Extraction\ExtractedEndpointData;
-
-class Override extends Strategy
-{
-    public function __invoke(ExtractedEndpointData $endpointData, array $settings = []): ?array
-    {
-        return $settings['with'];
-    }
-}

+ 10 - 8
src/Extracting/Strategies/Responses/ResponseCalls.php

@@ -301,7 +301,7 @@ class ResponseCalls extends Strategy
      * @return array
      */
     public static function withSettings(
-        array $only = ['GET *'],
+        array $only = [],
         array $except = [],
         array $config = [],
         array $queryParams = [],
@@ -313,12 +313,14 @@ class ResponseCalls extends Strategy
     ): array
     {
         return static::wrapWithSettings(
-            static::class, only: $only, except: $except, otherSettings: compact(
-            'config',
-            'queryParams',
-            'bodyParams',
-            'fileParams',
-            'cookies',
-        ));
+            only: $only,
+            except: $except,
+            otherSettings: compact(
+                'config',
+                'queryParams',
+                'bodyParams',
+                'fileParams',
+                'cookies',
+            ));
     }
 }

+ 30 - 0
src/Extracting/Strategies/StaticData.php

@@ -0,0 +1,30 @@
+<?php
+
+namespace Knuckles\Scribe\Extracting\Strategies;
+
+use Knuckles\Camel\Extraction\ExtractedEndpointData;
+
+/**
+ * A simple strategy that returns a set of static data.
+ */
+class StaticData extends Strategy
+{
+    public function __invoke(ExtractedEndpointData $endpointData, array $settings = []): ?array
+    {
+        return $settings['data'];
+    }
+
+    public static function withSettings(
+        array $only = [],
+        array $except = [],
+        array $data = [],
+    ): array
+    {
+        return static::wrapWithSettings(
+            only: $only, except: $except,
+            otherSettings: compact(
+                'data',
+            )
+        );
+    }
+}

+ 2 - 3
src/Extracting/Strategies/Strategy.php

@@ -42,8 +42,7 @@ abstract class Strategy
      * @return array{string,array} Tuple of strategy class FQN and specified settings.
      */
     public static function wrapWithSettings(
-        string $strategyName = self::class,
-        array $only = ['*'],
+        array $only = [],
         array $except = [],
         array $otherSettings = []
     ): array
@@ -55,7 +54,7 @@ abstract class Strategy
         }
 
         return [
-            $strategyName,
+            static::class,
             ['only' => $only, 'except' => $except, ...$otherSettings],
         ];
     }

+ 1 - 1
src/ScribeServiceProvider.php

@@ -32,7 +32,7 @@ class ScribeServiceProvider extends ServiceProvider
         $this->app->bind(RouteMatcherInterface::class, config('scribe.routeMatcher', RouteMatcher::class));
 
         if (!class_exists('Str')) {
-            // Lumen may not have the aliases set up, and we don't want to have to use the FQN in our blade files.
+            // We don't want to have to use the FQN in our blade files.
             class_alias(\Illuminate\Support\Str::class, 'Str');
         }
     }

+ 2 - 2
tests/BaseLaravelTest.php

@@ -6,7 +6,7 @@ use DMS\PHPUnitExtensions\ArraySubset\ArraySubsetAsserts;
 use Knuckles\Scribe\Config\AuthIn;
 use Knuckles\Scribe\ScribeServiceProvider;
 use Orchestra\Testbench\TestCase;
-use function Knuckles\Scribe\Config\withConfiguredStrategy;
+use function Knuckles\Scribe\Config\configureStrategy;
 use Knuckles\Scribe\Config;
 use Knuckles\Scribe\Extracting\Strategies;
 
@@ -68,7 +68,7 @@ class BaseLaravelTest extends TestCase
                     queryParameters: Config\Defaults::QUERY_PARAMETERS_STRATEGIES,
                     headers: Config\Defaults::HEADERS_STRATEGIES,
                     bodyParameters: Config\Defaults::BODY_PARAMETERS_STRATEGIES,
-                    responses: withConfiguredStrategy(
+                    responses: configureStrategy(
                         Config\Defaults::RESPONSES_STRATEGIES,
                         Strategies\Responses\ResponseCalls::withSettings(
                             only: [],

+ 10 - 28
tests/GenerateDocumentation/OutputTest.php

@@ -6,7 +6,6 @@ use Illuminate\Support\Facades\Route as RouteFacade;
 use Illuminate\Support\Facades\Storage;
 use Illuminate\Support\Facades\View;
 use Illuminate\Support\Str;
-use Knuckles\Scribe\Config\Defaults;
 use Knuckles\Scribe\Tests\BaseLaravelTest;
 use Knuckles\Scribe\Tests\Fixtures\TestController;
 use Knuckles\Scribe\Tests\Fixtures\TestGroupController;
@@ -22,8 +21,7 @@ use Knuckles\Scribe\Tools\Utils;
 use Symfony\Component\DomCrawler\Crawler;
 use Symfony\Component\Yaml\Yaml;
 use Knuckles\Scribe\Extracting\Strategies;
-use function Knuckles\Scribe\Config\overrideResults;
-use function Knuckles\Scribe\Config\withConfiguredStrategy;
+use function Knuckles\Scribe\Config\configureStrategy;
 
 class OutputTest extends BaseLaravelTest
 {
@@ -140,9 +138,10 @@ class OutputTest extends BaseLaravelTest
             'postman.overrides' => [
                 'info.version' => '3.9.9',
             ],
-            'strategies.headers' => overrideResults(config('scribe.strategies.headers'), [
-                'Custom-Header' => 'NotSoCustom',
-            ]),
+            'strategies.headers' => [
+                ...config('scribe.strategies.headers'),
+                Strategies\StaticData::withSettings(data: ['Custom-Header' => 'NotSoCustom']),
+            ],
         ]);
         $this->enableResponseCalls();
 
@@ -201,9 +200,10 @@ class OutputTest extends BaseLaravelTest
             'openapi.overrides' => [
                 'info.version' => '3.9.9',
             ],
-            'strategies.headers' => overrideResults(Defaults::HEADERS_STRATEGIES, [
-                'Custom-Header' => 'NotSoCustom',
-            ]),
+            'strategies.headers' =>  [
+                ...config('scribe.strategies.headers'),
+                Strategies\StaticData::withSettings(data: ['Custom-Header' => 'NotSoCustom']),
+            ],
         ]);
         $this->enableResponseCalls();
 
@@ -218,24 +218,6 @@ class OutputTest extends BaseLaravelTest
         $this->assertEquals($fixtureSpec, $generatedSpec);
     }
 
-    /** @test */
-    public function can_append_custom_http_headers()
-    {
-        RouteFacade::get('/api/headers', [TestController::class, 'checkCustomHeaders']);
-        $this->setConfig([
-            'strategies.headers' => overrideResults(Defaults::HEADERS_STRATEGIES, [
-                    'Authorization' => 'customAuthToken',
-                    'Custom-Header' => 'NotSoCustom',
-                ]
-            ),
-        ]);
-        $this->generate();
-
-        $endpointDetails = Yaml::parseFile('.scribe/endpoints/00.yaml')['endpoints'][0];
-        $this->assertEquals("customAuthToken", $endpointDetails['headers']["Authorization"]);
-        $this->assertEquals("NotSoCustom", $endpointDetails['headers']["Custom-Header"]);
-    }
-
     /** @test */
     public function can_parse_utf8_response()
     {
@@ -611,7 +593,7 @@ class OutputTest extends BaseLaravelTest
     protected function enableResponseCalls(): void
     {
         $this->setConfig([
-            'strategies.responses' => withConfiguredStrategy(
+            'strategies.responses' => configureStrategy(
                 config('scribe.strategies.responses'),
                 Strategies\Responses\ResponseCalls::withSettings(only: ['GET *'], except: [])
             )

+ 30 - 3
tests/Unit/ExtractorTest.php

@@ -207,7 +207,7 @@ class ExtractorTest extends BaseLaravelTest
         $this->config['strategies']['headers'] = [
             Strategies\Headers\GetFromHeaderAttribute::class,
             [
-                'override', $headers
+                'static_data', $headers
             ],
         ];
         $parsed = $this->process($route);
@@ -228,14 +228,41 @@ class ExtractorTest extends BaseLaravelTest
         ];
         $this->config['strategies']['headers'] = [
             Strategies\Headers\GetFromHeaderAttribute::class,
-            ['override', ['with' => $headers, 'only' => ['GET *']]],
+            ['static_data', ['data' => $headers, 'only' => ['GET *']]],
         ];
         $parsed = $this->process($route);
         $this->assertArraySubset($parsed->headers, $headers);
 
         $this->config['strategies']['headers'] = [
             Strategies\Headers\GetFromHeaderAttribute::class,
-            ['override', ['with' => $headers, 'only' => [], 'except' => ['GET *']]],
+            ['static_data', ['data' => $headers, 'only' => [], 'except' => ['GET *']]],
+        ];
+        $parsed = $this->process($route);
+        $this->assertEmpty($parsed->headers);
+    }
+
+    /** @test */
+    public function overrides_headers_based_on_full_strategy_config()
+    {
+        $route = $this->createRoute('GET', '/get', 'dummy');
+        $this->config['strategies']['headers'] = [Strategies\Headers\GetFromHeaderAttribute::class];
+        $parsed = $this->process($route);
+        $this->assertEmpty($parsed->headers);
+
+        $headers = [
+            'accept' => 'application/json',
+            'Content-Type' => 'application/json+vnd',
+        ];
+        $this->config['strategies']['headers'] = [
+            Strategies\Headers\GetFromHeaderAttribute::class,
+            Strategies\StaticData::withSettings(only: ['GET *'], data: $headers),
+        ];
+        $parsed = $this->process($route);
+        $this->assertArraySubset($parsed->headers, $headers);
+
+        $this->config['strategies']['headers'] = [
+            Strategies\Headers\GetFromHeaderAttribute::class,
+            Strategies\StaticData::withSettings(except: ['GET *'], data: $headers),
         ];
         $parsed = $this->process($route);
         $this->assertEmpty($parsed->headers);