public void ParseXML_shouldReturnCurrentWeatherObjectIfInputInvalid()
        {
            // Arrange
            string inputXML = "THIS IS SOME INVALID TEXT";

            // Act
            EnvCanadaCurrentWeatherParser parser = new EnvCanadaCurrentWeatherParser();

            // Assert
            Assert.Throws <System.Xml.XmlException>(() => parser.ParseXML(inputXML));
        }
 public async Task <CurrentWeather> Get(string locationcode)
 {
     if (validateLocationCode(locationcode))
     {
         return(EnvCanadaCurrentWeatherParser.ParseXML(await _httpClient.GetStringAsync($"https://weather.gc.ca/rss/city/{locationcode}_e.xml")));
     }
     else
     {
         return(new CurrentWeather());
     }
 }
        public void ParseXML_shouldReturnCurrentWeatherObjectIfXMLFormattedDifferently()
        {
            // Arrange
            string inputXML = "<root><child></child><child attribute=\"value\"/></root>";

            // Act
            EnvCanadaCurrentWeatherParser parser = new EnvCanadaCurrentWeatherParser();

            // Assert
            Assert.Throws <UnexpectedXMLFormatException>(() => parser.ParseXML(inputXML));
        }
        public void ParseXML_shouldReturnCurrentWeatherObjectIfOnlyBareRootElement()
        {
            // Arrange
            string inputXML = "<root></root>";

            // Act
            EnvCanadaCurrentWeatherParser parser = new EnvCanadaCurrentWeatherParser();

            // Assert
            Assert.Throws <UnexpectedXMLFormatException>(() => parser.ParseXML(inputXML));
        }
        public void ParseXML_shouldReturnCurrentWeatherObjectIfInputNull()
        {
            // Arrange
            string inputXML = null;

            // Act
            EnvCanadaCurrentWeatherParser parser = new EnvCanadaCurrentWeatherParser();

            // Assert
            Assert.Throws <UnexpectedXMLFormatException>(() => parser.ParseXML(inputXML));
        }
        public void ParseXML_shouldNotReturnCurrentWeatherObjectIfXMLDifferent(string filename)
        {
            // Arrange
            StreamReader reader   = new StreamReader("./TestXMLFiles/" + filename);
            string       inputXML = reader.ReadToEnd();

            // Act
            EnvCanadaCurrentWeatherParser parser = new EnvCanadaCurrentWeatherParser();

            // Assert
            Assert.Throws <UnexpectedXMLFormatException>(() => parser.ParseXML(inputXML));
        }
        public void ParseXML_shouldReturnCurrentWeatherObjectWithTestXMLFile(string filename)
        {
            // Arrange
            StreamReader reader   = new StreamReader("./TestXMLFiles/" + filename);
            string       inputXML = reader.ReadToEnd();

            // Act
            EnvCanadaCurrentWeatherParser parser = new EnvCanadaCurrentWeatherParser();
            var result = parser.ParseXML(inputXML);

            // Assert
            Assert.IsType <CurrentWeather>(result);
        }
        public void ParseXML_ShouldReturnAValidSourceURL(string filename)
        {
            // Arrange
            StreamReader reader   = new StreamReader("./TestXMLFiles/" + filename);
            string       inputXML = reader.ReadToEnd();

            // Act
            EnvCanadaCurrentWeatherParser parser = new EnvCanadaCurrentWeatherParser();
            CurrentWeather result = parser.ParseXML(inputXML);

            // Assert
            Assert.True(!string.IsNullOrEmpty(result.SourceURL));
        }
        public void ParseXML_ShouldReturnAValidLocationID(string filename)
        {
            // Arrange
            StreamReader reader   = new StreamReader("./TestXMLFiles/" + filename);
            string       inputXML = reader.ReadToEnd();

            // Act
            EnvCanadaCurrentWeatherParser parser = new EnvCanadaCurrentWeatherParser();
            CurrentWeather result = parser.ParseXML(inputXML);

            // Assert
            Assert.True(EnvCanadaLocationValidator.validateLocationCode(result.LocationId));
        }
        public void ParseXML_ParseXMLShouldParseFrenchFilesSuccessfully(string filename)
        {
            // Arrange
            StreamReader reader   = new StreamReader("./TestXMLFiles/" + filename);
            string       inputXML = reader.ReadToEnd();

            // Act
            EnvCanadaCurrentWeatherParser parser = new EnvCanadaCurrentWeatherParser();
            CurrentWeather result = parser.ParseXML(inputXML);

            // Assert
            Assert.NotNull(result);
        }
        public void ParseXML_ReturnedObjectShouldNotContainHTTPInLocationID(string filename)
        {
            // Arrange
            StreamReader reader   = new StreamReader("./TestXMLFiles/" + filename);
            string       inputXML = reader.ReadToEnd();

            // Act
            EnvCanadaCurrentWeatherParser parser = new EnvCanadaCurrentWeatherParser();
            CurrentWeather result = parser.ParseXML(inputXML);

            // Assert
            Assert.DoesNotContain("http://", result.LocationId);
        }
        public void ParseXML_ShouldReturnAValidLastUpdatedTime(string filename)
        {
            // Arrange
            StreamReader reader   = new StreamReader("./TestXMLFiles/" + filename);
            string       inputXML = reader.ReadToEnd();

            // Act
            EnvCanadaCurrentWeatherParser parser = new EnvCanadaCurrentWeatherParser();
            CurrentWeather result = parser.ParseXML(inputXML);

            // Assert
            Assert.True(result.LastUpdated != new DateTime());
            Assert.True(result.LastUpdated > DateTime.MinValue);
            Assert.True(result.LastUpdated < DateTime.MaxValue);
        }
        static void Main(string[] args)
        {
            List <string> validLocations         = new List <string>();
            string        timestamp              = DateTime.Now.Year + "-" + DateTime.Now.Month + "-" + DateTime.Now.Day + "-" + DateTime.Now.Hour + "-" + DateTime.Now.Minute + "-" + DateTime.Now.Second;
            List <string> _validLocationPrefixes = new List <string>()
            {
                "AB", "BC", "MB", "NB", "NL", "NT", "NS", "NU", "ON", "PE", "QC", "SK", "YT"
            };
            Random random = new Random(DateTime.Now.Millisecond);
            EnvCanadaCurrentWeatherParser parser = new EnvCanadaCurrentWeatherParser();

            List <CurrentWeather> results = new List <CurrentWeather>();

            using (HttpClient _httpClient = new HttpClient())
            {
                foreach (string provinceCode in _validLocationPrefixes)
                {
                    for (int x = 00; x <= 200; x++)
                    {
                        string locationCode = provinceCode.ToLower() + "-" + x.ToString();
                        string url          = "https://weather.gc.ca/rss/city/" + locationCode + "_e.xml";
                        Console.Write(url + ": ");
                        try
                        {
                            string         rawXML      = getXMLFeed(url, _httpClient).Result;
                            CurrentWeather thisWeather = parser.ParseXML(rawXML);
                            if (thisWeather != null)
                            {
                                try
                                {
                                    if (!Directory.Exists(timestamp))
                                    {
                                        Directory.CreateDirectory(timestamp);
                                    }

                                    StreamWriter rawXMLStreamWriter = new StreamWriter(timestamp + "/" + locationCode + ".xml");
                                    rawXMLStreamWriter.Write(rawXML);
                                    rawXMLStreamWriter.Flush();
                                }
                                catch (Exception ex) { Console.WriteLine("ERROR WRITING XML FILE: " + ex.Message); }

                                Console.WriteLine(" [SUCCESS]");
                                results.Add(thisWeather);
                                validLocations.Add(locationCode);
                            }
                        }
                        catch
                        {
                            Console.WriteLine(" [FAIL]");
                        }

                        // Wait so we don't overwhelm the server
                        System.Threading.Thread.Sleep(random.Next(100, 500));
                    }
                }
            }

            results.Add(new CurrentWeather()
            {
                LocationId = "TEST"
            });

            string filename = "output-" + timestamp + ".csv";

            Console.WriteLine("Successes: " + results.Count);
            Console.WriteLine("Writing file");

            StreamWriter csvStreamWriter = new StreamWriter(filename);

            csvStreamWriter.WriteLine("\"locationID\",\"locationName\",\"lastupdated\",\"tempC\",\"tempF\",\"tempK\",\"Conditions\",\"Pressure\",\"Humidity\",\"DewPointC\",\"DewPointF\",\"Wind\",\"AirQualityIndex\",\"ObservedAt\",\"SourceURL\",\"WindChillC\",\"WindChillF\"");

            foreach (CurrentWeather weather in results)
            {
                csvStreamWriter.WriteLine(toCSVLine(weather));
            }

            csvStreamWriter.Flush();

            StreamWriter validLocationStreamWriter = new StreamWriter("valid_location_codes-" + timestamp + ".txt");

            foreach (string loc in validLocations)
            {
                validLocationStreamWriter.WriteLine(loc);
            }
            validLocationStreamWriter.Flush();
        }