Tengo un conjunto de pruebas para una construcción de EC2 Redis que prueba si el recurso tiene políticas de IAM particulares adjuntas. Puedo probar si tiene todos los valores dentro de una prueba con éxito, pero al probar si tiene cada política individualmente, solo pasa la primera prueba. Parece que el orden de los valores en la matriz de políticas puede hacer que la prueba falle, lo cual no es lo ideal.
Me gustaría poder proporcionar pruebas unitarias más granulares donde una prueba específica fallará con una descripción de la política que espera la prueba, pero no puedo encontrar nada que pueda habilitar este comportamiento en la biblioteca de afirmación de AWS CDK . ¿Hay alguna manera de probar si una matriz de propiedades de una construcción CDK incluye solo un valor?
Pases:
test('Redis Instance - should attach all IAM policies in order', () => { const name = 'test-redis' const { stack } = createRedisInstance(name) expect(stack).to(haveResourceLike('AWS::IAM::Role', { ManagedPolicyArns: [{ 'Fn::Join': ['', [ 'arn:', { Ref: 'AWS::Partition' }, ':iam::aws:policy/AmazonSSMManagedInstanceCore' ]] }, { 'Fn::Join': ['', [ 'arn:', { Ref: 'AWS::Partition' }, ':iam::aws:policy/AmazonS3ReadOnlyAccess' ]] }, { 'Fn::Join': ['', [ 'arn:', { Ref: 'AWS::Partition' }, ':iam::aws:policy/CloudWatchAgentServerPolicy' ]] }] })) })falla:
test('Redis Instance - should attach AmazonSSMManagedInstanceCore IAM policy', () => { const name = 'test-redis' const { stack } = createRedisInstance(name) expect(stack).to(haveResourceLike('AWS::IAM::Role', { ManagedPolicyArns: [{ 'Fn::Join': ['', [ 'arn:', { Ref: 'AWS::Partition' }, ':iam::aws:policy/AmazonSSMManagedInstanceCore' ]] }] })) }) test('Redis Instance - should attach AmazonS3ReadOnlyAccess IAM policy', () => { const name = 'test-redis' const { stack } = createRedisInstance(name) expect(stack).to(haveResourceLike('AWS::IAM::Role', { ManagedPolicyArns: [{ 'Fn::Join': ['', [ 'arn:', { Ref: 'AWS::Partition' }, ':iam::aws:policy/AmazonS3ReadOnlyAccess' ]] }] })) }) test('Redis Instance - should attach CloudWatchAgentServerPolicy IAM policy', () => { const name = 'test-redis' const { stack } = createRedisInstance(name) expect(stack).to(haveResourceLike('AWS::IAM::Role', { ManagedPolicyArns: [{ 'Fn::Join': ['', [ 'arn:', { Ref: 'AWS::Partition' }, ':iam::aws:policy/CloudWatchAgentServerPolicy' ]] }] })) })Use arrayWith(objectLike({...})) para probar objetos en cualquier posición en los arreglos.
Ejemplo
import { expect as expectCDK, haveResourceLike, arrayWith, objectLike, // deepObjectLike // sometimes better than objectLike } from '@aws-cdk/assert'; ... ... test('Redis Instance - should attach CloudWatchAgentServerPolicy IAM policy', () => { const name = 'test-redis' const { stack } = createRedisInstance(name) expect(stack).to(haveResourceLike('AWS::IAM::Role', { ManagedPolicyArns: arrayWith( objectLike({ ... }), ) })) })Para aquellos que usan CDK v2, pueden lograr lo mismo con Match.arrayWith y Match.objectLike
template.hasResourceProperties('AWS::IAM::Policy', Match.objectLike({ PolicyDocument: { Statement: Match.arrayWith([Match.objectLike({ Action: 'secretsmanager:GetSecretValue', Effect: 'Allow', Resource: 'arn:aws:secretsmanager:TEST_REGION:TEST_ACCOUNT:secret:YourSecret-??????' })]) } }));https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.assertions-readme.html