This trip report is really more a cautionary tale of overconfidence and inexperience leading to a challenging Tararua overnight trip to Mid King Biv. Started: 11am from Holdsworth Carpark Finished: 6:30pm the next day at Holdsworth Carpark Travel Times: Day 1: 2 hours to Atiwhakatu Hut (break) 1 hour from Atiwhakatu Hut to the swingbridge over Atiwhakatu Stream 20 minutes...
Often, mailer specs will start with a simple assertion like expect(mail.body).to include "Some text in the expected email here". This works for a while, but quickly breaks down when an email grows more complex, such as having special characters causing it to be encoded as 7bit or QuotedPrintable, having attachments, or supporting different formats (like plaintext & HTML). I’ve always...
I recently created a Presenter object to wrap around an ActiveStorage::Blob that I wanted to decorate with some presentation methods for things like a human file size and content type. The initialisation signature for my presenter looks like this: class MyPresenter < SimpleDelegator def initialize(obj, view_context) super(obj) @view_context = view_context end def human_file_size @view_context.number_to_human_size(byte_size, precision: 1) end # more presentation...
Sometimes I’ll need to find an element in relation to another. An example of this is a link with a single icon element inside it: <a href="/example"><img src="icon.png" alt="Example Page" /></a> Because Capybara element finders can be chained (e.g. you can do find().find().find() to traverse down elements, the ability of XPath to traverse the DOM tree can be used to...
When an update method like @my_record.update(test_attr_1: "foo", test_attr_2: "bar") is called, my assumption was that those attributes immediately got passed to some ActiveRecord magic to update the record. Not true! Each attribute key calls the setter on the object - in this case, @my_record.test_attr_1=(new_value) and @my_record.test_attr_2=(new_value) would be called. This is neat because you can ‘redirect’ that attribute assignment to...
Today I was working on a method that had to take a string, and resolve it to a class. This method needed to perform some validation on the model class, to make sure it was a type we expected. My first iteration of this didn’t work - I expected that I could use Object#kind_of?, however this only works for testing...
There’s some preamble here. Jump to solution Recently, I’ve been working on a client project that needs to function offline. This means that I have a subset of tests where I need to change the connectivity status of the browser driving the tests to simulate being offline to make assertions that the application is behaving correctly. I already knew that...
A very handy API I’ve stumbled across today: page.driver.browser.manage.logs.get(:browser) This returns an array of Selenium::LogEntry instances which have the expected properties - level, timestamp, and message. You can use standard Enumerable methods to filter the log entries down to the information relevant to you. For example, all error messages: page.driver.browser.manage.logs.get(:browser).select { |le| le.level == "SEVERE" }.map(&:message) => ["http://127.0.0.1:40539/madeup - Failed...
I’ve been porting some previously server-rendered Rails templates to instead sit within a React application. This particular application uses Foundation Sites for base styles, and uses some of Foundation’s components which use Javascript to function - mostly basic stuff like data-dropdown, data-accordion, data-tabs. Foundation (still) uses jQuery for setting up these elements, and by default, initializes based on the ready...
This post is written stepping through the most recent stable branch of Rails on Github: 6-1-stable. It may not remain up to date. Reading time: about 20 minutes Skip table of contents How is the ‘db:migrate’ rake task defined? The Rails gem includes ‘activerecord’ as a gem dependency: The activerecord gem adds it’s own ‘lib/` directory to Ruby’s load path:...