scaffolder-backend: remove unused hasProperty permission rule

The hasProperty rule was not included in the scaffolderActionRules export
or the public API report. Remove it and its associated tests.

Signed-off-by: Patrik Oldsberg <poldsberg@gmail.com>
Made-with: Cursor
This commit is contained in:
Patrik Oldsberg
2026-04-13 16:51:10 +02:00
parent 722b35e1a4
commit 61454d9a0c
2 changed files with 1 additions and 167 deletions
@@ -14,19 +14,15 @@
* limitations under the License.
*/
import { JsonObject, JsonPrimitive } from '@backstage/types';
import { JsonObject } from '@backstage/types';
import {
hasActionId,
hasBooleanProperty,
hasNumberProperty,
hasProperty,
hasStringProperty,
hasTag,
isTaskOwner,
} from './rules';
import { createConditionAuthorizer } from '@backstage/plugin-permission-node';
import { RESOURCE_TYPE_SCAFFOLDER_ACTION } from '@backstage/plugin-scaffolder-common/alpha';
import { AuthorizeResult } from '@backstage/plugin-permission-common';
import { SerializedTask } from '@backstage/plugin-scaffolder-node';
import { TaskSpec } from '@backstage/plugin-scaffolder-common';
@@ -137,162 +133,6 @@ const input: JsonObject = {
nested: { propwithstring: '1', nested: { propwithnumber: 1 } },
};
describe('hasProperty', () => {
describe('apply', () => {
it.each([
'foo',
'bar',
'prop.prop',
'nested.nonexisting',
'',
'propwitharray.100',
])(`returns false when a property doesn't exist in the input`, key => {
expect(hasProperty.apply({ action: 'action', input }, { key })).toEqual(
false,
);
});
it.each([
'propwithstring',
'propwithnumber',
'propwithobject',
'propwithnull',
'propwithfalse',
'propwithtrue',
'propwitharray',
'propwitharray.1',
'nested.propwithstring',
'nested.nested',
'nested.nested.propwithnumber',
])(`returns true when a property exists, property=%s`, key => {
expect(hasProperty.apply({ action: 'action', input }, { key })).toEqual(
true,
);
});
it.each([
['propwithstring', 1],
['propwithnumber', '2'],
['propwithnumber', true],
['propwithobject', [{}]],
['propwithnull', false],
['propwithfalse', true],
['propwithtrue', null],
['propwitharray', 'nonexistingitem'],
['propwitharray.0', 'nonmatchingitem'],
['nested.propwithstring', 'x'],
['nested.nested', '1'],
['nested.nested.propwithnumber', 'ops'],
])(
`returns false when a property exists but the value doesn't match, key=%s value=%o`,
(key, value) => {
expect(
hasProperty.apply(
{ action: 'action', input },
{ key, value: value as JsonPrimitive },
),
).toEqual(false);
},
);
it.each([
['propwithstring', '1'],
['propwithnumber', 2],
['propwithnull', null],
['propwithfalse', false],
['propwithtrue', true],
['propwitharray.0', 'item'],
['nested.propwithstring', '1'],
['nested.nested.propwithnumber', 1],
])(
`returns true when a property exists and the value matches, key=%s value=%o`,
(key, value) => {
expect(
hasProperty.apply({ action: 'action', input }, { key, value }),
).toEqual(true);
},
);
it('should throw if params are invalid', () => {
const isActionAuthorized = createConditionAuthorizer([hasProperty]);
expect(() =>
isActionAuthorized(
{
resourceType: RESOURCE_TYPE_SCAFFOLDER_ACTION,
pluginId: 'scaffolder',
result: AuthorizeResult.CONDITIONAL,
conditions: {
resourceType: RESOURCE_TYPE_SCAFFOLDER_ACTION,
rule: 'HAS_PROPERTY',
params: {
key: 1,
},
},
},
{ action: 'an-action', input: {} },
),
).toThrow();
expect(() =>
isActionAuthorized(
{
resourceType: RESOURCE_TYPE_SCAFFOLDER_ACTION,
pluginId: 'scaffolder',
result: AuthorizeResult.CONDITIONAL,
conditions: {
resourceType: RESOURCE_TYPE_SCAFFOLDER_ACTION,
rule: 'HAS_PROPERTY',
params: {},
},
},
{ action: 'an-action', input: {} },
),
).toThrow();
});
it('should not throw if params are valid', () => {
const isActionAuthorized = createConditionAuthorizer([hasProperty]);
expect(() =>
isActionAuthorized(
{
resourceType: RESOURCE_TYPE_SCAFFOLDER_ACTION,
pluginId: 'scaffolder',
result: AuthorizeResult.CONDITIONAL,
conditions: {
resourceType: RESOURCE_TYPE_SCAFFOLDER_ACTION,
rule: 'HAS_PROPERTY',
params: {
key: 'key',
},
},
},
{ action: 'an-action', input: {} },
),
).not.toThrow();
expect(() =>
isActionAuthorized(
{
resourceType: RESOURCE_TYPE_SCAFFOLDER_ACTION,
pluginId: 'scaffolder',
result: AuthorizeResult.CONDITIONAL,
conditions: {
resourceType: RESOURCE_TYPE_SCAFFOLDER_ACTION,
rule: 'HAS_PROPERTY',
params: {
key: 'key',
value: 'value',
},
},
},
{ action: 'an-action', input: {} },
),
).not.toThrow();
});
});
});
describe('hasBooleanProperty', () => {
describe('apply', () => {
it.each(['foo', 'bar', 'prop.prop', 'nested.nonexisting', ''])(
@@ -74,12 +74,6 @@ export const hasActionId = createActionPermissionRule({
toQuery: () => ({}),
});
export const hasProperty = buildHasProperty({
name: 'HAS_PROPERTY',
valueSchema: z.union([z.string(), z.number(), z.boolean(), z.null()]),
validateProperty: false,
});
export const hasBooleanProperty = buildHasProperty({
name: 'HAS_BOOLEAN_PROPERTY',
valueSchema: z.boolean(),