140 lines
		
	
	
		
			5.4 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
		
		
			
		
	
	
			140 lines
		
	
	
		
			5.4 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
|  | import { browser, element, by, ElementFinder } from 'protractor'; | ||
|  | import { resolve } from 'path'; | ||
|  | 
 | ||
|  | const page = { | ||
|  |   configClearButton: element.all(by.css('app-config > div button')).get(2), | ||
|  |   configErrorButton: element.all(by.css('app-config > div button')).get(3), | ||
|  |   configErrorMessage: element(by.css('app-config p')), | ||
|  |   configGetButton: element.all(by.css('app-config > div button')).get(0), | ||
|  |   configGetResponseButton: element.all(by.css('app-config > div button')).get(1), | ||
|  |   configSpan: element(by.css('app-config span')), | ||
|  |   downloadButton: element.all(by.css('app-downloader button')).get(0), | ||
|  |   downloadClearButton: element.all(by.css('app-downloader button')).get(1), | ||
|  |   downloadMessage: element(by.css('app-downloader p')), | ||
|  |   heroesListAddButton: element.all(by.css('app-heroes > div button')).get(0), | ||
|  |   heroesListInput: element(by.css('app-heroes > div input')), | ||
|  |   heroesListSearchButton: element.all(by.css('app-heroes > div button')).get(1), | ||
|  |   heroesListItems: element.all(by.css('app-heroes ul li')), | ||
|  |   logClearButton: element(by.css('app-messages button')), | ||
|  |   logList: element(by.css('app-messages ol')), | ||
|  |   logListItems: element.all(by.css('app-messages ol li')), | ||
|  |   searchInput: element(by.css('app-package-search input#name')), | ||
|  |   searchListItems: element.all(by.css('app-package-search li')), | ||
|  |   uploadInput: element(by.css('app-uploader input')), | ||
|  |   uploadMessage: element(by.css('app-uploader p')) | ||
|  | }; | ||
|  | 
 | ||
|  | let checkLogForMessage = (message: string) => { | ||
|  |   expect(page.logList.getText()).toContain(message); | ||
|  | }; | ||
|  | 
 | ||
|  | describe('Http Tests', function() { | ||
|  |   beforeEach(() => { | ||
|  |     browser.get(''); | ||
|  |   }); | ||
|  | 
 | ||
|  |   describe('Heroes', () => { | ||
|  |     it('retrieves the list of heroes at startup', () => { | ||
|  |       expect(page.heroesListItems.count()).toBe(4); | ||
|  |       expect(page.heroesListItems.get(0).getText()).toContain('Mr. Nice'); | ||
|  |       checkLogForMessage('GET "api/heroes"'); | ||
|  |     }); | ||
|  | 
 | ||
|  |     it('makes a POST to add a new hero', () => { | ||
|  |       page.heroesListInput.sendKeys('Magneta'); | ||
|  |       page.heroesListAddButton.click(); | ||
|  |       expect(page.heroesListItems.count()).toBe(5); | ||
|  |       checkLogForMessage('POST "api/heroes"'); | ||
|  |     }); | ||
|  | 
 | ||
|  |     it('makes a GET to search for a hero', () => { | ||
|  |       page.heroesListInput.sendKeys('Celeritas'); | ||
|  |       page.heroesListSearchButton.click(); | ||
|  |       checkLogForMessage('GET "api/heroes?name=Celeritas"'); | ||
|  |     }); | ||
|  |   }); | ||
|  | 
 | ||
|  |   describe('Messages', () => { | ||
|  |     it('can clear the logs', () => { | ||
|  |       expect(page.logListItems.count()).toBe(1); | ||
|  |       page.logClearButton.click(); | ||
|  |       expect(page.logListItems.count()).toBe(0); | ||
|  |     }); | ||
|  |   }); | ||
|  | 
 | ||
|  |   describe('Configuration', () => { | ||
|  |     it('can fetch the configuration JSON file', () => { | ||
|  |       page.configGetButton.click(); | ||
|  |       checkLogForMessage('GET "assets/config.json"'); | ||
|  |       expect(page.configSpan.getText()).toContain('Heroes API URL is "api/heroes"'); | ||
|  |       expect(page.configSpan.getText()).toContain('Textfile URL is "assets/textfile.txt"'); | ||
|  |     }); | ||
|  | 
 | ||
|  |     it('can fetch the configuration JSON file with headers', () => { | ||
|  |       page.configGetResponseButton.click(); | ||
|  |       checkLogForMessage('GET "assets/config.json"'); | ||
|  |       expect(page.configSpan.getText()).toContain('Response headers:'); | ||
|  |       expect(page.configSpan.getText()).toContain('content-type: application/json; charset=UTF-8'); | ||
|  |     }); | ||
|  | 
 | ||
|  |     it('can clear the configuration log', () => { | ||
|  |       page.configGetResponseButton.click(); | ||
|  |       expect(page.configSpan.getText()).toContain('Response headers:'); | ||
|  |       page.configClearButton.click(); | ||
|  |       expect(page.configSpan.isPresent()).toBeFalsy(); | ||
|  |     }); | ||
|  | 
 | ||
|  |     it('throws an error for a non valid url', () => { | ||
|  |       page.configErrorButton.click(); | ||
|  |       checkLogForMessage('GET "not/a/real/url"'); | ||
|  |       expect(page.configErrorMessage.getText()).toContain('"Something bad happened; please try again later."'); | ||
|  |     }); | ||
|  |   }); | ||
|  | 
 | ||
|  |   describe('Download', () => { | ||
|  |     it('can download a txt file and show it', () => { | ||
|  |       page.downloadButton.click(); | ||
|  |       checkLogForMessage('DownloaderService downloaded "assets/textfile.txt"'); | ||
|  |       checkLogForMessage('GET "assets/textfile.txt"'); | ||
|  |       expect(page.downloadMessage.getText()).toContain('Contents: "This is the downloaded text file "'); | ||
|  |     }); | ||
|  | 
 | ||
|  |     it('can clear the log of the download', () => { | ||
|  |       page.downloadButton.click(); | ||
|  |       expect(page.downloadMessage.getText()).toContain('Contents: "This is the downloaded text file "'); | ||
|  |       page.downloadClearButton.click(); | ||
|  |       expect(page.downloadMessage.isPresent()).toBeFalsy(); | ||
|  |     }); | ||
|  |   }); | ||
|  | 
 | ||
|  |   describe('Upload', () => { | ||
|  |     it('can upload a file', () => { | ||
|  |       const filename = 'app.po.ts'; | ||
|  |       const url = resolve(__dirname, filename); | ||
|  |       page.uploadInput.sendKeys(url); | ||
|  |       checkLogForMessage('POST "/upload/file" succeeded in'); | ||
|  |       expect(page.uploadMessage.getText()).toContain( | ||
|  |         `File "${filename}" was completely uploaded!`); | ||
|  |     }); | ||
|  |   }); | ||
|  | 
 | ||
|  |   describe('PackageSearch', () => { | ||
|  |     it('can search for npm package and find in cache', () => { | ||
|  |       const packageName = 'angular'; | ||
|  |       page.searchInput.sendKeys(packageName); | ||
|  |       checkLogForMessage( | ||
|  |         'Caching response from "https://npmsearch.com/query?q=angular"'); | ||
|  |       expect(page.searchListItems.count()).toBeGreaterThan(1, 'angular items'); | ||
|  | 
 | ||
|  |       page.searchInput.clear(); | ||
|  |       page.searchInput.sendKeys(' '); | ||
|  |       expect(page.searchListItems.count()).toBe(0, 'search empty'); | ||
|  | 
 | ||
|  |       page.searchInput.clear(); | ||
|  |       page.searchInput.sendKeys(packageName); | ||
|  |       checkLogForMessage( | ||
|  |         'Found cached response for "https://npmsearch.com/query?q=angular"'); | ||
|  |     }); | ||
|  |   }); | ||
|  | }); |