1+ import md5 from "md5" ;
2+ import { StorageAccountResource } from "./storageAccount" ;
3+ import { ServerlessAzureConfig } from "../../models/serverless" ;
4+ import { Utils } from "../../shared/utils" ;
5+
6+ describe ( "Storage Account Resource" , ( ) => {
7+ const config : ServerlessAzureConfig = {
8+ functions : [ ] ,
9+ plugins : [ ] ,
10+ provider : {
11+ prefix : "sls" ,
12+ name : "azure" ,
13+ region : "westus" ,
14+ stage : "dev" ,
15+ } ,
16+ service : "test-api"
17+ }
18+
19+ it ( "Generates safe storage account name with short parts" , ( ) => {
20+ const testConfig : ServerlessAzureConfig = {
21+ ...config ,
22+ service : "test-api" ,
23+ } ;
24+
25+ const result = StorageAccountResource . getResourceName ( testConfig ) ;
26+ assertValidStorageAccountName ( testConfig , result ) ;
27+ expect ( result . startsWith ( "slswusdev" ) ) . toBe ( true ) ;
28+ } ) ;
29+
30+ it ( "Generates safe storage account names with long parts" , ( ) => {
31+ const testConfig : ServerlessAzureConfig = {
32+ ...config ,
33+ provider : {
34+ ...config . provider ,
35+ prefix : "my-long-test-prefix-name" ,
36+ region : "Australia Southeast" ,
37+ stage : "development"
38+ } ,
39+ service : "my-long-test-api" ,
40+ } ;
41+
42+ const result = StorageAccountResource . getResourceName ( testConfig ) ;
43+ assertValidStorageAccountName ( testConfig , result ) ;
44+ expect ( result . startsWith ( "mylaussedev" ) ) . toBe ( true ) ;
45+ } ) ;
46+
47+ it ( "Generating a storage account name is idempotent" , ( ) => {
48+ const result1 = StorageAccountResource . getResourceName ( config ) ;
49+ const result2 = StorageAccountResource . getResourceName ( config ) ;
50+
51+ expect ( result1 ) . toEqual ( result2 ) ;
52+ } ) ;
53+
54+ it ( "Generates distinct account names based on region" , ( ) => {
55+ const regions = [
56+ "eastasia" ,
57+ "southeastasia" ,
58+ "centralus" ,
59+ "eastus" ,
60+ "eastus2" ,
61+ "westus" ,
62+ "northcentralus" ,
63+ "southcentralus" ,
64+ "northeurope" ,
65+ "westeurope" ,
66+ "japanwest" ,
67+ "japaneast" ,
68+ "brazilsouth" ,
69+ "australiaeast" ,
70+ "australiasoutheast" ,
71+ "southindia" ,
72+ "centralindia" ,
73+ "westindia" ,
74+ "canadacentral" ,
75+ "canadaeast" ,
76+ "uksouth" ,
77+ "ukwest" ,
78+ "westcentralus" ,
79+ "westus2" ,
80+ "koreacentral" ,
81+ "koreasouth" ,
82+ "francecentral" ,
83+ "francesouth" ,
84+ "australiacentral" ,
85+ "australiacentral2" ,
86+ "uaecentral" ,
87+ "uaenorth" ,
88+ "southafricanorth" ,
89+ "southafricawest"
90+ ] ;
91+
92+ const regionConfigs = regions . map ( ( region ) => {
93+ return {
94+ ...config ,
95+ provider : {
96+ ...config . provider ,
97+ region : region ,
98+ }
99+ } ;
100+ } ) ;
101+
102+ const results = { } ;
103+ regionConfigs . forEach ( ( config ) => {
104+ const result = StorageAccountResource . getResourceName ( config ) ;
105+ assertValidStorageAccountName ( config , result ) ;
106+ results [ result ] = config ;
107+ } ) ;
108+
109+ expect ( Object . keys ( results ) ) . toHaveLength ( regionConfigs . length ) ;
110+ } ) ;
111+
112+ it ( "Generates distinct account names based on stage" , ( ) => {
113+ const stages = [
114+ "dev" ,
115+ "test" ,
116+ "qa" ,
117+ "uat" ,
118+ "prod" ,
119+ "preprod" ,
120+ ] ;
121+
122+ const stageConfigs = stages . map ( ( region ) => {
123+ return {
124+ ...config ,
125+ provider : {
126+ ...config . provider ,
127+ region : region ,
128+ }
129+ } ;
130+ } ) ;
131+
132+ const results = { } ;
133+ stageConfigs . forEach ( ( config ) => {
134+ const result = StorageAccountResource . getResourceName ( config ) ;
135+ assertValidStorageAccountName ( config , result ) ;
136+ results [ result ] = config ;
137+ } ) ;
138+
139+ expect ( Object . keys ( results ) ) . toHaveLength ( stageConfigs . length ) ;
140+ } ) ;
141+
142+ function assertValidStorageAccountName ( config : ServerlessAzureConfig , value : string ) {
143+ expect ( value . length ) . toBeLessThanOrEqual ( 24 ) ;
144+ expect ( value . match ( / [ a - z 0 - 9 ] / g) . length ) . toEqual ( value . length ) ;
145+ expect ( value ) . toContain ( Utils . createShortAzureRegionName ( config . provider . region ) ) ;
146+ expect ( value ) . toContain ( createSafeString ( config . provider . prefix ) ) ;
147+ expect ( value ) . toContain ( createSafeString ( config . provider . stage ) ) ;
148+ expect ( value ) . toContain ( md5 ( config . service ) . substr ( 0 , 3 ) ) ;
149+ }
150+
151+ function createSafeString ( value : string ) {
152+ return value . replace ( / \W + / g, "" ) . toLocaleLowerCase ( ) . substr ( 0 , 3 ) ;
153+ } ;
154+ } ) ;
0 commit comments