storageconfiguration_test.go 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756
  1. package azure
  2. import (
  3. "fmt"
  4. "testing"
  5. "github.com/opencost/opencost/core/pkg/log"
  6. "github.com/opencost/opencost/core/pkg/storage"
  7. "github.com/opencost/opencost/core/pkg/util/json"
  8. "github.com/opencost/opencost/pkg/cloud"
  9. )
  10. func TestStorageConfiguration_Validate(t *testing.T) {
  11. testCases := map[string]struct {
  12. config StorageConfiguration
  13. expected error
  14. }{
  15. "valid config Azure SharedKeyCredential": {
  16. config: StorageConfiguration{
  17. SubscriptionID: "subscriptionID",
  18. Account: "account",
  19. Container: "container",
  20. Path: "path",
  21. Cloud: "cloud",
  22. Authorizer: &SharedKeyCredential{
  23. AccessKey: "accessKey",
  24. Account: "account",
  25. },
  26. },
  27. expected: nil,
  28. },
  29. "access key invalid": {
  30. config: StorageConfiguration{
  31. SubscriptionID: "subscriptionID",
  32. Account: "account",
  33. Container: "container",
  34. Path: "path",
  35. Cloud: "cloud",
  36. Authorizer: &SharedKeyCredential{
  37. Account: "account",
  38. },
  39. },
  40. expected: fmt.Errorf("SharedKeyCredential: missing access key"),
  41. },
  42. "missing authorizer": {
  43. config: StorageConfiguration{
  44. SubscriptionID: "subscriptionID",
  45. Account: "account",
  46. Container: "container",
  47. Path: "path",
  48. Cloud: "cloud",
  49. Authorizer: nil,
  50. },
  51. expected: fmt.Errorf("StorageConfiguration: missing authorizer"),
  52. },
  53. "missing subscriptionID": {
  54. config: StorageConfiguration{
  55. SubscriptionID: "",
  56. Account: "account",
  57. Container: "container",
  58. Path: "path",
  59. Cloud: "cloud",
  60. Authorizer: &SharedKeyCredential{
  61. AccessKey: "accessKey",
  62. Account: "account",
  63. },
  64. },
  65. expected: fmt.Errorf("StorageConfiguration: missing Subcription ID"),
  66. },
  67. "missing account": {
  68. config: StorageConfiguration{
  69. SubscriptionID: "subscriptionID",
  70. Account: "",
  71. Container: "container",
  72. Path: "path",
  73. Cloud: "cloud",
  74. Authorizer: &SharedKeyCredential{
  75. AccessKey: "accessKey",
  76. Account: "account",
  77. },
  78. },
  79. expected: fmt.Errorf("StorageConfiguration: missing Account"),
  80. },
  81. "missing container": {
  82. config: StorageConfiguration{
  83. SubscriptionID: "subscriptionID",
  84. Account: "account",
  85. Container: "",
  86. Path: "path",
  87. Cloud: "cloud",
  88. Authorizer: &SharedKeyCredential{
  89. AccessKey: "accessKey",
  90. Account: "account",
  91. },
  92. },
  93. expected: fmt.Errorf("StorageConfiguration: missing Container"),
  94. },
  95. "missing path": {
  96. config: StorageConfiguration{
  97. SubscriptionID: "subscriptionID",
  98. Account: "account",
  99. Container: "container",
  100. Path: "",
  101. Cloud: "cloud",
  102. Authorizer: &SharedKeyCredential{
  103. AccessKey: "accessKey",
  104. Account: "account",
  105. },
  106. },
  107. expected: nil,
  108. },
  109. "missing cloud": {
  110. config: StorageConfiguration{
  111. SubscriptionID: "subscriptionID",
  112. Account: "account",
  113. Container: "container",
  114. Path: "path",
  115. Cloud: "",
  116. Authorizer: &SharedKeyCredential{
  117. AccessKey: "accessKey",
  118. Account: "account",
  119. },
  120. },
  121. expected: nil,
  122. },
  123. "valid config StorageConnectionStringCredential": {
  124. config: StorageConfiguration{
  125. SubscriptionID: "subscriptionID",
  126. Account: "account",
  127. Container: "container",
  128. Path: "path",
  129. Cloud: "cloud",
  130. Authorizer: &StorageConnectionStringCredential{
  131. StorageConnectionString: "storageConnectionString",
  132. },
  133. },
  134. expected: nil,
  135. },
  136. "missing storage connection string": {
  137. config: StorageConfiguration{
  138. SubscriptionID: "subscriptionID",
  139. Account: "account",
  140. Container: "container",
  141. Path: "path",
  142. Cloud: "cloud",
  143. Authorizer: &StorageConnectionStringCredential{},
  144. },
  145. expected: fmt.Errorf("StorageConnectionStringCredential: missing storage connection string"),
  146. },
  147. }
  148. for name, testCase := range testCases {
  149. t.Run(name, func(t *testing.T) {
  150. actual := testCase.config.Validate()
  151. actualString := "nil"
  152. if actual != nil {
  153. actualString = actual.Error()
  154. }
  155. expectedString := "nil"
  156. if testCase.expected != nil {
  157. expectedString = testCase.expected.Error()
  158. }
  159. if actualString != expectedString {
  160. t.Errorf("errors do not match: Actual: '%s', Expected: '%s", actualString, expectedString)
  161. }
  162. })
  163. }
  164. }
  165. func TestStorageConfiguration_Equals(t *testing.T) {
  166. testCases := map[string]struct {
  167. left StorageConfiguration
  168. right cloud.Config
  169. expected bool
  170. }{
  171. "matching config": {
  172. left: StorageConfiguration{
  173. SubscriptionID: "subscriptionID",
  174. Account: "account",
  175. Container: "container",
  176. Path: "path",
  177. Cloud: "cloud",
  178. Authorizer: &SharedKeyCredential{
  179. AccessKey: "accessKey",
  180. Account: "account",
  181. },
  182. },
  183. right: &StorageConfiguration{
  184. SubscriptionID: "subscriptionID",
  185. Account: "account",
  186. Container: "container",
  187. Path: "path",
  188. Cloud: "cloud",
  189. Authorizer: &SharedKeyCredential{
  190. AccessKey: "accessKey",
  191. Account: "account",
  192. },
  193. },
  194. expected: true,
  195. },
  196. "matching config AuthorizerHolder": {
  197. left: StorageConfiguration{
  198. SubscriptionID: "subscriptionID",
  199. Account: "account",
  200. Container: "container",
  201. Path: "path",
  202. Cloud: "cloud",
  203. Authorizer: &AuthorizerHolder{
  204. Authorizer: &DefaultAzureCredentialHolder{},
  205. },
  206. },
  207. right: &StorageConfiguration{
  208. SubscriptionID: "subscriptionID",
  209. Account: "account",
  210. Container: "container",
  211. Path: "path",
  212. Cloud: "cloud",
  213. Authorizer: &AuthorizerHolder{
  214. Authorizer: &DefaultAzureCredentialHolder{},
  215. },
  216. },
  217. expected: true,
  218. },
  219. "missing both authorizer": {
  220. left: StorageConfiguration{
  221. SubscriptionID: "subscriptionID",
  222. Account: "account",
  223. Container: "container",
  224. Path: "path",
  225. Cloud: "cloud",
  226. Authorizer: nil,
  227. },
  228. right: &StorageConfiguration{
  229. SubscriptionID: "subscriptionID",
  230. Account: "account",
  231. Container: "container",
  232. Path: "path",
  233. Cloud: "cloud",
  234. Authorizer: nil,
  235. },
  236. expected: true,
  237. },
  238. "missing left authorizer": {
  239. left: StorageConfiguration{
  240. SubscriptionID: "subscriptionID",
  241. Account: "account",
  242. Container: "container",
  243. Path: "path",
  244. Cloud: "cloud",
  245. Authorizer: nil,
  246. },
  247. right: &StorageConfiguration{
  248. SubscriptionID: "subscriptionID",
  249. Account: "account",
  250. Container: "container",
  251. Path: "path",
  252. Cloud: "cloud",
  253. Authorizer: &SharedKeyCredential{
  254. AccessKey: "accessKey",
  255. Account: "account",
  256. },
  257. },
  258. expected: false,
  259. },
  260. "missing right authorizer": {
  261. left: StorageConfiguration{
  262. SubscriptionID: "subscriptionID",
  263. Account: "account",
  264. Container: "container",
  265. Path: "path",
  266. Cloud: "cloud",
  267. Authorizer: &SharedKeyCredential{
  268. AccessKey: "accessKey",
  269. Account: "account",
  270. },
  271. },
  272. right: &StorageConfiguration{
  273. SubscriptionID: "subscriptionID",
  274. Account: "account",
  275. Container: "container",
  276. Path: "path",
  277. Cloud: "cloud",
  278. Authorizer: nil,
  279. },
  280. expected: false,
  281. },
  282. "differing storage authorizer": {
  283. left: StorageConfiguration{
  284. SubscriptionID: "subscriptionID",
  285. Account: "account",
  286. Container: "container",
  287. Path: "path",
  288. Cloud: "cloud",
  289. Authorizer: &SharedKeyCredential{
  290. AccessKey: "accessKey",
  291. Account: "account",
  292. },
  293. },
  294. right: &StorageConfiguration{
  295. SubscriptionID: "subscriptionID",
  296. Account: "account",
  297. Container: "container",
  298. Path: "path",
  299. Cloud: "cloud",
  300. Authorizer: &AuthorizerHolder{
  301. Authorizer: &DefaultAzureCredentialHolder{},
  302. },
  303. },
  304. expected: false,
  305. },
  306. "different subscriptionID": {
  307. left: StorageConfiguration{
  308. SubscriptionID: "subscriptionID",
  309. Account: "account",
  310. Container: "container",
  311. Path: "path",
  312. Cloud: "cloud",
  313. Authorizer: &SharedKeyCredential{
  314. AccessKey: "accessKey",
  315. Account: "account",
  316. },
  317. },
  318. right: &StorageConfiguration{
  319. SubscriptionID: "subscriptionID2",
  320. Account: "account",
  321. Container: "container",
  322. Path: "path",
  323. Cloud: "cloud",
  324. Authorizer: &SharedKeyCredential{
  325. AccessKey: "accessKey",
  326. Account: "account",
  327. },
  328. },
  329. expected: false,
  330. },
  331. "different account": {
  332. left: StorageConfiguration{
  333. SubscriptionID: "subscriptionID",
  334. Account: "account",
  335. Container: "container",
  336. Path: "path",
  337. Cloud: "cloud",
  338. Authorizer: &SharedKeyCredential{
  339. AccessKey: "accessKey",
  340. Account: "account",
  341. },
  342. },
  343. right: &StorageConfiguration{
  344. SubscriptionID: "subscriptionID",
  345. Account: "account2",
  346. Container: "container",
  347. Path: "path",
  348. Cloud: "cloud",
  349. Authorizer: &SharedKeyCredential{
  350. AccessKey: "accessKey",
  351. Account: "account",
  352. },
  353. },
  354. expected: false,
  355. },
  356. "different container": {
  357. left: StorageConfiguration{
  358. SubscriptionID: "subscriptionID",
  359. Account: "account",
  360. Container: "container",
  361. Path: "path",
  362. Cloud: "cloud",
  363. Authorizer: &SharedKeyCredential{
  364. AccessKey: "accessKey",
  365. Account: "account",
  366. },
  367. },
  368. right: &StorageConfiguration{
  369. SubscriptionID: "subscriptionID",
  370. Account: "account",
  371. Container: "container2",
  372. Path: "path",
  373. Cloud: "cloud",
  374. Authorizer: &SharedKeyCredential{
  375. AccessKey: "accessKey",
  376. Account: "account",
  377. },
  378. },
  379. expected: false,
  380. },
  381. "different path": {
  382. left: StorageConfiguration{
  383. SubscriptionID: "subscriptionID",
  384. Account: "account",
  385. Container: "container",
  386. Path: "path",
  387. Cloud: "cloud",
  388. Authorizer: &SharedKeyCredential{
  389. AccessKey: "accessKey",
  390. Account: "account",
  391. },
  392. },
  393. right: &StorageConfiguration{
  394. SubscriptionID: "subscriptionID",
  395. Account: "account",
  396. Container: "container",
  397. Path: "path2",
  398. Cloud: "cloud",
  399. Authorizer: &SharedKeyCredential{
  400. AccessKey: "accessKey",
  401. Account: "account",
  402. },
  403. },
  404. expected: false,
  405. },
  406. "different cloud": {
  407. left: StorageConfiguration{
  408. SubscriptionID: "subscriptionID",
  409. Account: "account",
  410. Container: "container",
  411. Path: "path",
  412. Cloud: "cloud",
  413. Authorizer: &SharedKeyCredential{
  414. AccessKey: "accessKey",
  415. Account: "account",
  416. },
  417. },
  418. right: &StorageConfiguration{
  419. SubscriptionID: "subscriptionID",
  420. Account: "account",
  421. Container: "container",
  422. Path: "path",
  423. Cloud: "cloud2",
  424. Authorizer: &SharedKeyCredential{
  425. AccessKey: "accessKey",
  426. Account: "account",
  427. },
  428. },
  429. expected: false,
  430. },
  431. "different config": {
  432. left: StorageConfiguration{
  433. SubscriptionID: "subscriptionID",
  434. Account: "account",
  435. Container: "container",
  436. Path: "path",
  437. Cloud: "cloud",
  438. Authorizer: &SharedKeyCredential{
  439. AccessKey: "accessKey",
  440. Account: "account",
  441. },
  442. },
  443. right: &SharedKeyCredential{
  444. AccessKey: "accessKey",
  445. Account: "account",
  446. },
  447. expected: false,
  448. },
  449. "matching config StorageConnectionStringCredential": {
  450. left: StorageConfiguration{
  451. SubscriptionID: "subscriptionID",
  452. Account: "account",
  453. Container: "container",
  454. Path: "path",
  455. Cloud: "cloud",
  456. Authorizer: &StorageConnectionStringCredential{
  457. StorageConnectionString: "storageConnectionString",
  458. },
  459. },
  460. right: &StorageConfiguration{
  461. SubscriptionID: "subscriptionID",
  462. Account: "account",
  463. Container: "container",
  464. Path: "path",
  465. Cloud: "cloud",
  466. Authorizer: &StorageConnectionStringCredential{
  467. StorageConnectionString: "storageConnectionString",
  468. },
  469. },
  470. expected: true,
  471. },
  472. "different StorageConnectionString in StorageConnectionStringCredential": {
  473. left: StorageConfiguration{
  474. SubscriptionID: "subscriptionID",
  475. Account: "account",
  476. Container: "container",
  477. Path: "path",
  478. Cloud: "cloud",
  479. Authorizer: &StorageConnectionStringCredential{
  480. StorageConnectionString: "storageConnectionString1",
  481. },
  482. },
  483. right: &StorageConfiguration{
  484. SubscriptionID: "subscriptionID",
  485. Account: "account",
  486. Container: "container",
  487. Path: "path",
  488. Cloud: "cloud",
  489. Authorizer: &StorageConnectionStringCredential{
  490. StorageConnectionString: "storageConnectionString2",
  491. },
  492. },
  493. expected: false,
  494. },
  495. "different HTTPConfig in StorageConnectionStringCredential": {
  496. left: StorageConfiguration{
  497. SubscriptionID: "subscriptionID",
  498. Account: "account",
  499. Container: "container",
  500. Path: "path",
  501. Cloud: "cloud",
  502. Authorizer: &StorageConnectionStringCredential{
  503. StorageConnectionString: "storageConnectionString",
  504. HTTPConfig: defaultHTTPConfig,
  505. },
  506. },
  507. right: &StorageConfiguration{
  508. SubscriptionID: "subscriptionID",
  509. Account: "account",
  510. Container: "container",
  511. Path: "path",
  512. Cloud: "cloud",
  513. Authorizer: &StorageConnectionStringCredential{
  514. StorageConnectionString: "storageConnectionString",
  515. HTTPConfig: storage.HTTPConfig{
  516. InsecureSkipVerify: true,
  517. },
  518. },
  519. },
  520. expected: false,
  521. },
  522. }
  523. for name, testCase := range testCases {
  524. t.Run(name, func(t *testing.T) {
  525. actual := testCase.left.Equals(testCase.right)
  526. if actual != testCase.expected {
  527. t.Errorf("incorrect result: Actual: '%t', Expected: '%t", actual, testCase.expected)
  528. }
  529. })
  530. }
  531. }
  532. func TestStorageConfiguration_JSON(t *testing.T) {
  533. testCases := map[string]struct {
  534. input map[string]interface{}
  535. afterUnmarshal StorageConfiguration
  536. }{
  537. "Nil Authorizer": {
  538. input: map[string]interface{}{
  539. "subscriptionID": "subscriptionID",
  540. "account": "account",
  541. "container": "container",
  542. "path": "path",
  543. "cloud": "cloud",
  544. "authorizer": nil,
  545. },
  546. afterUnmarshal: StorageConfiguration{
  547. SubscriptionID: "subscriptionID",
  548. Account: "account",
  549. Container: "container",
  550. Path: "path",
  551. Cloud: "cloud",
  552. Authorizer: nil,
  553. },
  554. },
  555. "SharedKeyCredential Authorizer": {
  556. input: map[string]interface{}{
  557. "subscriptionID": "subscriptionID",
  558. "account": "account",
  559. "container": "container",
  560. "path": "path",
  561. "cloud": "cloud",
  562. "authorizer": map[string]interface{}{
  563. "authorizerType": "AzureAccessKey",
  564. "accessKey": "accessKey",
  565. "account": "account",
  566. },
  567. },
  568. afterUnmarshal: StorageConfiguration{
  569. SubscriptionID: "subscriptionID",
  570. Account: "account",
  571. Container: "container",
  572. Path: "path",
  573. Cloud: "cloud",
  574. Authorizer: &SharedKeyCredential{
  575. AccessKey: "accessKey",
  576. Account: "account",
  577. },
  578. },
  579. },
  580. "Default AuthorizerHolder Authorizer": {
  581. input: map[string]interface{}{
  582. "subscriptionID": "subscriptionID",
  583. "account": "account",
  584. "container": "container",
  585. "path": "path",
  586. "cloud": "cloud",
  587. "authorizer": map[string]interface{}{
  588. "authorizerType": "AzureDefaultCredential",
  589. },
  590. },
  591. afterUnmarshal: StorageConfiguration{
  592. SubscriptionID: "subscriptionID",
  593. Account: "account",
  594. Container: "container",
  595. Path: "path",
  596. Cloud: "cloud",
  597. Authorizer: &AuthorizerHolder{
  598. Authorizer: &DefaultAzureCredentialHolder{},
  599. },
  600. },
  601. },
  602. "ClientSecretCredential Authorizer": {
  603. input: map[string]interface{}{
  604. "subscriptionID": "subscriptionID",
  605. "account": "account",
  606. "container": "container",
  607. "path": "path",
  608. "cloud": "cloud",
  609. "authorizer": map[string]interface{}{
  610. "authorizerType": "AzureClientSecretCredential",
  611. "tenantID": "tenantID",
  612. "clientID": "clientID",
  613. "clientSecret": "clientSecret",
  614. },
  615. },
  616. afterUnmarshal: StorageConfiguration{
  617. SubscriptionID: "subscriptionID",
  618. Account: "account",
  619. Container: "container",
  620. Path: "path",
  621. Cloud: "cloud",
  622. Authorizer: &AuthorizerHolder{
  623. Authorizer: &ClientSecretCredential{
  624. TenantID: "tenantID",
  625. ClientID: "clientID",
  626. ClientSecret: "clientSecret",
  627. },
  628. },
  629. },
  630. },
  631. "StorageConnectionStringCredential Authorizer": {
  632. input: map[string]interface{}{
  633. "subscriptionID": "subscriptionID",
  634. "account": "account",
  635. "container": "container",
  636. "path": "path",
  637. "cloud": "cloud",
  638. "authorizer": map[string]interface{}{
  639. "authorizerType": "AzureStorageConnectionString",
  640. "storageConnectionString": "storageConnectionString",
  641. "httpConfig": map[string]interface{}{
  642. "insecureSkipVerify": true,
  643. },
  644. },
  645. },
  646. afterUnmarshal: StorageConfiguration{
  647. SubscriptionID: "subscriptionID",
  648. Account: "account",
  649. Container: "container",
  650. Path: "path",
  651. Cloud: "cloud",
  652. Authorizer: &StorageConnectionStringCredential{
  653. StorageConnectionString: "storageConnectionString",
  654. HTTPConfig: func() storage.HTTPConfig {
  655. cfg := defaultHTTPConfig
  656. cfg.InsecureSkipVerify = true
  657. return cfg
  658. }(),
  659. },
  660. },
  661. },
  662. }
  663. for name, testCase := range testCases {
  664. t.Run(name, func(t *testing.T) {
  665. // test JSON Marshalling
  666. configJSON, err := json.Marshal(testCase.input)
  667. if err != nil {
  668. t.Errorf("failed to marshal configuration: %s", err.Error())
  669. }
  670. log.Info(string(configJSON))
  671. unmarshalledConfig := &StorageConfiguration{}
  672. err = json.Unmarshal(configJSON, unmarshalledConfig)
  673. if err != nil {
  674. t.Errorf("failed to unmarshal configuration: %s", err.Error())
  675. }
  676. if !testCase.afterUnmarshal.Equals(unmarshalledConfig) {
  677. t.Error("config does not equal unmarshalled config")
  678. }
  679. })
  680. }
  681. }
  682. func TestStorageConfiguration_Sanitize(t *testing.T) {
  683. testCases := map[string]struct {
  684. config StorageConfiguration
  685. expected StorageConfiguration
  686. }{
  687. "Sanitize StorageConnectionStringCredential": {
  688. config: StorageConfiguration{
  689. SubscriptionID: "subscriptionID",
  690. Account: "account",
  691. Container: "container",
  692. Path: "path",
  693. Cloud: "cloud",
  694. Authorizer: &StorageConnectionStringCredential{
  695. StorageConnectionString: "storageConnectionString",
  696. HTTPConfig: defaultHTTPConfig,
  697. },
  698. },
  699. expected: StorageConfiguration{
  700. SubscriptionID: "subscriptionID",
  701. Account: "account",
  702. Container: "container",
  703. Path: "path",
  704. Cloud: "cloud",
  705. Authorizer: &StorageConnectionStringCredential{
  706. StorageConnectionString: cloud.Redacted,
  707. HTTPConfig: defaultHTTPConfig,
  708. },
  709. },
  710. },
  711. "Sanitize SharedKeyCredential": {
  712. config: StorageConfiguration{
  713. SubscriptionID: "subscriptionID",
  714. Account: "account",
  715. Container: "container",
  716. Path: "path",
  717. Cloud: "cloud",
  718. Authorizer: &SharedKeyCredential{
  719. AccessKey: "accessKey",
  720. Account: "account",
  721. },
  722. },
  723. expected: StorageConfiguration{
  724. SubscriptionID: "subscriptionID",
  725. Account: "account",
  726. Container: "container",
  727. Path: "path",
  728. Cloud: "cloud",
  729. Authorizer: &SharedKeyCredential{
  730. AccessKey: cloud.Redacted,
  731. Account: "account",
  732. },
  733. },
  734. },
  735. }
  736. for name, testCase := range testCases {
  737. t.Run(name, func(t *testing.T) {
  738. actual := testCase.config.Sanitize()
  739. if !testCase.expected.Equals(actual) {
  740. t.Errorf("incorrect result: got %#v, want %#v", actual, testCase.expected)
  741. }
  742. })
  743. }
  744. }