Alright everybody here we go six box f1 mixer tops chrome f1 hobby and lights number 25 Random teams you can find those anytime late sports cards.com. Let's go ahead and get to it Hockey's sold out. This is the only f1 brace tonight. It's clearly sold out Baseball just has bowman draft jumbo Basketball has some spots and football just has seven teams left on immaculate y'all We went from a lot of spots left about a half an hour ago to a Nearing full especially on non-basketball grace again Don Russ teams are on sale for basketball Then we had that mixer as well draft and Don Russ So three light three hobby here Do all the light first in the hobby my thumb feels better. That's good for now Feels good for now Richard for sure refractor Trident good chewing gum brand mini diamond Sebastian Vettel Aston Martin 250 of 299 Hey an art to Grand Prix United States We'll random that at the end to everybody. Good luck on the short print insert there I don't really say that for Other places, right? Are there other like like Italy only has one got max for stopping black and white right with yeah So the Italy one just says just says oh it does say Monza doesn't it Yuki Sonoda refractor That's the only one that says country At least on the front you already say this alpha tar in ART. No, I said it alpha tarry ART So some you Pierre refractor Alexander Albon for Williams that short print. I think so and green a railway of Lando Norris McLaren 76 and 99 Black and white wave Perez for Red Bull triple release day wins everybody that gold label baseball It's hops chrome McDonald's all-american basketball checker flag extractor makes Schumacher and Origins basketball as well on Wednesday Black and white ray wave Max for stopping Red Bull, you know the big chases in McDonald's all-american That'd be cool if they had some hamburger cards in there makes Schumacher pink ray wave this time Number 66 is 75 for Hoss Good downs. I had heck yeah, dude The next Monday USA L Salvador, I think at the Exploria Stadium refractor Lewis Hamilton Grand Prix winner Brazil. What do you say we switch? I don't even know probably next week, but Sam can break Monday. I'll do Tuesday And go to the game black and white ray of Max for stopping Red Bull Calling for now on J. Mo Lane. This is forever name Refractor Marie-Cord zeal van Emerson Fort It's too bad. There's already an athlete with a nickname J Jameson Wasn't that James Winston's nickname for no job Come on come on Fractor for Nino Alonso refractor Alpine Purple checkered flag that's all for Aston Martin to 199 red green Mike crack Aston Martin black and white ray of Vesta Bonocon for BWT Alpine Yuki Sonoda refractor Alcatarian and Friday release day is prison premiere lead and then next week next week's flawless basketball Oh, that's that's rude. You don't even know the guy Travis Travis is telling me to go live earlier when I was like four o'clock and I walked in the message telling me to go live Go live early. Oh, yeah, he's your dad Travis That Mike Mike crack is is your is your father Refractor Nick with Latifi Williams purple Max Verstappen card number one two thirty nine of three ninety nine Nice card Red Bull The amount of times I say Red Bull in the stream. We should get a sponsor Re-case every week black and right way ray of Vesta Bonocon for Alpine They sponsor a lot of things soccer clubs everywhere Basketball teams now, too, I think Plains and cars and There's something in Europe. They'll just sponsor it. I think they give it in Europe refractor Valtteri Baltas from Mercedes It's a Mercedes Valtteri Baltas Refractor George Russell Mercedes. I didn't see it yet Travis. Which which card was it? Black and white ray ray wave of Carlos Sainz for Ferrari Trying to think of what it would have been Yeah, if top 10 Ian does nice a formula one of freshest Ricky pink ray wave Joe Guan you 61 a 70 I am I was gonna say That whole case is together that that would have been like top three That's awesome. Check it flag.  I say hey to him Alphatari Black and white ray wave Charles DeClaire for Ferrari Yeah, for a for I don't I thought look there was something different Yeah, it was it was like all yeah, I imagine I was all present football to be honest. I mean Little boring of a top ten if it's like all the same thing, right? I like it when there's like Three different sports or four or five different sports and just different products. That's what it's the most fun You learn a lot more about you learn a lot more about sports cards in the top ten that that he puts out is like a Different things like Claire refractor for Ferrari many diamond Lewis Hamilton from Mercedes Number two two ninety nine. Yeah, this is the last light box last light box Gold purple Lewis Hamilton. There we go Black and white ray wave up Fernando Alonzo for Alpine Let's see fee refractor Williams You didn't see I haven't pulled a super out of this Black and white ray wave Charles DeClaire for Ferrari Maybe it is I think where I'm gonna watch the USA game tomorrow. Maybe my house It's good choice It's the best place refractor Pierre Gasly Alphatari with a purple ought more soft now or 292 299 Alpine 11k. Yeah, that's tough to it's tough to comp like dynasty cards like that But yeah, it's probably it was probably around that Okon black and white way way for Alpine. That was what a double patch auto I don't know I would think so it's usually a bigger patch That's what I would think it's right in the same area Courts yield future charge refractor Van Emmer sport Which guys like for draft here in a second refractor make Schumacher Haas Literally looks like Quick Nick Quick Nick Sergio Perez checkered flag Red Bull Sergeant started Breaking cars black and white ray wave for sure Trident Apparently it's not easy to reason to have one level. No, it's not a Yeah, just walk in and be good at it Pink refractor Lance stroll 17 to 75 Last like get to focus here for Aston Martin The last like 10 laps of the race Max was complaining that something's wrong with his car And he was still like 15 seconds faster than the car behind It's like something's wrong guys and like the guy behind not catching all the like I just keep going All right. We'll figure it out later That's not max on the race on Sunday He was less like rigged at this for the last like 10 laps He's like my car is broke. I was wrong with the engine and he's still 15 seconds faster in the car behind I'm like not losing it. It's just rigged at this point. Yeah, they're they got a rocket ship for sure Well, I have a great you guys. Have you start 15th on the grid and finish second? Yeah 15 seconds ahead of 30 bowman drafted seven everybody Luckily that one's going in baseball Thank God, it's nice. That's a nice card though Well, Lane you miss it in the baseball mixture Friday night 2018 tribute I pulled a dual jersey of Mookie and Zandra the Red Sox house like I was like, oh like oh geez no more 2018 products on this channel Because it was Hobby boxes now everybody. Let's see some nice autos. You can get that that mag Greener fracter for Alfa Romeo's all sorry both us nice 97 and 99 As we're talking about this guy, I mean, he's one of the best drivers of all time It's not like he's like Never succeeded before so that's what Kyle was talking about a sergeant just crashing cars instead of breaking cars refractor Lewis Hamilton All the young young drivers refractor Sebastian Vettel that one looks like a short print It's just shiny cards today The camera is not blue anymore though. I guess because my hands are so white Purple and green mixed Schumacher Haas Yeah, those are fun Travis like the only benefit a fair skin that fixes the camera That's it We'll get some we'll get some NT racing for sure refractor Lewis Hamilton Grand Prix winner Purple refractor Lewis Hamilton Mercedes Good box so far for the parallels 41 to 399 Top-10 that's tough to do that's that's really tough refractor Max for stopping and a goal to check a flag JQ's future stars Spin embers for it to 50. Yeah, I don't know how long it's been coming out But at least the past couple years pure ghastly refractor Alfa sorry and as far as like an NT box goes This is awesome value race use like tire relics and suit stuff like that Awesome stuff. Oh Checkered flag Fernando Alonzo Alpine sheet metal relics. That's kind of cool the car relics refractor Sebastian Vettel Aston Martin another hobby So after bowman draft the brakes available will be Don Russ PYT's for basketball And those teams are on sale Five to go on bowman draft now and there's only six to go on the Immaculate football picker team case later That's the only football break left for tonight. There's more football tomorrow There's more baseball tomorrow with Matt's if you're not looking for bowman draft Perhaps purple checkered flag Vettel Aston Martin to 299 or sorry to 199 What's up? Daravalla future stars checkered flag gold Prima to 50 refractor bow showing future stars compost We may end up doing breaks of that I don't it's usually just like personals for us land-over factor for a McLaren It would be like random hit like Something like that Checkered flag marino sato future stars virtuosi That would take forever Let's take forever to fill up We'll list that and break it two weeks later future stars refractor marcus armstrong high tech Refractor kevin magnuson haas and a purple lewis hamilton award winners Mercedes to 299 Sorry 399. I don't even know. I know the parallels guys I Diamond at 299 purple to 399 purple checkered at 299 Yeah, purple 399 mini diamond 299 And I think it was because mini diamond was not here last year Purple green valetary botas For alpha romeo, that's like all the that's like all the baseball sapphires that come out It's just like the yellow is like, oh, it's 25 here to 75 here to 50 here There's like green to 55 one here or something like that. Let's hurry botas alpha romeo refractor Stop hunting. What's up trash? Hello.  I like to have to check the back now. They were to go see everything every roll at once I don't know why we never saw that but is that like Rookie refractor joke on you. I think it'll be in some just because it won best picture That's a true red right here. It's a true red. Come on Lando Norris grand prix driver of the day austria great card mclaran Beauty five out of five as well card 181 There you go, brian. We're gonna get this one magged for you. Nice red lando Lando Norris Lando Norris I think his name is orlando Gerriff Rector Lewis Hamilton Mercedes Orlando Norris. Yeah, hunting. It's pretty similar a little uh Safe for I would say we just do brakes on there, but it's you could do sales and the kind of stuff like that. It's very similar Yeah, so right now. Yeah, like I said for sports we do just personal spray now, but our gaming channel we do Personals and we also do like auctions every now and then like single card auctions that's pretty cool, but Drip drip's nice because it'll it'll vet the the sellers pretty well Like we had to go through like an application process and like it took it took like a week To get us like breaking on there Hey, uh, let's see if he checkered flag williams refractor Lewis Hamilton Grand Prix winner Saudi Arabia Yeah, brian. Yeah, yeah true red for sure refractor christian horner Red Bull Yeah, they have an app and you can also go to drip shop dot live. I think our think our Oh, yeah, the link's there. You can download the app. That's pretty cool, too. Um It's like it's very user friendly think all around. That's nice That's what we've been doing personals on sunday and monday nights recently and eventually we're probably going to be Doing personals only on drip. I would think 2.9 album for williams or largely on drip at least Yeah, go say hey to kenzie and buy a box God, I think I think maybe not literally every single product that we have on the main site is over there But it's like it's mostly everything All the new stuff for sure refractor max for stopping red bull and then I think drip has the the bounties, right? There's some of the short prints Like if you pull a short print That'll just give you if if you have a prism football box that's ripped over there and you end up hitting a short print That'll just give you break credit because it was hit on drip. It's kind of cool. You used to know to refractor Alpha tarry. I saw people like bashing out. They were like, they're only gonna give you this much break credit It's like you keep the car and they're just literally giving you an incentive to break stuff on their black thing Like it's just extra This dude, they're giving you something for for for free for free. Oh purple green lando on the back. Let's do this random real quick and we'll do a uh Random no auto's in the end the hobbies is kind of crazy But we have had some breaks where we hit like an auto in every box. So That's the luck of the draw is how it goes sometimes art de grand prix Good luck ran into all five five ten Remember some top gets it one two three four five six seven eight nine ten Let's go to mclairen Great break for mclairen And uh, I don't do it. Thanks again everybody


Welcome to Toffey TV. It is the Everton News Daily. I'm sure we're all feeling happy after the well-in point against Chelsea on Saturday. Obviously, when you win a point away from home with a goal in the last minute, it always feels great, doesn't it? Going into an international break as well. So we're all feeling quite positive after that, I'm sure. Showing thy seems quite positive as well, and he has spoken about that draw after the game? No, but it feels like a very good fight back at a place that's hard to come and get results and points and wins, obviously. I think our mentality is improving all the time, and I think that was on show as the game went on. The resilience to the side. I think the desire of the side to not be so affected, a lot of noise about their way record over a couple of seasons, and it seems like we're learning how to brush that off and just take every challenge as it comes, which I speak to about endlessly. There you go, Sean. Daisers thoughts on the 2-2 draw at Chelsea, and obviously, as he said, very positive, good hard-working point, and to come back from behind twice as well, shows a real character in the team as well. Obviously, it was Abdaid D'Corey who got Everton's first goal and obviously his second goal in three games. He also got the assist for Ellis Sims, and Sean Daisers asked about his recent play. I think he's been pivotal.  You know, it's just different eyes. Myself and the staff come in, we're just looking at everyone, probably through new eyes, just fresh starts for everyone, saying, right, okay, who's willing to pop up, who's willing to work, he's enjoying it, he's enjoying the challenge, he's very adaptive, wherever we put him on the pitch, whatever we ask him, he just goes, yeah, and cracks on and gets on with it, and that's a brilliant mentality for a manager to have from his players. And I think that's growing amongst a group. They're like, yeah, whatever the hard yards we need to do, however we need to do it, we're willing to do it, and I think it's rubbing off on each other, I think the trust and the attention to each other as a group is growing all the time. So, yeah, the core, I do them well as benefited loads from obviously Sean Daisers coming in, two goals in the last three games, and you just imagine if you had a player like that for the whole of the season playing in that kind of position, we do need midfielders who score goals, you possibly could be getting seven, eight goals a season, and if you've got a couple of midfielders who do that, and then you've got a couple of wire players who chip in with that as well, it does enough, make a difference, and we've been crying out for goal scorer. So, fantastic from the core. He's in decent form, and obviously set the goal up for Ellis Sims as well, and obviously Ellis Sims has faced goal for Everton in any competition, isn't it? So, let's hear Sean Daisers' thoughts on that. Yeah, I mean, look, he's still got a lot to improve. He came up in the week, actually. He asked me, you know, what do you think? And I said, what do you think? He gave me four things, and I said, you're right. You know what I said? It's taking action. You know, a lot of these players, you know, they know the things they've got to do. It's just a strange situation. It's guiding them to go, yeah, you're right. So, therefore, take ownership of it and do it. And I think tonight was a good sign of that.  You know, you can't just wait for people to allow you to use it. You can't just wait for to be mature as a player. You have to earn it. You have to go and work at your game. And he's beginning to understand that, and he certainly did tonight with a fine run and a fine finish. They can't for his finish, but, you know, he done half of it.  That was it off, and then stays calm, and they're good colleagues to have. So, yeah, I mean, obviously, John Dike's just trying to keep his feet on the ground, isn't he? He's just trying to keep him relatively, you know, making sure the task at hand gets done, that he keeps improving, as you mentioned there. He becomes a more round the player, a better player, someone who will work hard for the team, and hopefully create more chances and put the ball in the back of the net. So, that was good to see, and hopefully we see more of Ella Sims over the next few weeks. John Dike was also asked about an incident involving James Tarkowski during, I think it was in the first half, a pull on a Chelsea player. Let's just say how that went. There was an incident with Tarkowski and Jalf Felix in the first half, where he looked like there was a little bit of retribution taken. He seems to grab him, and he held him to the ground. He was directly in front of us, kind of down towards the box. I can't remember that. I'm not imagining that. I know I haven't seen it, I must have been focusing on something else, but I can't remember. Yeah, John Dike, doing brilliantly there to avoid the question. I know the Oscars were last week, but that's going. That's a fantastic bit of acting from John Dike. Just one other piece of news today, not loads going on due to obviously going into the national window. Guysport have ran with the story that the Everton Stadium, even though it should be finished hopefully for Everton to move in for the start of the 2024-25 season, that is not confirmed, and it could be a possibility of Everton playing some games at Goddison Park if things don't go as to plan. Everton and Llangoroch have got a contract that Llangoroch are in place till the end of 2024. That's obviously worst case scenario, that's in case anything happens, certainly next winter when the stadium roof will be getting finished off in basically this time next year, but in those winter months leading into the summer, that all gets finished off till about a thing about May. So obviously Everton have got built in time. Now best case scenario is we go into the stadium beginning of the season. Hopefully worst case scenario is we play the first three games away from home and moving into the international break after the international big story. But that might not be the case. Everton have never said when they'll be moving into the stadium, they just basically said sometime during the 2024-25. We'll have to wait and see. It's not a new story as such, they're just updating the story. Everton haven't commented on it. Again, it's not great for the football club, not communicating with their football fans, with the Everton fans. Hopefully this time next year we'll get a clear picture on it, depending on where we are. Obviously where the stadium should be built, it's all those test events, making sure everything works. That can be the issue and can push a stadium or any building through past its completion date. The completion date is August, I think, but that doesn't mean we'll be in August. So lots of people will probably be filling the void of the narrative with money stuff or MSP stuff or whatever. This is not new news, it's just being refreshed just to make sure that everyone is aware that next season isn't going to be technically or could be technically our last day. It'll be our last full season of Gooderson Park, no matter what, but if things don't go exactly to plan, we could be playing some games of Gooderson Park. Let's hope it doesn't come to that anyway. Let's hope it doesn't come to that. Anyway, there you go. This has been the Everton News Daily. If you want the football news daily, head over to our other channel, Toffy TV Football, to find out about all today's football and stories. That is a brand new show over there. Make sure you subscribe to that. There's good shows going out on there all the time, just general football shows with just a little bit of a slight Everton hint bias to it, whichever you want to call it. So make sure you check out that. You'll find all these videos over on Toffy TV Premier. The link for that is in the description and the QR code is coming up on the screen in just a moment. See you later.


Today, May the 8th is the birthday of F.A. Hayek, one of the greatest economists of the Austrian tradition. Hayek was born in 1899 in Vienna, so he would have been 115 years old today. Hayek was a student and a younger colleague of Ludwig von Mises at the University of Vienna, and he later taught at the London School of Economics and the University of Chicago, as well as the University of Freiburg in Germany. Hayek won the Nobel Prize in Economics in 1974, the only member of the Austrian School to be so honored. Hayek's early work dealt with business cycle theory. Hayek followed his mentor, Ludwig von Mises, in explaining business cycles in terms of monetary expansion and interference in the monetary system by the government. Hayek, like Mises, believed that a market economy did not generate booms and busts on its own. Other economists, like John Maynard Keynes, who was famous at the same time as Hayek, Keynes argued that market economies were inherently unstable and that government intervention in the monetary system and with fiscal policy was necessary to smooth out or stabilize the economy. Nowadays, the so-called Keynesian consensus has fallen apart, and people are increasingly concerned that the standard approach of government trying to fix the economy and stabilize the economy isn't working. And the ideas of great thinkers like Hayek have been rediscovered and are being taught again to students and analyzed by policymakers. And so just as Hayek's Nobel Prize in the 1970s helped to contribute to a revival of interest in the Austrian school itself, the financial crisis and the failure of mainstream economists to predict it and to grapple with it has led to a revival of interest in Hayek's business cycle theory and the works of Mises and Rothbard and others who argue that a government intervention is the source of economic instability. Hayek was also a very important public intellectual. He wrote a book, The Road to Serfdom, intended for a popular audience on problems and dangers of government interference in the economic system. The book was published in the 1940s and caused a huge sensation in the UK and then later in the US, and Hayek became a sort of media star. Around this time, he also founded the Mont Pelerin Society just after World War II, very important organization of intellectuals and journalists and teachers devoted to classical liberalism and free market principles and helped to have a substantial impact on public discourse in the 20th century. Hayek went on to do very important work in other fields, in law, in philosophy, in political thought, and he has been continued to be a great teacher and inspiration for Austrian economists and others studying the free market and the free market legal system who came after him. So at the Mises Institute, we are inspired by the scholarship of great economists like Hayek. We try to follow in the footsteps of Hayek and Mises and the other great Austrians. We're inspired by their scholarship and also by their courage in the face of great public opposition.


my runs on my trainings end up being anywhere hour, hour and a half, two, maybe up to two hours. So now, instead of listening to music, I actually listen to podcasts and audio books that I speed up at two, two and a half X, and essentially it's amazing people that I want to share their knowledge that I'm able to absorb it in half the amount of time. Haven number three is the second brain technique. Now after so many years in school, I realized that I am not smart enough, unfortunately, to remember everything that I've learned, but I would like to.  And thus, having a system where you can collect your ideas you can come back to is super crucial. And one of my favorite tools I use on a daily basis to help with this is Notion.


This is stock number 9148A. We are here at Summit Automotive in Fond du Lac, Wisconsin. You're new and used minivan headquarters. Today we are checking out this super clean 2012 Chrysler Town and Country minivan. This vehicle has the 3.6 liter Pentastar V6 motor and from this video You'll be able to tell that for the age and mileage on this van. It is in excellent shape true blue Metallic is the color We shoot all of our videos in 1080p So if you have HD capabilities on your computer tablet or a smartphone device turn them on right now because it is like you're right here Looking at the van with me and definitely your best way to check out the vehicle and its condition before you get here Very clean down this side of the van comes with the factory alloy rims and Michelin energy saver 225 65 R17 tires these tires have right around half the tread left and Actually, these are the same tires that I just got on my minivan. So definitely some really nice tires there Headlight lenses are nice and clear comes with the projector lamp head lamps the front bumper is in excellent shape I didn't see any dense dings or cracks on that the hood is in really nice condition as well I didn't see any dense on that passenger side fenders and pretty nice condition Comes with the factory alloy rim on this side no scuffs or scrapes And as we go down this side of the van you can see just how clean that body is How reflective and mirror like that paint is we take these HD videos So if you are far away or even if you're close by and just cannot make trip down You can still see the van here the big van and of confidence in the vehicle that you're looking at before you can get here It has the collapsible roof rails And once again down this side I Didn't see any dense or dings On those doors just got a little bit of bubbling rust there back rim is in excellent shape and the back tire is in About the same condition as the front maybe a little bit more tread than the front And we do just have a little bit of bubbling right there But for the miles on the van actually in really nice shape the rest of the way around As we come to the back of the vehicle You can see it does have a receiver hitch and wiring backup sensors You can really see that metal flake in the paint there The rear gate is an excellent shape as well didn't see any dents on that and it is a power lift gate Back storage area is very very clean And it does have the stone go system so those seats do fold on flat You just follow the numbers one puts the head rest down two will put the back rest down three releases it and four We'll bring it back and you got a nice flat surface when you got that second row down You can fit a four by eight sheet of plywood or whatever you might be holding or hauling with you back here You can see it has the side window shades and Just take a notice that it does have the Dual DVD player Put that back you just grab that strap flip it release three and you're all set to go Close the gate just press this button right here It'll be patch you three times and then it'll come on down as we go down this side Just as clean as that passenger side this side's got No, while bubbling on this side Just that other side a little bit there. Um, but this side's a nice shape This rim is an excellent shape and that tire has just as much tread as the rest And down the rest of the side of the van very very nice It does have the blind spot monitoring built-in directional signals in the mirrors and they are heated Inside the Tourinelle package gives you the black leather interior There are no rips there are no tears in these seats both these seats are power both of these seats are heated It does have auto headlamps power pedals power windows power locks power mirrors and one of my favorite features is the power venting rear windows Can't get that on the Pacifica And as we hop inside you can see that this van does have 98,716 miles You get a compass and outside temperature display instrument cluster is very nice and clean. This one has the heated Leather wrap steering wheel cruise controls on the right Bluetooth and audio controls and information center controls on the left and then on the back of the steering wheel are more audio controls This one has the 430 radio which gives you a MFM and Sirius XM radio capabilities This is also where your backup camera shows up And then it does have a hard drive where you can store music files on it dual climate control You're heated in seats and heated steering wheel buttons. There's where you put the DVDs in and the Dash and door trim Nice condition there passenger seat is very clean as well No rips or tears on that headliners in nice shape power Sliding side windows power rear gate and it does have the homelink system for your garage door security systems and Lighting systems. We will take a quick look at the back seats and then we will check out under the hood Back seats are just as clean as the front seats. There are no rips or tears back here It does have the latch child safety system for your car seats. These second row seats are heated There are those side window shades and of course the DVD player right there and then you can see it does have the heated seat button on the door handle there To get to the back you just pull that lever Flips right up these back seats are just as clean as the rest no rips or tears back here And finally, there's two aux inputs back here for your video entertainment systems And then a hundred fifteen volt hundred fifty watt plug-in These seats do go completely flat into the floor and to close this story. Just press Button right there. You can see the door slides nice and smoothly And we'll take a quick look under the hood. I'd personally like to thank you for checking out the video today Hopefully from this HD video you'll have been able to tell just how clean this van is all the way around Inside and out under the hood. We have the 3.6 liter pentastar v6 motor Then on wards top-10 engine list several times Runs very smooth this van has been fully safety and inspected has a fresh oil and filter change All the fluids have been checked and tapped off the vehicle has been gone through mechanically 100% and Is 100% ready to go to see more pictures of this van or one of our other 450 new and used cars trucks SUVs minivans wranglers you name it. We got it go to our website www.summitauto.com full pictures and descriptions of every single vehicle on our lot from two different locations all at summit auto.com And if you want to check out more HD videos, you can go to youtube.com Slash summit auto remember to like subscribe and share on this video and all the videos that you see there In fact in a second you will see a link to subscribe to our YouTube channel on your left it linked more Used inventory videos like this one on your right if you've not been to our website on the bottom link to this Vehicle on our website click those check us out and we really look forward to help you with this super clean 2012 Chrysler Town and Country to renown. Thanks again


Because this is one of the best-hitting teams in the American League. You can't even imagine how dangerous they're going to be now that he is hot. What kind of impact does his hot streak have on this line? Huge.  I mean, pretty much the size of Aaron Judge. With what he can do, he can carry a baseball team. And I think you heard a lot of talk earlier this season about him kind of pushing balls to right field and really forcing balls to the right side of the diamond, kind of getting caught up in that Yankee stadium type vibe, right? Trying to hit everything in the short porch and right. And now he's getting back to that 2017 type vibe, right?  And I've always said, when he has that long, beautiful one-handed follow-through, that's when things are right. He's hitting balls deep to center and right center, catching all the breaking balls, pulling them down the left field line. This guy gets hot, everybody else follows him. They not only love him, he's the best player. The dugout is hyped.   You don't get a break. Yeah, that's exactly right. You cannot make a mistake. You can see in the highlights, every time a pitcher throws a get-me-over, breaking ball or a fastball, just to fill the strike zone, the Yankees are very aggressive. Like Aaron Boone said, they're savages. They smell blood in the water. And they give A swings, one, because they trust their ability. And two, they trust their teammates to be able to protect them. You've been in a lineup like that. If I don't get it done, I know my teammate behind me is going to get it done. And that's infectious in the locker room. And that's why you're seeing the joy and the energy, because we're all taking part in going out here and winning baseball games. Well, I also think the one cool thing about that is, is a lot of guys in that lineup are producing that we didn't expect them to. Gio Orcella could win a batting title this year. Maven. Mike Tokman's been absolutely amazing. Maven has as well. So I think what else is happening in that lineup, these guys are taking this opportunity to get at bats and be part of that New York Yankee tradition. And they are just absolutely taking it and rolling with it. Next man up, mentality. Also, too, we talk a lot about the players. Let's give Aaron Boone a little bit of credit to keep everything at bay, because let's be honest, there has to be somebody to answer to all those people. And I think he's done a great job. And think about how many injuries they fought through early on in the season. And now you have guys like Luke Voight looking good in AAA. Sandy's boys coming back. They're coming back up. They can be better. This is going to be scary. I mean, right now the Minnesota Twins have more power in the American League as far as home runs. But I don't know if there's a more dangerous lineup. They're pretty good. Than the Yankees. And we just saw them facing the Dodgers last weekend. Are the hopes for the Mets making the post-season fading? Well, you know, I'm a MET killer. So I kind of have some hidden joy in this. No, but this is a struggle that you didn't see coming. Everyone outside of City Field was hoping that it would happen. Another Mets collapse. But you didn't see this coming from the rotation. The rotation had a bad week. They're starting to struggle. The rotation was supposed to be the ones they were supposed to build off of to take pressure off this young, talented offense. And I tell you what, they're starting to hit a wall, man. So it's a little shaky right now. But I believe in the rotation. But I don't think it's going to be enough to issue. You don't think this offense. What do you think about this offense? Some of the young guys like Alonzo keep this offense going? A lot of pressure on this young, talented offense to continue to carry the load and score nine runs for Cindergarde. You want that to be a low-scoring game. So now anybody else can factor into that lineup to win that ball game. But that's a tall order for that lineup to be scoring double-digit runs on a night. It's the rotation's job to keep the game close and intact and have a shot to win the ball game. Yeah, I know there's still a month left of the season. But I think these next 10 games will decide whether the Mets are going to get into the playoffs or if they're not. Obviously, they're playing the Philadelphia Phillies. They've got the Cubs right now. They got DeGrom going tomorrow. And then they got the Phillies, the Nationals, then the Phillies. DeGrom has to be the stopper. He's got to be the guy. That's what I was going to say. Absolutely, to take pressure, get the rotation, set the tone, get them back on track. If he doesn't pitch well tomorrow, I'd say that timetable might be shorter. Yeah, it's crazy, man, because we've seen the Mets and they go on these crazy runs and we get so excited about them. It's just hard for them to continue to keep that going because it's such a high, you know. It's another Mets collapse. That's exactly what it is. DeGrom could be the stopper in his last four starts. He's only given up four earned runs total. Do you remember times like that where you knew, like, I got to go out and stop this skit? Absolutely. You have to go out there and go deep in the ball game and give quality, and you put that onus on yourself, but sometimes you can backfire and you try too hard to pitch perfect. Let's hope he doesn't do that tomorrow. Give them some quality, be able to keep it a low scoring ball game, but I just don't see this offense being able, night in night, to score a lot of runs like that. All right, so Sendegard, he wants to shake this off. This was a rough night for him. The most runs by a Mets pitcher since Johann Santana in 2010 at 10 runs. And that was in three years. The ERA blew up. It's a couple. It's a two beer night.


Welcome to our hands-up date. This is your week in Navy history. On June 22, 1898, during the Spanish-American War, the Spanish destroyer terror joins Isabel II in an attempt to torpedo USS St. Paul. St. Paul retaliates and damages the terror, causing the Spanish ships to retreat. June 23, 1812, Commodore John Rogers leads a squadron on USS President off New York until she battles HMS Belvedere. The first shot of the war of 1812 was fired by the President during this battle. On June 24, 1948, the U.S., French, and Great Britain initiate Operation Vittles to offset the Soviet Union's blockade of West Berlin. The operation consisted of U.S., Great Britain, and French Air Forces providing much-needed supplies to parts of Berlin. To find out more about naval history, visit the Naval History and Heritage Command website.


Adding an Editing Text In many places in Moodle where you can type in text, you will see Moodle's Purpose Build Editor, known as ATTO. We see it here in a topic section summary. Many of the icons you'll know from word processing or other online programs, but some may be unfamiliar. The Link icon allows you to link text to an external website or an uploaded file. So for instance, if we select the text BBC Talk French and then click the link, a pop-up appears allowing us to paste in a URL or web address. The text will change colour but note that the link will only work once you've saved the changes. The Media icon here offers many options for adding sound and video along with thumbnail images and subtitles. We explore adding media in a later video. The ATTO Editor allows you to drag and drop images directly onto the text box, something we look at in another video. And it automatically saves what you type, so if you have to leave it for a while or you accidentally go onto a different page or lose your connection, you don't have to start again. Two other useful icons are here. They help ensure your text is designed well to make it accessible for everyone on all devices, including people with restricted site who use screen readers. If you really want to use different colours and different font styles and you know about design, you can change your editor if your admin allows by going to the user menu top right, clicking on preferences, then editing. Technical people might use plain text if they want to add code and TinyMCE is an alternative editor which many people know from other online software such as blogging software. If we select it, you can see what it looks like and again the hamburger icon top left allows you to expand the toolbar for more options. However, TinyMCE does not have the same features as ATTO and for that reason we suggest you use Moodle's own editor, ATTO.


Just before I actually get into it, how many of you guys have done automated testing before? Oh, quite a lot of you. Unit testing or B-HAT? Unit testing right now? Both, okay, and only B-HAT? Something else entirely? All right, we've got a really good mix. All right, this is testing for the brave and true. I'm Gabe Suleese. I work as a back-end engineer at Atten Design Group. My email is Gabe at atten.io. You can find me on GitHub, Drupal.org, or Twitter, as Gabe Suleese, and that's pretty much everywhere. Atten Design Group is a full-service digital design, strategy, and development shop based out of Denver, Colorado. We work mostly with universities and nonprofits. Mostly we just like to say that we help tell the world's most important stories. To start, I'd like to say a little bit about why I'm up here. And that's mainly because I think discussions around automated testing have often left people really far behind. I hear people say things like, if you're not testing, you're doing it wrong. That can be kind of frustrating because it's kind of like don't tell us that we're doing it wrong, just tell us how to do it. And let's be truthful. Testing isn't really all that easy to get started with. Mostly because documentation is kind of terse and aimed at core developers or maybe maintainers of big contrib modules. And so learning the basics can be kind of difficult. It's difficult to find good examples and it takes time to develop the good habits that makes automated testing easier. But the rest of the programming community at large has been doing testing for a long time. And in Drupal for everyday use, I think we're kind of behind the curve. And testing can provide us with all these enormous benefits. Better reliability, better security, and especially better maintainability. So we kind of have to be testing all throughout our days and all our code, our custom code, especially testing when no one's looking, right? Because if you're only testing when somebody's watching, it's gonna be really hard to go and share your code on Drupal.org or something like that and really have it well tested so that other people using those modules also get that nice reliability, maintainability, and security features. So let's go to first principles. What is automated testing? What are automated tests? Well, they're just code, right? If you can write or call a function, you can write tests. There's nothing magic about them or difficult to approach. They're just code that tests your code. If you're writing a new function and call some other function, a test just calls the new one that you're writing, right? Given some inputs, I expect to get these results. And I think a lot of us are mistaken in the belief that we think we haven't tested before or we're not doing testing every day. But the reality is that we're all testing all the time. It's just about whether we're actually keeping that work for prosperity or not. So these are some of the ways that we might already be testing. We might be doing testing in the browser, right? So you're familiar with that kind of workflow with Drupal.  And then you see, did what I wrote, did the function I wrote or the hook that I implemented, did it actually do what I expected, right? So we do testing in the browser. We might do it with Xdebug. We might dump out variables using DPM, Vardump, Kint, even just print sometimes, right? And then even sometimes reading code that you're not familiar with can be a form of testing, right?  And so that cycle just kind of repeats. Did I, what I wrote actually work? And then we just repeat it and repeat it and repeat it until we get something that's working, right? And eventually it does and then we move on. All that work that we've put into kind of discovering the edge cases, making our assumptions, validating different scenarios in our heads and spending that time to gain this mental context just goes out the door as soon as we move on. So don't throw that work away, right? You can keep that by just putting it into code. And that's all that automated testing is. When we don't commit our tests, right? We'd leave our code to just rot, you know? We come back maybe a week or a year later. And it's just, we can't even, we barely recognize it anymore. So we forget all those edge cases that we discovered. And then we have to repeat that effort. We have to regain context and whatever we're working on. And so that's where automated tests can really help. They're kind of like living documentation for everything you're writing. When you write an automated test, you're writing down those assumptions and those assertions that you wanted to make. You're saying, these are all the things that I want this code to do and solve. And so when you return to it, it's there for you to pick right up. You don't need to spend so much time refamiliarizing yourself. And even better, this is kind of overlooked sometimes, is that you don't have to do it for all the code in your entire code base, right? When you make some change over here, you can be sure that you didn't break something over there, right? And I can't imagine how many times it's happened to me, right? You go in, you're trying to fix some bug, you found some new edge case, your client called you and said, this isn't working how I expected.  And all of a sudden a week later, you get a phone call and oh man, this page isn't broken, it's just a white screen of death or something. And the reality is you just forgot something over here. It doesn't happen all that often, but when it does, it's super embarrassing. And so the last little thing that makes testing really valuable for me is I also have a framework to put my new, like newly discovered bugs into code, right? You've already built the framework to say here's the thing that my client did, right? They put this value in and this is what my code should have done, but it didn't. So you get a failing test and then you can work to actually fix that bug and then be assured that you did, right? Your test will finally turn green and will pass it. So all those things, right? The regain of context, the ability to put bugs into a already existent framework, those things can make you a more productive and a more reliable engineer. And so maybe I'm making all these promises but you're still skeptical and there are probably lots of doubts that you have about testing, right? You wouldn't be here otherwise. And to be honest with you, I'm still trying to get over them myself. So you might have questions like, how can tests make me more productive when it means writing more code? Or how do I find the time to write tests? How do I sell them to my client? Or, and this is the one that I found to be hardest. How do I convince myself that testing is gonna be a net benefit to me? So let's go back. Look at that one. How does writing more code actually make you more productive? And I kind of just have a rhetorical response to that, right? Why do we do object orientation? Why do we write smaller functions and break them down from bigger ones into smaller ones? Why do we break a long if statement down into multiple lines? The reality is, is that writing a little bit more code makes your code better to read, easier to understand and more maintainable over time. All those same things can apply to testing too. You just have to develop the habit of getting into it. Just like you just have the habit of automatically writing a new function or something like that, just have the habit of writing a small test. And if you've already started the framework and you've already learned and gotten over the initial humps, that won't be so hard or daunting. Or how can I find the time to write tests? Well, I think at first I'm not gonna lie. It can be really difficult.  It's hard to understand when you first get into the habit. It's hard to write testable code. There are lots of things that you have to worry about. Like, are my dependencies injected? Am I relying on something outside of the function or a global variable or something like that? And so you can't mock that. You can't fake a test so that you can really test just the functionality of a single item. So it will be hard to start. But once you get better at it, it becomes this natural thing and it'll actually help you be faster. It'll save you time in the long run. Because if you think about all the time you've spent switching context between your editor and the browser or sitting there waiting for cash to rebuild or something like that. Or the time that it takes you just to pull down a local site and fix a problem if you haven't set that local site up in a while. Or even just figuring out what exactly it is you want to print to the screen. What DPM or what variable nested down deep in this big array? Do I actually want to print and see on the screen? And then especially it can help when you've broken something that you didn't think you were breaking. That's the, I fixed something over here and it broke something over there problem, right? When you have a whole test suite for all your code every time you fix something you can rerun all those assertions and make sure that you didn't break anything that you didn't expect.  And even better tests that are automated can just be run alongside your editor. Every single time you make a change you add a new function, you implement a new method, right? You can run these tests over and over again just the ones for what you're working on and just get this constant and contextual feedback, right? My tests are red, my tests are green, they're red again. And I think that just kind of gives the answer to this one, right? How do I justify it to my clients? I think automated tests, especially when we're talking about PHP unit they're really for you, right? They're not something you sell your client. They're to make you a better engineer. They're to make you more reliable and more productive. And in the end that makes you more valuable.  It's gonna be easier to extend when they come to you with that new feature request. You know, you don't say to your client I'm gonna go ahead and implement this new object or I'm gonna create an interface so my code works better with other things, right? You just do it and it's something that you have to make a habit. And then how do I convince myself? And like I said, it's the hardest one to do. And I recommend if you really just wanna get started and try testing and just kinda be familiar with the ideas and the ideas of dependency injection or how to keep your functions not relying on outside stuff start with something really small, right? You don't need to start with Drupal itself.  Bring it to completion and then go back and refactor it. You'll have kind of explored the problem and you'll have some ideas about how you could do it better. And I think you'll find that if it's really well tested when you go back to refactor your code you're gonna see that you're refactoring broad swaths of code much more quickly than you would before. You can just totally reimplement a function or something like that and be sure that it does at least as, functions at least as well as it did before. All right, so how do you get started? The first thing is the tooling. There's lots of it but with Drupal we've kind of settled on two different conventions. PHP unit and BeHat. PHP unit is operating at the PHP level. It doesn't need a browser and it doesn't need a browser driver and it's about testing your code in isolation. Just functions. It's not worried about the HTML that it outputs at least at those lower levels and it's a lot faster than BeHat. BeHat is the other tool. That one operates at the browser level and it can test your code kind of like a client can test your code. It's more interested in things like when I go to this page I can see that this button exists or something like that. The rest of this talk I'm actually going to focus on PHP unit and the reason I want to do that is because as a modern day software community we have to be testing our code from the basics from the absolute bottom because we can't just be testing the features that we're delivering to our clients. We also have to be testing the code that we share with each other and I think that's something that's pretty lacking right now. It's hard to find good examples of testing in all but the biggest like contrived modules, right? You can find them in views or organic groups or things like that but you don't find them in the smaller modules that you might use every day. So we all have to just kind of improve as much as we can. With Drupal and PHP unit there are kind of three conceptual levels of testing and I kind of think of it like a pyramid. At the bottom are what are called unit tests and those are about isolating very small bits of code maybe a single function and making sure that it can handle all kinds of inputs correctly. So if you're doing like an addition or a sum function you might test that it does negatives and positives negatives and negatives maybe it can handle a null value. How does it work if you pass it zero? Things like that. That's kind of your opportunity to test all the edge cases that maybe you don't really expect from your clients or expect people to enter but it makes your code like I said in the beginning a lot more robust if you can really explore all those possibilities. And then right above that in the middle layer are integration tests and those ones don't need to test all those different values like does it sum negatives and positives correctly. Just makes sure that everything works well together. So if you imagine you were making like a calculator or something and you had a sum function and a multiply and a subtract function and those had all been really thoroughly tested you don't necessarily need to know that your calculator can add positive and negatives. You just need to make sure that if you press two and two and plus and then two again it's going to actually call the add function with 22 and two, right? And then at the very highest level are what are called functional tests. Sometimes you'll see them written as system tests. And then they're at the absolute highest level. When you're doing it with in PHP unit they're actually able to like validate that maybe some HTML was put out to the screen or something like that but they don't function quite like in that you're not necessarily clicking things or going from page to page to page. But even given that this is a pyramid it's important to know that it's not just these distinct layers, right? It's kind of more like a continuum. Sometimes a test is going to fall right on the boundary and you don't need to fret kind of over about which one you're supposed to be testing. You kind of just need to know that they all exist and that you can go up and down those layers of abstraction. If you're having a really hard time testing like a hook, like entity alter or form alter, right? Maybe you're doing it at too high of a level. Maybe you should drop down and test it in like greater isolation or do it vice versa, right? So know that you can move up and down those layers of abstraction. All right, so PHP unit itself. It comes with two main things. A testing base class and a command line utility. But as with everything, Drupal has kind of added their own Drupalisms to that. Drupal has extended that base class and implemented their own. The unit test case is for those bottom most tests and then kernel tests kind of fall right in the middle and they move between kind of unit and integration tests. And then at the very top level, we have kernel test base, web test base and browser test base. And I just note that those very high level ones that can validate that HTML was not correctly. I actually see a lot of you taking photos. I definitely am gonna put this up on my slide description or session description and I'm gonna put links to all of this later but feel free to take pictures if you want to. All right, so let's actually take a deep dive here. What's the setup? If you wanna write your first unit test, how do you do that? So this is kind of like the directory structure of your first test and it's before you've even implemented any kind of source code. You have your module and we're gonna do like a hypothetical calculator here. So you have your calculator.info.yaml. That has to be there in order for a Drupal's PHP unit stuff to recognize that you actually have a testable module. You have to have that info.yaml implemented. And then within your module directory, you're gonna create a tests directory, all lowercase tests and then within that, SRC for source. And then by convention, we put unit tests in a unit directory and kernel tests in the kernel directory. And then finally within each one of those, you implement testing files that test the classes that you're implementing in your regular source directory. And there's always have to end with test.php. That kind of tells PHP unit, this is a file you're supposed to read in and actually operate on. Just for the interest and understanding, what I'm gonna do is if you guys have a question, I'm gonna just take one question on each of these actual slides and then I'll just repeat it for recording purposes. So if you guys have any questions about that, just feel free to raise your hand, okay? All right, so this is, we're actually going into the arithmetic test there. You see that in test, source, unit, arithmetic test. As with everything, we start with that PHP tag and then we actually tell it the namespace. And this is one of the gotchas that first got me when I was trying to start unit testing with Drupal. Even though we're used to putting everything in like the namespace of Drupal, my module name, and then something like controller or service or plugin, it gets flipped when you're doing tests. It starts Drupal, tests, and then your module name and then whatever's inside your source directory. So it kind of gets flipped. It's that first gotcha. And then if you're implementing one of the classes that Drupal's given us and it's already extended, you want to use that. So in this case, we're writing a unit test case, so that's what we're going to extend. And then finally, you'll want to actually use the class under test. So if you're testing an arithmetic class, you want to use that as well. And then you see that we have some comments around those. Those are optional, but they really kind of help PHP unit give you better error reporting. So you say covers default class, and then you give it the fully qualified namespace of the class that you want to test. In this case, Drupal calculator arithmetic. And finally, you give it a group and kind of by convention, that's your module name. And what that lets you do is if you're running a bunch of Drupal tests all at once, it know that you can just specify that you want only the tests in the calculator group to be run if you just want to be working or testing what you're working on at that moment. The last part of it is implementing class arithmetic test that follows that name that we used before, right? Arithmetic test dot PHP. And we extend the unit test case. Everybody good? After that, there's a function that's available in any test and that's set up. The setup allows you to set up the basics that happen with Drupal. So if you're using something at a higher level like a kernel test or a functional test, that setup function is maybe setting up a connection to the database or the fake database that you're using for those tests. But this is also a good place to create a fake node or something that you can pass to the function that you're trying to test or the method you're trying to test. And what you usually want to do is if you've got a class that you're about to test, you assign it to a property of this testing class. In this case, we're just assigning it to this arithmetic. And to follow best practices and coding standards, what you'll do is you'll also want to just declare that property just above that setup method and give it some documentation. This is the class being tested and then it's implements Drupal, calculator and an interface or something. And it's a protected property within a class. Okay, so these functions are the actual ones that run your tests. So those have to start with lower case test. If you public function test sum. And then that second part of it sum is just by convention, the name of the method that you're testing on that arithmetic class. That could really just be gobbledygook. It doesn't really matter. But by convention, it's the method name. And if you want to actually break your tests and test different parts of the function, like does it handle exceptions well or something like that, you can go ahead and extend it with an underscore and then something a little bit more descriptive. But again, everything after that test is really arbitrary. There's no official stuff there. You also want to go ahead and put at covers and sum. And that'll be the method on the class you're testing. This is something I like to do when I'm starting a test, right? I set up a number of cases that I can use to validate, to provide the input I want and then say what I expect. What that allows me to do is very quickly add new cases, new different inputs and then say exactly what I expect out of the function. And then I can just loop over those and assert the values over and over again. So here's kind of that loop, right? We go through and we loop through those cases and for each one, we get our first argument and our second argument and then we pass it to the method or arithmetic class and we get the actual value back and then you call this method that's implemented on unit test case and all of the test cases in Drupal, right? This assert equals what you expected and what you actually got. And if those two things aren't true, then what you're gonna do is PHP unit's gonna throw an error on the command line. So if we actually ran that, what we get is a failure and in this case, fatal error class and arithmetic not found. That's pretty obvious. We haven't actually implemented that class yet.  And then the one argument that you have to pass it is dot dot modules and then custom calculator. So the path to the module that you're under test. That makes it a lot more fast than just doing something like passing the group identifier. If you just pass the group, it will take maybe like sometimes even two minutes just to get started with your tests because it's trying to parse through all of core and contrib and your custom modules, find all the possibilities and then only test the ones in the group that you specified. So a shorthand is just to give it a directory that you wanna test. Okay, so here we're actually gonna actually go into the implementation of that arithmetic class. So we put it in the source directory, we call it arithmetic dot PHP and that kind of mirrors the name of the test as well. So it says arithmetic dot PHP and its test is arithmetic test dot PHP. So we've kind of seen this thing before, right? You start with the PHP, you give it the namespace, we notice that we don't have the test there and it's kind of flipped. And then we go ahead and implement our class and here we're doing the actual method that we wanna test, right? Given some sum, I get X plus Y. So if we were to go back to our command line, we would run that PHP unit command and we'd see we've got one test and three assertions and that's because back here, we had three different cases that we were testing. So PHP unit can tell us what we're doing there. And so if we were to add one more case, it would just bump up to four assertions. I was expecting some, go ahead. Why do you have to be in the core? That's to basically let it look at how to find the, there's some XML configuration files and so PHP unit looks for those and then also if you wanna test core as well. So you can run Drupal's test runner script from in there too and it helps it just find everything. I think you could probably do PHP unit tests on your own that don't use Drupal's standard stuff but it has coding standard and stuff like that with it. Yeah, do you guys have any questions about that whole process? Yeah, there are Drupal console ones. I don't remember them offhand. I'm not aware of any Drush ones. That's actually it. I just wanted to open it up to questions of whether you find testing useful if you're struggling with something. Okay, yeah. So the question is what's the difference between unit tests, functional tests, integration tests and all of those that go back to that slide? So unit test case starts at the very lower level. It doesn't set up a connection to a database or anything like that. So it's just about testing one single class and the code that's immediately available. So let's say you wanted to test that when you call this method, a node is saved. A unit test wouldn't be very good for that because you wouldn't know if it actually wrote the node to the database or not. So you couldn't go up to the higher level kernel test and the kernel test is able to actually install other modules and it'll set up like a SQLite database. And that's actually a really cool thing to know. So when you run kernel tests or functional tests, Drupal sets up a fake database that's used just for that one execution of your tests and uses something called SQLite, which is kind of like a mini SQL database like MySQL, but it just writes to one single file and that one single file can get just destroyed. And it's really advantageous because you can set up things over and over and over again. You don't need to say set up test nodes in your database and then actually use those in your tests. But it can actually be a little bit of a difficult thing to manage because then you also don't have that stuff in your database, right? If you're testing a method, you might also have to create nodes before every test. You can't just reuse them every time. And then web test base and browser test base, those are kind of the functional test classes in Drupal. And what they actually do, the web test base can test HTML, right? You can actually make assertions that classes exist or that a button was printed to the screen. I think you can even submit forms and it's a lot quicker than the browser test base because it doesn't actually use a browser of any kind. If you use browser test base, those are a lot higher level. They'll actually do things, try and emulate a browser. Is that into your question? Hey, the reason I've never really come around to adopting automated testing is when I started out as a developer, it was hammered into me that you don't test your own code. And all of a sudden it just came, like you started going to conventions, you just hear about automated testing and I've been to so many sessions but nobody's ever kind of talked about like why was there the shift where like not only is it okay to test your own code but you're writing your own code to test your code which might have your own bugs in it. And I just like have not been able to grasp just because of my background like that being hammered into me like I just, it fundamentally seems wrong to me. Yeah, so I think I think the biggest thing that maybe the people were talking about is that when you're writing a functional or you're writing a function and you're writing a method and you make some assumption and it's a wrong assumption, when you write that test, then your test might also bake in that assumption. And so it's difficult to test your own code in that way. But I don't think it eliminates the value of the testing because at least if you write the test first, you can start to think about the assumptions you're making and validate each one of those. It puts you in a mind state of like trying to break the code that you're about to write. You know, if you're doing it before you write the actual implementation, you can try and think of lots of edge cases and then write the test. And I think that's still a valuable experience. I think you're still gonna have the case where you miss some assumption but at least if you go back, you're already gonna have it in place. So I think it just helps with a mindset and there's still valuable stuff there. It would actually be really interesting to see like if you're doing pair programming or something, if somebody else wrote your test and then you implemented it. But a lot of us are just working on our own so I think it still provides value. Yeah, so that was a really good point, right? Once you have written the test to begin with and that assumption comes up as a bug or something like that, you just have a place to add a new test, a new assumption and it's already written out for you. You're not gonna have to start from scratch and you've written testable code because if you're just writing code and you're never testing it and no one's ever testing it, what you're gonna find is that it's all really tightly coupled and woven together and it's not testable. And so then when you do have a test case or a bug that comes up, putting that new bad assumption in or I guess it's clearing out the bad assumption, you have a framework in place and your code is already testable. So if you need to break something out and rewrite it, you're gonna be able to do it a lot better. Test when you need an entity or a node creating it programmatically or you're gonna be able to do it. Yeah, so every node, every entity type at least in core has an entity interface. So there's like node interface or term interface. And if you're not familiar with an interface, it's kind of like the difference between a node type and an actual node. The interface kind of defines the methods that are available or that must be available for some actual real thing to take its place. So you might say, if we were writing an interface for this, where is it? This class, if you see I'm implementing that interface, I might say anything that implements arithmetic interface must have a sum method and it must take two values, right? But you don't have to write the implementation. And then when you swap something out with it, you can put in a fake thing. So if you were relying on something that you could use an interface for, you could say always return two in this case. That way you could make sure your code is tested when it returns two, okay? And so those entities that you're talking about, like a node entity or a term entity, they all come with interfaces. So what you can do is within all of these classes, there's something called prophecy. So you call this prophesize and then you pass it the interface and you get back this object that implements that interface. And then you can say like when I call ID on the node or when I call get title on the node, it should return this string and then that's what you pass into the function. And so you can kind of make a fake node in place. But if you absolutely have to have a node in the database, that's where the kernel test comes in. It actually bootstraps Drupal, it'll set up that fake database and you can just say node create, pass it some values and call node save. And for the duration of that test, it'll exist in the database. Hi. Thanks, good, great talk. I find I'm sort of at the early level of writing automated tests and I find that I'm writing a lot of tautological tests, like tests that can never fail. Like I'll write a method to return an array of nodes or something. And then I'll write a test that says make sure everything in that array is of class node. And that's not unuseful because by creating the test, I've made myself throw an exception in the function so that I can test, hey, if this thing isn't there, then I should expect an exception. But at the same time, that test is basically, the chances of that regressing ever are close to zero. And I haven't been able to get to the next level of writing tests for things where there could be a logical, like there could be a change sometime that would actually affect the test and start turning it red and we'd want to catch that. So do you have advice about how to get off the shallow end and into the deep end? Yeah, so I think that's exactly my same story, right?  But I think there are two strategies that I've adopted and that's really trying really hard to write the test first before you write the code because then you're not just going through line by line and saying, does this line do what I thought it did? Does this line do what I thought it did? Instead, write what you expect from the function and then implement that. And that kind of helps you avoid that. And then also if you're writing a class, try and hide a lot of those just very simple functions that do exactly like give me the first item of an array or something. That's protected methods and those don't need to be tested. So just have a simple, very simple interface like public methods that might actually fail, that might fail when the database doesn't return any results or the database connection goes away or something like that. And just test that whole class using those few public methods and then you don't need to actually test the ones that are trivial or something, right? And a lot of times the things that you want to test are when the dependencies change. So if you're imagining some test that goes and can tell you how many nodes are in the database or something, that depends on a database connection and that's something you might wanna inject. You mock it up, you implement this database or you insert this database into that class and you can then have that dependency either return no nodes, 100 nodes, 10,000 or throw an exception. And then you can handle all those cases before you actually write the code itself. Does that help? Cool. Are there cases in which you would write a test for a private or protective method? Well, so if you're actually doing this arithmetic test class and you're doing what we did in the setup function right here, you wouldn't actually be able to test those private ones. So yeah, you just couldn't do it. Would you ever go back and write tests for an existing module or do you think it would just be more work than it's worth and kind of end up with what he was talking about with writing tests that would never fail? Yeah, so I think that kind of brings us full circle to his original question, which is like write tests for, do you write tests for yourself or other people's code? You can write acceptance tests and that term has changed over time but what it used to mean is that given somebody else's code, these are the things that must be true for me to accept their updates. So if they made, like they made a breaking change, if you depended on some function in their test or you depended on some method on their class to work some way, what you can do is test the assumptions that you're making or you test how you need it to work, that way if you update the module, you can rerun those tests for it and be sure that they didn't break what you are relying on. But also it's open source so if you want to write tests, go ahead. Please do. So it sort of seems to me that Behat would be able to handle the same things as web test space or browser test space. Can you talk about when you might want to use one versus the other? Yeah, so I think web test and browser test space and I think there's actually a new one called JavaScript Functional Test Base, it's a mouthful. But you have to use those if you want to put it on Drupal.org. The test spot runs based on those classes and I don't know if it has Behat, I could be entirely wrong about that though. I have seen that a lot of people when they're up at that high level, Behat tends to be easier because it's easier to write, like I said, like a client might expect it to work. And you can point it at Drupal database that's existing, like your staging site and actually have real content that you're looking for. Whereas with the Functional Test, it's probably gonna be for more like a contrib module, you have to create the content every single time you wanna test it. So yeah, it's good for contributed stuff. So in the example you gave, you're testing like a new class that you made kind of without any context of Drupal, right? So once you start working with like your module within the context of Drupal or you have other pieces like creating a plugin for some other module or you have code in your module file, like hooks and that kind of stuff, is there like a line between what you can expect to reasonably test within the context of Drupal as well or does that bring in like Behat to the conversation instead of just PHP unit? Or like what does that look like once it gets to a real module in a project? Yeah, that's a really good question because it's something that you're gonna struggle with when you first start and it's something I struggled with. And I think that you have to be really disciplined about testing just what you're concerned about. So if your function is like a hook form alter and it's maybe making sure that a field is hidden, you have to make sure that you're only testing that you're hiding the field and not trying to test everything else. So I've kind of adopted a practice when I write hooks or I wanna test a hook. I don't test the hook itself directly. What I'll do is I'll make sure I get all my dependencies. So if I need to go to the database or something, I get those using like Drupal, colon, colon service, entity type manager or database connection, right? And then I pass it to one of those underscore functions in the method or in my module. So the ones that are just kind of for internal use and that's the function I test. That's the one that I test. Does it work how I expect or does it remove a field or anything like that? And what that lets me do is in my tests, I can inject the database and I don't have to care about the rest of Drupal. Just a little bit of stuff that I'm actually interested in. Going, going, colon. Thank you so much guys. I'm gonna be in the sprint rooms tomorrow morning. If you guys wanna actually dig into this stuff, look at like how do we test modules and stuff like that. Just come find me and I'm happy to help. Also, if you follow me on Twitter, I'm gonna be putting out a whole series where we go into the details of prophecy, how you do mocking, how you inject dependencies, stuff like that. And I'll let you know as soon as I put those out.